php5-fpm: máy chủ đạt pm.max_children


41

Tôi có Nginx + php5-fpm . Một vài lần mỗi giờ trang web của tôi bị treo và trong logfile tôi thấy như sau:

CẢNH BÁO: Máy chủ [pool www] đạt cài đặt pm.max_children (5), xem xét nâng cao nó.

/etc/php5/fpm/pool.d/www.conf tệp chứa cấu hình sau:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Máy chủ: AMD Opteron ™ 3280, Octo-Core, 8x 2.4 GHz, 16 GB DIMM (DDR3).

Tôi không biết tôi nên đặt những con số nào trong tập tin www.conf cho máy chủ này. Tôi có thể giúp ai đó không? Cảm ơn

Câu trả lời:


40

Có nhiều lý do có thể khiến PHP-FPM của bạn đạt được max_children. Những cái phổ biến nhất là:

  • Rất nhiều yêu cầu song song từ khách hàng của bạn
  • Thực thi chậm các tập lệnh PHP
  • Cài đặt rất thấp của max_children

Nhìn vào thông số kỹ thuật của máy, giả sử không có gì khác ngoài PHP + Nginx đang chạy, tôi nghĩ bạn có thể đặt nó cao hơn nhiều so với 5. Bạn nói rằng bạn có 8 lõi, thường thì Nginx cần CPU ít hơn nhiều so với PHP, vì vậy với 5 trẻ em bạn có thể sẽ không bao giờ có thể sử dụng tất cả chúng. Tôi thường đặt nó thành một số thứ như số lõi x 2 hoặc số lõi x 4 , tùy thuộc vào mức tiêu thụ bộ nhớ của các tập lệnh PHP của bạn.


Đây là một trang web hẹn hò với trò chuyện php và người dùng gửi hàng triệu tin nhắn tức thời. Đêm qua khi tôi có ~ 300 người dùng trực tuyến, lệnh netstat -an | grep 80 | wc - kết quả là gần 400.
user1821484 16/2/13

1
Tôi thực sự có một trang web hẹn hò tương tự. Tôi nghĩ bạn chắc chắn cần nhiều trẻ em PHP hơn. Cấu hình của tôi như sau: 20k người dùng trực tuyến đồng thời, 12 máy PHP với 8 lõi mỗi máy, 32 công nhân trên mỗi máy PHP. Điều đó làm việc khá tốt. Bạn cũng nên xem bạn có bao nhiêu bộ nhớ trống, tôi nghi ngờ bạn có một ít, trừ khi PHP của bạn rất lớn. Nếu bạn có bộ nhớ trống, tại sao không sử dụng nó cho một số công nhân nữa?
phát lại

@ user1821484 Điều này đúng; pm.max_childrenquá thấp . Giá trị 10 là hợp lý đối với máy chủ VPS nhỏ có RAM 1GB; bạn có một máy chủ lớn hơn nhiều Tăng giá trị này cho đến khi bạn ngừng nhận lỗi, sau đó tăng lại trong trường hợp bạn nhận được lưu lượng truy cập tăng đột biến.
Michael Hampton

Cảm ơn câu trả lời. Tôi đã tăng cài đặt pm.max_children lên 10 và bây giờ tôi bắt đầu gặp lỗi này: CẢNH BÁO: [pool www] có vẻ bận (bạn có thể cần tăng pm.start_servers hoặc pm.min / max_spare_servers), sinh ra 16 trẻ em, có 0 nhàn rỗi, và 8 đứa trẻ Ai đó có thể gợi ý cho tôi những gì tôi cần tăng? Cảm ơn.
dùng1821484

lõi x 2 hoặc lõi x 4 âm thanh thực sự thấp đối với tôi. Tôi có một máy có 8 lõi và RAM 8GB với pm.max_children = 48 và chúng tôi vẫn nhận được máy chủ đạt được cảnh báo pm.max_children . Máy này không ở gần giới hạn CPU hoặc bộ nhớ của nó. Một cách tiếp cận tốt hơn tôi nghĩ sẽ là tối ưu hóa cài đặt này kết hợp với các cài đặt nginx (hoặc apache) tương ứng và chọn một giá trị sau khi xác định mỗi bộ xử lý PHP tiêu thụ bao nhiêu bộ nhớ.
S. Imp

18

Tôi thấy rằng bằng cách đặt giá trị pm.max_Vquests (được nhận xét theo mặc định) đã giúp khắc phục các lỗi này. Cài đặt này buộc các yêu cầu con phải hồi sinh sau khi thực hiện một số yêu cầu nhất định và có thể hữu ích nếu có rò rỉ bộ nhớ ở đâu đó trong mã của bạn hoặc libs của bên thứ 3.

Trong /etc/php-fpm.d/www.conf :

pm.max_requests = 500

13

Liên kết này có thể hữu ích - nó giải thích cách tính số lượng tiến trình con dựa trên số lượng bộ nhớ trên hệ thống:


7
Câu trả lời này sẽ vô dụng khi liên kết đó biến mất.
miken32

2
Về cơ bản, liên kết cho biết ... Giá trị phù hợp cho pm.max_children có thể được tính là: pm.max_children = Tổng RAM dành riêng cho máy chủ web / Kích thước quy trình con tối đa
jaywhy13
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.