Hướng dẫn cấu hình tối ưu PHP-FPM

I. PHP-FPM là gì

PHP-FPM (FastCGI Process Manager) là một trình quản lý PHP thay thế cho FastCGI, với các tính năng bổ sung để có thể tối ưu cho các website có lượng truy cập lớn. Ưu điểm chính của PHP-FPM là nó sử dụng ít tài nguyên hơn so với bất kỳ giải pháp chạy PHP nào khác, qua đó quản lý hiệu quả tài nguyên và giúp tăng tốc website.

Trong nhiều trường hợp, việc tối ưu không tốt PHP-FPM không tốt có thể khiến server bị giới hạn khả năng chịu tải, trong khi vẫn dư thừa tài nguyên. Cụ thể hơn, Quý khách có thể thấy xuất hiện những lỗi như sau trong error log của PHP-FPM:

[05-Feb-2020 08:28:31] WARNING: [pool www] server reached pm.max_children setting (10), consider raising it
[05-Feb-2020 08:28:31] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 9 total children

Thông báo này có nghĩa là PHP-FPM đang bận và không thể xử lý lưu lượng truy cập cao với các tham số cấu hình hiện có.

PHP-FPM có thể dẫn đến quá tải máy chủ do nhiều lý do:

  • Quá nhiều tiến tình chạy do lưu lượng truy cập cao hoặc bị tấn công
  • Cấu hình PHP-FPM không được tối ưu so với tài nguyên của máy chủ

II. Tối ưu PHP-FPM

  1. Thông số máy chủ

    • Đầu tiên, hãy xác định lại thông số máy chủ của bạn. Số core CPU và kích thước bộ nhớ RAM hiện có của server, lượng tài nguyên sẽ sử dụng cho PHP-FPM.
    • Ví dụ: giả sử bạn có 4vCPU và RAM 16 GB
      Trong bài viết này, chúng tôi sẽ sử dụng 10 GB RAM để phân bổ cho hoạt động PHP.
  2. Tính dung lượng RAM tiêu thụ của mỗi tiến trình PHP-FPM

    • Thực thi lệnh sau để kiểm tra dung lượng RAM mà mỗi tiến trình PHP-FPM đang sử dụng.
      ps -ylC php-fpm7.3 --sort:rss

      Thay thế với đúng tên phiên bản PHP đang sử dụng.

    • Kết quả nhận được sẽ giống như bên dưới:
      S UID PID  PPID C PRI NI RSS    SZ     WCHAN TTY TIME      CMD 
      S 0   9030 1    0 80  0  31244  120002 -     ?   00:00:05  php-fpm7.3 
      S 33  7511 9030 1 80  0  130636 148827 -     ?   00:00:04  php-fpm7.3 
      S 33  7479 9030 2 80  0  133724 150336 -     ?   00:00:16  php-fpm7.3 
      S 33  7504 9030 2 80  0  136272 150365 -     ?   00:00:08  php-fpm7.3
    • Hãy lưu ý các giá trị bên dưới cột RSS. Đây là bộ nhớ được sử dụng bởi mỗi tiến trình PHP-FPM của bạn. Như trên, chúng ta có trung bình khoản 150 MB RAM được sử dụng cho mỗi tiến trình con PHP-FPM.
  3. Cấu hình PHP-FPM

    • File cấu hình PHP-FPM
      php -i | grep php.ini

      Đường dẫn có thể sẽ khác tùy thuộc vào phiên bản php. Có 4 giá trị chúng ta cần lưu ý khi cấu hình php-fpm, bao gồm:

      • pm.max_children
      • pm.start_servers
      • pm.min_spare_servers
      • pm.max_spare_servers
    • pm.max_children
      Giá trị max_children nên được tính bằng cách lấy tổng dung lượng bộ nhớ RAM sử dụng cho PHP-FPM chia cho dung lượng ram tiêu thụ trung bình cho mỗi tiến trình PHP-FPM (2).
      Ví dụ: trong bài hướng dẫn này, chúng ta có 10 GB RAM (10000 MB) phân bổ cho mỗi tiến trình 150 MB, nên:

       pm.max_children = 10000 / 150 ~ 67
    • pm.start_servers
      Giá trị start_servers nên được tính bằng cách lấy số core CPU nhân với 4.
      Ví dụ: trong hướng dẫn này, số core của server là 4, nên:

      pm.start_servers = 4 x 4 = 16
    • pm.min_spare_servers
      Giá trị min_spare_servers nên được tính bằng cách lấy số core CPU nhân với 2.
      Ví dụ:  trong môi trường hướng dẫn này:

      pm.min_spare_servers = 4 x 2 = 8
    • pm.max_spare_servers
      Giá trị max_spare_servers cũng nên được tính bằng lấy số lượng core CPU nhân với 4.
      Ví dụ: trong môi trường bài hướng dẫn này:

      pm.max_spare_servers = 4 x 4 = 16
    • Chúng ta được kết quả cuối cùng:
      pm.max_children = 67 
      pm.min_spare_servers = 8 
      pm.max_spare_servers = 16 
      pm.start_servers = 16
  4. Lưu lại và khởi động lại dịch vụ  PHP-FPM:
    sudo service php7.3-fpm restart

Như vậy Long Vân đã hướng dẫn Quý khách cách tối ưu cho PHP-FPM. Chúc Quý khách thành công.