Tôi hiện đang có một máy chủ Apache2 chạy cùng mpm-prefork
và mod_php
trên VPS OpenVZ với RAM thực 512M / 1024M (không trao đổi). Sau khi chạy một số thử nghiệm, tôi thấy rằng kích thước quy trình tối đa mà Apache nhận được là 23M, vì vậy tôi đã đặt MaxClients
thành 25 (23M x 25 = 575 MB, đối với tôi). Tôi quyết định chạy một số thử nghiệm tải trên máy chủ của mình và kết quả khiến tôi hoang mang.
Tôi đang sử dụng ab
trên máy tính để bàn của mình yêu cầu trang chính từ blog wordpress.
Khi tôi chạy ab
với 24 kết nối đồng thời, mọi thứ có vẻ ổn. Chắc chắn, CPU tăng, RAM miễn phí giảm và kết quả là khoảng 2-3 giây thời gian phản hồi cho mỗi yêu cầu.
Nhưng nếu tôi chạy ab
với 25 kết nối đồng thời (giới hạn máy chủ của tôi), Apache sẽ bị treo sau vài giây. Nó bắt đầu xử lý các yêu cầu, sau đó nó dừng đáp ứng, CPU quay trở lại 100% không hoạt động và ab
hết thời gian. Nhật ký Apache cho biết nó đã đạt được MaxClients
.
Khi điều này xảy ra, Apache sẽ tự khóa với 25 quy trình đang chạy (tất cả đều ở trạng thái "W" nếu tôi kiểm tra trạng thái máy chủ) và chỉ sau khi TimeOut
cài đặt, các quy trình bắt đầu chết và máy chủ bắt đầu phản hồi lại (trong trường hợp của tôi, nó được thiết lập đến 45).
Câu hỏi của tôi: đó là hành vi dự kiến? Tại sao Apache chỉ chết khi nó đạt đến MaxClients
? Nếu nó hoạt động với 24 kết nối, liệu nó có hoạt động với 25 kết nối không, chỉ mất nhiều thời gian hơn để trả lời từng yêu cầu và xếp hàng còn lại?
Nghe có vẻ lạ đối với tôi rằng bất kỳ đứa trẻ nào đang chạy ab
đều có thể giết một máy chủ web chỉ bằng cách đặt các kết nối đồng thời tới các máy chủ MaxClients
.