Score:1

PHP-FPM + nginx - พูลไม่ว่างและปรับให้เหมาะสมสำหรับโค้ด PHP ที่ไม่ดี - ข้อผิดพลาด 502

ธง br

ฉันเคยอยู่ในสถานการณ์ที่ไม่สามารถให้ 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 เกือบทั้งหมดที่นี่เกี่ยวกับข้อผิดพลาดของเซิร์ฟเวอร์และเอกสารจำนวนมาก แต่ก็ยังไม่ได้รับ ที่นี่หวังว่าบางคนสามารถชี้ทิศทางที่ถูกต้องให้ฉันได้

ขอบคุณ

Wilson Hauck avatar
jp flag
โปรดขอข้อมูลเพิ่มเติม อุปกรณ์ SSD หรือ NVME ใด ๆ บนเซิร์ฟเวอร์โฮสต์ MySQL? โพสต์บน pastebin.com และแชร์ลิงก์ จากรูทการเข้าสู่ระบบ SSH ของคุณ ผลลัพธ์ข้อความของ: ก) เลือก COUNT(*) จาก information_schema.tables; B) แสดงสถานะทั่วโลก; หลังจาก UPTIME ขั้นต่ำ 24 ชั่วโมง C) แสดงตัวแปรทั่วโลก; D) แสดงรายการกระบวนการทั้งหมด; และข้อมูลที่เป็นประโยชน์มาก ได้แก่ - htop หรือ top สำหรับแอพที่ใช้งานมากที่สุด ulimit -a สำหรับรายการลิมิตของ Linux/Unix iostat -xm 5 3 สำหรับ IOPS ตามอุปกรณ์และจำนวนคอร์/ซีพียู สำหรับการวิเคราะห์การปรับแต่งเวิร์กโหลดของเซิร์ฟเวอร์เพื่อให้คำแนะนำ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา