Thiết lập của tôi: Tôi có 3 máy chủ web gần như giống hệt nhau phục vụ cùng một trang web động được tải cao với cân bằng tải đơn giản trên dns. Dịch vụ này đã hoạt động được hơn hai năm với cùng một cấu hình apache: apache2, php5, ub Ubuntu 8.04 linux 2.6.24-29-server.
Vấn đề của tôi: Từ khoảng hai tuần trước, tôi gặp vấn đề với cấu hình này. Gần như mỗi ngày tôi có một khoảnh khắc nhỏ trong khoảng 5 phút, trong đó trang web không thể truy cập được. Tôi vẫn có thể đăng nhập vào máy chủ qua ssh. Nếu tôi chạy htop
, tôi thấy máy chỉ đơn giản là không làm gì cả. Tôi có khoảng 1000 tiến trình apache đang chạy, nhưng không có hoạt động cpu.
Tôi đã sử dụng mod_status apache để gỡ lỗi tình huống này. Bảng điểm quá trình trông như thế này:
_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
Vì vậy, hầu hết các quá trình chỉ chờ kết nối. sau khoảng 5 phút, tình hình sẽ trở lại bình thường: tôi có rất ít quy trình trên mọi máy, hầu hết các công nhân đều có trạng thái "." - (có nghĩa là họ đang mở để xử lý yêu cầu) và tất nhiên trang web có thể truy cập được!
Vì vậy, tôi đang cố gắng tìm một cái gì đó trong nhật ký, nhưng đơn giản là không có gì ... nhật ký truy cập apache im lặng trong khoảng 4 phút, tương tự đối với nhật ký lỗi. tôi cũng không thể tìm ra bất cứ điều gì sai trong nhật ký hệ thống khác.
tình hình là như nhau trên cả 3 máy chủ web (tất cả chúng đều có điều kiện tải cực đại và không phản hồi này cùng một lúc), vì vậy tôi không cho rằng đây là liên quan đến phần cứng. nhưng tôi nghĩ rằng, điều này có thể liên quan đến một số vấn đề mạng (tcp).
có ý kiến gì không
EDIT: một số thông tin khác, mà tôi vừa khám phá:
Nó vừa xảy ra một lần nữa và tôi đã có thể xác minh rằng tôi cũng không thể kết nối cục bộ khi sự cố này xảy ra.
Tôi đã thực hiện một số thống kê kết nối với lệnh sau đây sau khi nó xảy ra: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
- 109 CLOSE_WAIT
- 2652 THÀNH LẬP
- 2 FIN_WAIT1
- 11 LẦN_ACK
- 12 NGHE
- 91 SYN_RECV
- 1 ĐỒNG HỒ
- 16 TIME_WAIT
Nếu tôi thực hiện cùng một lệnh một thời gian sau, tôi có một cái gì đó như thế này:
- 4 ĐÓNG
- 108 THÀNH LẬP
- 18 FIN_WAIT1
- 182 FIN_WAIT2
- 37 LẦN_ACK
- 12 NGHE
- 50 SYN_RECV
- 11276 TIME_WAIT
Vì vậy, trong tình huống bình thường, tôi chỉ có 100-200 kết nối mở bởi các khách hàng bị xử lý bởi apache trong thời điểm này. Khi tôi gặp "sự cố" này, tôi có nhiều kết nối hơn. Cách tốt nhất để phân tích này là gì?
EDIT2: các dòng quan trọng trong apache2.conf là:
KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit 920
StartServers 30
MinSpareServers 80
MaxSpareServers 120
MaxClients 920
MaxRequestsPerChild 700
</IfModule>
Nó là một prefork2 apache2 với php_mod.
Máy chủ có ram 8GB và phân vùng trao đổi 4gb.
tcpdump
) sẽ giúp bạn tìm hiểu gốc rễ của vấn đề ... btw chính sách sử dụng bộ nhớ và tường lửa của bạn là gì?