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