ฉันเคยอยู่ในสถานการณ์ที่ไม่สามารถให้ PHP-FPM ทำงานให้ฉันได้ แม้ว่าจะมีทราฟฟิกเพิ่มขึ้นเล็กน้อยก็ตาม ได้พยายามติดตามสาเหตุที่แท้จริงมาระยะหนึ่งแล้วและยังไม่สำเร็จ
มันเริ่มต้นด้วยไซต์เฉพาะที่ให้ข้อผิดพลาด 502 ดูบันทึก PHP-fpm ฉันได้รับสิ่งนี้:
คำเตือน: [pool www-userA] ดูเหมือนจะไม่ว่าง (คุณอาจต้องเพิ่ม pm.start_servers หรือ pm.min/max_spare_servers) วางไข่ 8 ลูก มี 39 ลูกที่ไม่ได้ใช้งาน และลูกทั้งหมด 49 ลูก
ต่อไป ฉันตรวจสอบทรัพยากรเซิร์ฟเวอร์ ด้านบนบอกว่าเกือบ 0 โดยใช้ทรัพยากรเพียง 2-4% ถัดไปคือการปรับแต่งพูล PHP-FPM :
pm = ไดนามิก
pm.max_children = 800
pm.process_idle_timeout = 5 วินาที
pm.start_servers = 40
pm.min_spare_servers = 40
pm.max_spare_servers = 80
pm.max_requests = 500
php_admin_value[max_execution_time] = 60
;เพิ่มในภายหลังเพื่อแก้ไขปัญหาเพิ่มเติม
request_slowlog_timeout = 5 วินาที
slowlog = /var/log/pool_userA_fpm_slow_log
เพิ่มในภายหลังเพื่อชดเชยหากมีปัญหาคิวสำหรับการแก้ไขปัญหา
ฟัง. backlog = 24000
ฉันเคยเกือบโพสต์ PHP-FPM ที่เกี่ยวข้องกับหัวข้อนี้รวมถึง:
https://stackoverflow.com/questions/25097179/warning-pool-www-seems-busy-you-may-need-to-increase-pm-start-servers-or-pm
เซิร์ฟเวอร์นี้มี RAM ประมาณ 12GB และโปรเซสเซอร์ 8 คอร์สำหรับ nginx+php-fpm เท่านั้น
แต่ละกระบวนการ PHP ของฉันแต่ละกระบวนการประมาณ 15-20MB
พยายามเพิ่มขึ้น pm.max_children = 1500
แต่หลังจากนั้นไม่นานก็พบข้อผิดพลาดเดิมอีกครั้งสำหรับ "Pool being Busy"
ฉันเปิดใช้งาน slowlog ใน php-fpm และเปิดใช้งาน slow log สำหรับ mysql
- ในบันทึกช้าของ php-fpm ฉันพบหน้า php สองสามหน้าใช้เวลาประมาณ 5 วินาทีจึงจะเสร็จสมบูรณ์
- ใน mysql slow log พบข้อความค้นหาบางรายการที่ตรวจสอบ 2-5 ล้านแถว (ใช้เวลาประมาณ 5 วินาทีจึงจะเสร็จสมบูรณ์)
สันนิษฐานว่าสคริปต์ PHP อาจทำให้เกิดคิวหรืองานค้าง ดังนั้นฉันจึงเพิ่ม ฟัง. backlog = 24000
เช่นเดียวกับใน /etc/security/limits.conf ได้เพิ่มขีด จำกัด แบบอ่อนและแบบแข็งสำหรับผู้ใช้รายนี้โดยเฉพาะเพื่อให้มีที่ว่างสำหรับสคริปต์ที่ช้า
userA ซอฟต์โนไฟล์ 4096
userA ฮาร์ดโนไฟล์ 65536
เพิ่มเติมใน sysctl เช่น
echo "net.core.somaxconn=65536" >> /etc/sysctl.conf
เพิ่มเติมใน php-fpm master php-fpm.conf ที่เพิ่มเข้ามา เช่น สระว่ายน้ำด้านนอก conf:
rlimit_files=65536
rlimit_core = 0
ของฉัน อุลิมิต -Hn
พูดว่า:
524288
นอกจากนี้ เนื่องจาก php-fpm เริ่มยุ่ง ฉันพบว่าฉันสามารถเพิ่มคำสั่งต่อไปนี้ใน php-fpm เพื่อเริ่มต้นใหม่ในกรณีที่งานยุ่ง แต่มันไม่เกิดขึ้น ฉันต้องรีสตาร์ท php-fpm ด้วยตนเองเพื่อให้ไซต์ทำงานได้อีกครั้ง :
[ทั่วโลก]
ฉุกเฉิน_restart_threshold10
emergency_restart_interval 1 ม
process_control_timeout 10 วินาที
ดังที่ได้กล่าวไปแล้ว คำสั่งข้างต้นจะไม่ทำการรีสตาร์ทในกรณีที่พูลมีข้อผิดพลาดไม่ว่างใน php-fpm.log
จนถึงตอนนี้ฉันเดาว่าเนื่องจากสคริปต์ PHP ที่ช้า php-fpm ลูกของฉันกำลังหมดลงและทำให้เกิดข้อผิดพลาด 502 ฉันไม่สามารถควบคุม PHP ได้ และฉันต้องนำเสนอโซลูชันโดยการปรับการกำหนดค่าเซิร์ฟเวอร์สำหรับมัน
ฉันพยายามเพิ่มขึ้น pm.max_children = 2000
แต่ยังคงเป็นปัญหาเดียวกัน บางครั้งได้รับ 504 เกตเวย์หมดเวลา
ข้อผิดพลาด
ในอีกด้านหนึ่ง ถ้าฉัน เปลี่ยน pm = ออนดีมานด์
ฉันได้รับการแจ้งให้ทราบดังต่อไปนี้ก่อน:
Listen.backlog(25000) ต่ำเกินไปสำหรับตัวจัดการกระบวนการตามความต้องการ ฉันอัปเดตให้คุณเป็น 65535
ต่อมาได้รับข้อผิดพลาดนี้และอีกครั้งข้อผิดพลาด 504 ครั้งนี้:
[11-พ.ย.-2021 06:56:45] คำเตือน: เซิร์ฟเวอร์ [pool userA] ถึงการตั้งค่า max_children (800) ให้พิจารณาเพิ่ม
สิ่งหนึ่งที่ควรทราบคือแทบไม่มีการโหลดบนเซิร์ฟเวอร์ในทุกกรณี มีการใช้ทรัพยากร 2-4% ดังนั้นฉันเดาว่ามันเป็นปัญหาการกำหนดค่ามากกว่าการใช้ทรัพยากร
ฉันเคยไปที่หัวข้อที่เกี่ยวข้องกับ PHP-FPM เกือบทั้งหมดที่นี่เกี่ยวกับข้อผิดพลาดของเซิร์ฟเวอร์และเอกสารจำนวนมาก แต่ก็ยังไม่ได้รับ ที่นี่หวังว่าบางคนสามารถชี้ทิศทางที่ถูกต้องให้ฉันได้
ขอบคุณ