PHP: Process Manager (FPM) performance

Byphunsanit

PHP: Process Manager (FPM) performance

การตั้งค่า PHP-FPM Process Manager (pm) เป็นส่วนที่สำคัญที่สุดในการรีดประสิทธิภาพของ Web Server โดยเฉพาะการจัดการ Child Processes เพื่อให้รองรับ Traffic ได้เหมาะสมกับ RAM ที่มีอยู่

โหมดของ Process Manager (pm)

  • Static: สร้าง Process รอไว้คงที่ตามจำนวนที่ระบุ (เร็วที่สุดเพราะไม่ต้องรอสร้าง process ใหม่ แต่กิน RAM ตลอดเวลา)
  • Dynamic: ปรับเพิ่ม-ลด Process ตามการใช้งานจริง (สมดุลที่สุด เหมาะกับเว็บทั่วไป)
  • On-demand: จะสร้าง Process ก็ต่อเมื่อมีการเรียกใช้งานเท่านั้น (ประหยัด RAM สุดๆ เหมาะกับเว็บที่แทบไม่มีคนเข้า)

พารามิเตอร์

Parameterความหมาย
pm.max_childrenจำนวน Process สูงสุดที่ยอมให้มีได้ (สำคัญที่สุด)
pm.start_serversจำนวน Process ที่ให้สร้างทันทีเมื่อ Start PHP-FPM
pm.min_spare_serversจำนวน Process ว่างขั้นต่ำที่ต้องสแตนด์บายรอ
pm.max_spare_serversจำนวน Process ว่างสูงสุดที่ยอมให้มี (ถ้าเกินจะถูกฆ่าทิ้ง)
pm.max_requestsจำนวน Request ที่ Process หนึ่งจะรับก่อนจะ Restart ตัวเอง (ช่วยแก้ปัญหา Memory Leak)

วิธีการคำนวณค่าที่เหมาะสม

  1. เปลี่ยน 8.x เป็นเวอร์ชันที่ใช้งาน เช่น php8.4-fpm หรือ php8.5-fpm
  2. หาขนาด RAM เฉลี่ยของ 1 PHP Process โดยใช้คำสั่ง
    ps -ylC php-fpm8.x --sort:rss
  3. ใช้สูตรคำนวณ
    Max Children = (RAM ทั้งหมด – RAM ที่ระบบอื่นใช้) / ขนาด RAM ต่อ 1 PHP Process
    1. RAM ทั้งหมด: เช่น 4GB (4096MB)
    2. เผื่อให้ OS และ MySQL: 1GB (1024MB)
    3. เหลือให้ PHP: 3GB (3072MB)
    4. จากข้อ 1 สมมุติ PHP 1 Process กิน RAM: 50MB
    5. ผลลัพธ์: 3072 / 50 = 61 (คือค่า pm.max_children ที่เหมาะสม)
  4. แก้โดย
    sudo nano /etc/php/8.x/fpm/pool.d/www.conf
  5. test โดย
    sudo php-fpm -t
    ถ้าตอบประมาณ
    NOTICE: configuration file /etc/php/8.x/fpm/php-fpm.conf test is successful
    แปลว่าสำเร็จ
  6. การ Restart หรือ Reload PHP-FPM
    • การ Reload (แนะนำ)
      sudo systemctl reload php8.x-fpm
    • การ Restart
      sudo systemctl restart php8.x-fpm
  7. ตรวจสอบสถานะหลัง Restart
    • เช็กสถานะ Service
      sudo systemctl status php8.x-fpm
    • ดู Log ล่าสุด (กรณีที่ Start ไม่ติด)
      sudo tail -f /var/log/php8.x-fpm.log

/etc/php/8.x/fpm/pool.d/www.conf

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

เป็นวิธีที่ทำให้ PHP-FPM ทำงานได้โดยรอบรับ user พร้อม ๆ มากที่สุด

อ่านเพิ่มเติม

About the author

phunsanit administrator