Cách ngăn PHP-FPM chiếm quá nhiều RAM, CPU trong Linux

Tác giả NetworkEngineer, T.Ba 22, 2022, 05:53:48 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 3 Khách đang xem chủ đề.

Cách ngăn PHP-FPM chiếm quá nhiều RAM, CPU trong Linux


Nếu bạn đã triển khai LEMP Stack ( Linux, NGINX, MySQL/MariaDB và PHP), thì có thể bạn đang sử dụng FastCGI proxy trong NGINX (như một máy chủ HTTP), để xử lý PHP. PHP-FPM (từ viết tắt của FastCGI Process Manager) là một triển khai PHP FastCGI thay thế hiệu suất cao và được sử dụng rộng rãi.

1. Cách kiểm tra PHP-FPM chiếm quá nhiều RAM, CPU trong Linux

Gần đây, tất cả các trang web PHP của khách hàng của mình trên một trong các máy chủ web LEMP trở nên chậm chạp và cuối cùng ngừng phản hồi khi đăng nhập vào máy chủ. Mình phát hiện ra rằng hệ thống sắp hết RAM: PHP-FPM đã tiêu thụ gần hết RAM, như được chỉ ra trong ảnh chụp màn hình sau (sử dụng Glances - công cụ giám sát hệ thống ).

Mã nguồn [Chọn]
$ glances

Trong bài viết này, mình sẽ hướng dẫn cách ngăn PHP-FPM tiêu thụ quá nhiều hoặc tất cả bộ nhớ hệ thống RAM của bạn trong Linux. Ở phần cuối của hướng dẫn này, bạn sẽ học cách giảm mức tiêu thụ bộ nhớ PHP-FPM từ 50% trở lên.

2. Giảm mức sử dụng bộ nhớ RAM của PHP-FPM

Sau khi thực hiện một số nghiên cứu trên Internet, mình phát hiện ra rằng mình cần phải cấu hình lại trình quản lý tiến trình PHP-FPM và một số khía cạnh của nó để giảm mức tiêu thụ bộ nhớ của PHP-FPM trong tập tin cấu hình chung.

Nhóm mặc định là www và tập tin cấu hình của nó được đặt tại /etc/php-fpm.d/www.conf (trên CentOS/RHEL/Fedora) hoặc /etc/php/7.4/fpm/pool.d/www.conf (trên Ubuntu/Debian/Mint).

Mã nguồn [Chọn]
$ sudo vim /etc/php-fpm.d/www.conf             [trên CentOS/RHEL/Fedora]
Mã nguồn [Chọn]
$ sudo vim /etc/php/7.4/fpm/pool.d/www.conf    [trên Ubuntu/Debian/Mint]
Tìm các lệnh sau và đặt giá trị của chúng cho phù hợp với trường hợp sử dụng của bạn. Đối với các chỉ thị được nhận xét ra ngoài, bạn cần bỏ ghi chú chúng.

Mã nguồn [Chọn]
pm = ondemand
pm.max_children = 80
pm.process_idle_timeout = 10s
pm.max_requests = 200

Để mình giải thích ngắn gọn các chỉ thị trên và giá trị của chúng. Chỉ thị pm xác định cách người quản lý tiến trình sẽ kiểm soát số lượng tiến trình con. Phương thức mặc định là động, có nghĩa là số lượng con (tiến trình con) được đặt động tùy thuộc vào một số chỉ thị khác bao gồm pm.max_children, xác định số lượng con tối đa có thể tồn tại cùng một lúc.

Trình quản lý tiến trình lý tưởng nhất là lược đồ ondemand trong đó không có tiến trình con nào được tạo khi khởi động nhưng được tạo ra theo yêu cầu. Các tiến trình con chỉ được chia nhỏ khi các yêu cầu mới sẽ kết nối dựa trên pm.max_childrenpm.process_idle_timeout xác định số giây mà sau đó một tiến trình không hoạt động sẽ bị hủy.

Cuối cùng nhưng không kém phần quan trọng, chúng ta cần đặt tham số pm.max_requests để xác định số lượng yêu cầu mà mỗi tiến trình con sẽ thực hiện trước khi sinh sản lại. Lưu ý rằng tham số này cũng có thể được sử dụng như một giải pháp thay thế cho việc rò rỉ bộ nhớ trong thư viện của bên thứ ba.