Fix Config PHP-FPM for high 100% CPU

For php-fpm default any linux core:

#https://thisinterestsme.com/php-fpm-settings/
pm = static # Good for high traffics
pm.max_children = 25
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 1000

Hướng dẫn cài đặt PHP-FPM. max_servers, min_servers, v.v.

Một ngày nọ, tôi đang tìm kiếm các bài viết và thủ thuật về cách tinh chỉnh cài đặt www.conf của PHP FPM .

Điều khiến tôi thất vọng là tài liệu chính thức không đưa ra bất kỳ khuyến nghị nào. Hơn nữa, không có nhiều hướng dẫn về chủ đề này.

Sau khi xem qua nhiều cuộc thảo luận và bài đăng trên blog khác nhau, tôi đã thu thập được các thông tin sau.

Bạn cần biết ba điều về máy chủ của mình trước khi thay đổi cài đặt của PHP FPM.

  1. Máy chủ của bạn có bao nhiêu lõi?

  2. Dung lượng bộ nhớ (RAM) trên máy chủ của bạn.

  3. Quá trình PHP trung bình tiêu thụ bao nhiêu bộ nhớ trên máy chủ của bạn?

Máy chủ của bạn có bao nhiêu lõi?

Để biết máy chủ của bạn có bao nhiêu lõi, hãy chạy lệnh sau:

echo Lõi = $(( $(lscpu | awk '/^Socket/{ print $2 }') * $(lscpu | awk '/^Core/{ print $4 }') ))

Khi chạy lệnh Linux ở trên, bạn sẽ nhận được thông báo như “Cores = 4”.

Hãy viết con số đó xuống vì nó quan trọng.

Máy chủ của bạn có bao nhiêu bộ nhớ?

Bạn hẳn đã biết máy chủ của bạn có bao nhiêu bộ nhớ.

Câu hỏi thực sự ở đây là: Bạn muốn cung cấp bao nhiêu bộ nhớ cho PHP?

Bạn phải tính đến thực tế là máy chủ của bạn cũng có thể đang chạy NGINX, Apache hoặc MySQL. Các quá trình khác này tiêu tốn bao nhiêu bộ nhớ? Nếu bạn có 8GB RAM và các quy trình khác trên máy của bạn đang tiêu thụ 2GB, thì bạn còn lại 6GB.

Hoặc 5 GB nếu bạn muốn chơi an toàn và để lại một ít miễn phí.

Xác định dung lượng bộ nhớ bạn muốn cung cấp cho PHP và ghi lại điều đó. Trong trường hợp của tôi, tôi có 4GB để có thể phân bổ cho PHP.

Trung bình mỗi tiến trình PHP tiêu tốn bao nhiêu bộ nhớ?

Điều này sẽ phụ thuộc vào ứng dụng và phiên bản PHP của bạn. Các phiên bản PHP cũ hơn có xu hướng tiêu tốn nhiều bộ nhớ hơn PHP 7.

Chạy lệnh bên dưới để có ý tưởng chung về lượng bộ nhớ mà mỗi quy trình PHP FPM đang tiêu thụ.

ps --no-headers -o "rss,cmd" -C php-fpm7.2 | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

Lưu ý rằng lệnh trên đang tìm kiếm một quy trình có tên php-fpm7.2. Quá trình PHP trên máy chủ của bạn có thể được gọi là gì đó khác.

Để tìm ra tên của quy trình PHP của bạn, hãy sử dụng lệnh top . Khi chạy lệnh top, có thể bạn sẽ thấy một trong các tiến trình sau:

  • php-fpm

  • php5-fpm

  • php7.0-fpm

  • php7.1-fpm

  • php7.2-fpm

Khi tôi chạy lệnh trên, tôi nhận được 29M.

Nói cách khác, mỗi tiến trình php-fpm7.2 trên máy chủ của tôi tiêu tốn khoảng 29MB RAM.

Các cài đặt cấu hình.

Bây giờ tôi có ba thông tin quan trọng.

  • Máy chủ của tôi có 4 lõi.

  • Tôi có thể phân bổ khoảng 4GB RAM cho PHP.

  • Mỗi quy trình PHP FPM trên máy chủ của tôi tiêu tốn khoảng 29 MB bộ nhớ. Trên các phiên bản PHP cũ hơn, có thể bạn sẽ thấy mỗi tiến trình tiêu tốn nhiều hơn thế. Tôi đã đạt khoảng 90 MB cho mỗi quy trình khi tôi đang chạy chính xác ứng dụng đó trên PHP 5.5.

Bây giờ là lúc chỉnh sửa tệp www.conf , nằm trong thư mục pool.d. Trên máy chủ của tôi, nó được đặt tại:

/etc/php/7.2/fpm/pool.d/www.conf

Trên máy của bạn, vị trí có thể hơi khác một chút.

Có 4 giá trị cấu hình mà chúng ta sẽ thay đổi trong tệp www.conf :

  • chiều.max_children

  • chiều.start_servers

  • chiều.min_spare_servers

  • chiều.max_spare_servers

chiều.max_children

Để có được giá trị tốt cho việc này, bạn nên lấy bộ nhớ mà bạn muốn phân bổ cho PHP FPM và chia nó cho bộ nhớ trung bình được tiêu thụ bởi mỗi quy trình PHP FPM.

Trong trường hợp của tôi, tôi muốn phân bổ 4GB (4000 MB) và mỗi quá trình tiêu tốn khoảng 29 MB.

Chia 4000 cho 29 bạn sẽ được khoảng 138.

Vì vậy tôi đặt pm.max_children thành 138.

Nếu bạn có 8000 MB dự phòng và PHP của bạn tiêu tốn khoảng 80 MB cho mỗi quy trình thì đó sẽ là: 8000/80 = 100.

chiều.start_servers

Đối với pm.start_servers, tôi nhân số lõi mà tôi có với 4.

4 x 4 = 16

Vì vậy tôi đặt pm.start_servers thành 16.

Nếu bạn có 8 lõi thì sẽ là: 4 x 8 = 32.

chiều.min_spare_servers

Đối với pm.min_spare_servers, hãy nhân số lõi bạn có với 2.

Trong trường hợp của tôi, đó là 2 x 4 = 8.

Vì vậy tôi đặt pm.min_spare_servers thành 8.

chiều.max_spare_servers

Đối với pm.max_spare_servers, hãy nhân số lõi trên máy chủ của bạn với 4.

Trên máy của tôi, đó là 4 x 4 = 16.

Vì vậy, tôi đặt pm.max_spare_servers thành 16, cùng giá trị mà tôi đã sử dụng cho pm.start_servers.

Khởi động lại PHP FPM.

Để những thay đổi này có hiệu lực, bạn sẽ cần khởi động lại PHP FPM.

dịch vụ sudo php-fpm khởi động lại    
dịch vụ sudo php5-fpm khởi động lại    
dịch vụ sudo php7.0-fpm khởi động lại 
dịch vụ sudo php7.1-fpm khởi động lại 
dịch vụ sudo php7.2-fpm khởi động lại 
dịch vụ sudo php7.3-fpm khởi động lại 
dịch vụ sudo php7.4- khởi động lại fpm

Bên dưới, tôi đã bao gồm một số lệnh khởi động lại dịch vụ có thể áp dụng cho thiết lập của bạn. Chọn đúng và chạy nó.

If you did TOP in ssh, and noticed httpd process has a high cpu load, and has been running for a long time (e.g. over 5 minutes) then you might try lowering your MaxRequestsPerChild.

vi /etc/httpd/conf/extra/httpd-mpm.conf

Now change your MaxRequestsPerChild from 1000 to 20...

<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 10
MaxSpareServers 20
ServerLimit 812
MaxClients 812
MaxRequestsPerChild 20
</IfModule>

service httpd restart

0
Subscribe to my newsletter

Read articles from Gia Công Phần Mềm directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Gia Công Phần Mềm
Gia Công Phần Mềm

Blog Vietnamese about Open Source & Outsourcing Software.