Apache tiếp cận MaxClrons và khóa máy chủ


9

Tôi hiện đang có một máy chủ Apache2 chạy cùng mpm-preforkmod_phptrê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 MaxClientsthà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 abtrê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 abvớ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 abvớ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à abhế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 TimeOutcà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.

Câu trả lời:


17

HẠ! Cuối cùng tôi đã tìm ra vấn đề. Nó liên quan đến lập trình nhiều hơn quản trị viên máy chủ, nhưng dù sao tôi cũng quyết định đặt câu trả lời vì khi tìm kiếm trên google tôi thấy tôi không phải là người duy nhất gặp vấn đề đó (và vì Apache bị treo, nên đoán đầu tiên là có vấn đề với máy chủ).

Vấn đề không nằm ở Apache, mà là với Wordpress của tôi. Cụ thể hơn với chủ đề của tôi. Tôi đang sử dụng một chủ đề có tên Lightworld và nó hỗ trợ thêm hình ảnh vào tiêu đề blog. Để cho phép điều đó, nó kiểm tra kích thước hình ảnh bằng cách sử dụng chức năng của PHP getimagesize(). Vì chức năng này đang mở một kết nối http khác đến máy chủ để lấy hình ảnh, mỗi yêu cầu từ đó ablà tạo một yêu cầu khác trong nội bộ từ PHP. Khi tôi đang sử dụng tất cả các vị trí có sẵn trên máy chủ của mình, các yêu cầu PHP này đã được đưa vào hàng đợi, nhưng Apache không bao giờ có thể nhận được chúng vì tất cả các quy trình của nó đã bị khóa với yêu cầu ban đầu đang chờ một vị trí để hoàn thành yêu cầu nội bộ PHP.

Về cơ bản, PHP đã đưa máy chủ của tôi vào trạng thái bế tắc và Apache sẽ chỉ bắt đầu hoạt động bình thường sau khi các kết nối này hết thời gian chờ đợi yêu cầu "con" của chúng.

Sau khi tôi loại bỏ chức năng này khỏi chủ đề của mình, bây giờ tôi có thể abmáy chủ của mình có nhiều kết nối đồng thời như tôi muốn và Apache đang xếp hàng chúng như mong đợi.


Cảm ơn bạn đã đăng bài này lên đây, tôi đã cố gắng tìm ra một vấn đề với các triệu chứng giống hệt nhau trong những ngày gần đây - nghĩ rằng chúng ta cũng có một bế tắc!
James Yale

Làm thế nào bạn xác định được điều này, chủ yếu quan tâm đến nhật ký và công cụ bạn đã sử dụng để xác định yêu cầu gửi đi thứ cấp.
Anirudh Goel

2

Điều đang xảy ra ở đây là bạn có 25 luồng có thể chấp nhận kết nối và bạn đang gửi 26 yêu cầu đồng thời. Yêu cầu cuối cùng nằm trong hàng đợi ổ cắm phụ thuộc vào kích thước của hồ sơ tồn đọng của bạn.

Vấn đề thứ hai là bất cứ điều gì bạn đang chạy mất 2-3 giây, đều đủ lâu để đáp ứng rằng 25 kết nối đồng thời đang làm chậm nó. ngủ (1) có thể hoạt động, nhưng, một cái gì đó trong đó bạn đang thực hiện khóa tệp hoặc khóa bảng từ mysql, mỗi yêu cầu song song có thể đang chờ trước khi hoàn thành cho đến khi chúng hết thời gian chờ 45 giây.

23mb nghe có vẻ nhỏ đối với quy trình apache với mod_php và bất kỳ mô-đun nào được tải, vì vậy, tôi nghi ngờ bạn có thể thấy các quy trình apache đó mất thêm một chút ram khi ứng dụng của bạn đang chạy. Bạn thực sự không thể làm toán với MaxCl Client và bộ nhớ như thế ... nó sẽ hơi gần, nhưng, bạn không bao giờ biết.

www-data  1495  0.1  0.9  56288 19996 ?        S    15:48   0:01 /usr/sbin/apache2 -k start
www-data  1500  0.0  0.5  49684 12436 ?        D    15:48   0:00 /usr/sbin/apache2 -k start

Có một máy, quy trình 56M và 49M.

máy khác:

www-data  7767  0.1  0.1 213732 14840 ?        S    14:55   0:08 /usr/sbin/apache2 -k start
www-data  8020  0.2  0.1 212424 13660 ?        S    14:57   0:08 /usr/sbin/apache2 -k start

máy khác:

www-data 28509  0.8  0.1 161720 10068 ?        S    14:39   0:43 /usr/sbin/apache2 -k start
www-data 28511  0.8  0.1 161932 10344 ?        S    14:39   0:43 /usr/sbin/apache2 -k start

Vì vậy, việc sử dụng bộ nhớ phụ thuộc rất nhiều vào tác vụ, các mô-đun được tải, v.v. Trong hai lần trước, tôi tin rằng chúng tôi đã vô hiệu hóa pdo & pdo_mysql vì ứng dụng đó không sử dụng chúng.

Câu hỏi thực sự là, bạn đang làm gì mà mất 3 giây? Trong thế giới ngày nay, đó là một sự vĩnh cửu và được coi là một ứng dụng 'chặn'. Apache thường sẽ không chết, nhưng, sẽ để các luồng đó trong hàng tồn đọng cho đến khi nó có thể phục vụ chúng hoặc hết thời gian chờ yêu cầu. Tôi tin rằng ứng dụng của bạn có thể gây ra apache hết thời gian. Hãy thử nó trên một trang chỉ chứa phpinfo (); và xem nếu kết quả là như nhau.


Cám ơn vì những mẹo hay! Tôi biết tôi vẫn cần tối ưu hóa nhiều thứ (tôi mới bắt đầu cấu hình máy chủ vài ngày trước và đó là trải nghiệm đầu tiên của tôi với VPS), nhưng vấn đề còn sâu sắc hơn ... Tôi đã đăng câu trả lời cho câu hỏi giải thích vấn đề trong trường hợp cụ thể của tôi là gì
Rodrigo Sieiro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.