Tối ưu cấu hình PHP-FPM để tránh tràn RAM VPS

I. Vì sao ta cần phải tối ưu ?

Đối với các dịch vụ hosting hoặc triển khai self host bằng các panel (cPanel, DirectAdmin, aaPanel, Hestia, …), nếu có nhiều lưu lượng truy cập vào website của chúng ta sẽ có thể khiến tài nguyên gói Hosting hoặc Server của mình bị tăng cao.

Nếu vượt mức cấu hình của VPS hoặc gói Hosting sẽ khiến các request tiếp theo của người dùng thật bị treo hoặc load chậm dẫn đến gián đoạn dịch vụ và trải nghiệm người dùng sẽ không tốt :(.

=> Cho nên việc tối ưu cấu hình php-fpm là một trong những cách hiệu quả để hạn chế được tình trạng này

PHP-FPM (FastCGI Process Manager) là gì?, giải thích ngắn gọn thì là trình quản lý tiến trình FastCGI cho PHP, giúp xử lý các request PHP hiệu quả hơn, đặc biệt trên các trang web có lượng truy cập lớn.

II. Các hướng cấu hình tối ưu PHP-FPM để quản lý RAM

Mục tiêu ở phần này là kiểm soát số lượng tiến trình (process) mà PHP-FPM tạo ra, vì mỗi tiến trình sẽ ngốn một lượng RAM nhất định.

Đầu tiên ta cần xác định được phiên bản php hiện tại đang dùng và mở file www.conf để thao tác cấu hình, ví dụ tôi đang dùng php 8.1 thì sẽ như sau:

nano /etc/php/8.1/fpm/pool.d/www.conf

Sau đó ta sẽ cấu hình pm (Process Manager) sang dynamic:

Tối ưu pm.max_children:

pm.max_children là số lượng tiến trình con tối đa được phép tạo. Đây là thông số quyết định trực tiếp đến việc tạo và giải phóng các pool fpm để phục vụ các request, để đảm bảo sử dụng tối ưu các process mà không bị tràn RAM thì ta cần phải cấu hình tối ưu phần này lại như sau:

  • pm.max_children = (Tổng RAM cấp cho PHP-FPM) / (RAM trung bình của 1 tiến trình PHP)

RAM trung bình của 1 tiến trình PHP: Phụ thuộc vào mã nguồn website (WordPress, Laravel,…). Bạn có thể kiểm tra thực tế trên VPS bằng lệnh Linux sau để xem trung bình một process PHP-FPM 8.1 đang ăn bao nhiêu MB RAM:

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

Lưu ý: đổi php-fpm8.1 thành phiên bản phù hợp để có thể thực thi lệnh

Tối ưu các thông số còn lại:

Khi đã có pm.max_children là 20, bạn nên tính luôn các thông số liên quan (áp dụng cho chế độ pm = dynamic):

  • pm.start_servers: Thường bằng 25% của max_children.
  • pm.min_spare_servers: Thường bằng start_servers.
  • pm.max_spare_servers: Thường bằng 50% đến 75% của max_children.

Quản lý vòng đời tiến trình:

  • pm.max_requests: Giới hạn số request mà một tiến trình con xử lý trước khi tự động khởi động lại. Giúp giải phóng RAM bị rò rỉ (mem

Ví dụ với pm.max_children = 1024 MB / 50 MB = 20.48 thì ta sẽ có cấu hình như sau:

pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500

Sau khi hoàn tất cấu hình, ta reload lại service php-fpm để nhận cấu hình mới:

systemctl reload php8.1-fpm

Vậy là ta đã hoàn tất cấu hình tối ưu lại php-fpm để tránh lãng phí RAM và gián đoạn dịch vụ. Nếu bạn có thắc mắc gì thì có thể comment bên dưới để mọi người cùng giải đáp nhé.


Vì sao cần phải tối ưu php-fpm ?

Việc cấu hình tối ưu php-fpm để các tiến trình php có thể tiếp nhận các request và xử lí hiệu quả hơn, tránh gây lãng phí tài nguyên hiện có

Công thức tính max_children ?

pm.max_children = (Tổng RAM cấp cho PHP-FPM) / (RAM trung bình của 1 tiến trình PHP)

Cách để kiểm tra một tiên trình php đang dùng bao nhiêm RAM ?

Bạn có thể chạy lệnh sau trên linux:

ps –no-headers -o “rss,cmd” -C php-fpm8.1 | awk ‘{ sum+=$1 } END { printf (“%d%s\n”, sum/NR/1024,”MB”) }’

Lưu ý: hãy thay php-fpm8.1 thành phiên bản php mà bạn đang sử dụng.

Leave a Reply