ต้องโหลด PHP-FPM ใหม่ตลอดเวลา


27

เรามีเซิร์ฟเวอร์ที่โหลดค่อนข้างมากซึ่งใช้งาน nginx และ PHP-FPM เรามี 6 เว็บไซต์บนเซิร์ฟเวอร์นี้ใช้งาน PHP-FPM และ nginx ซอฟต์แวร์เป็น vBulletin 3.8 และ WordPress ทั้งหมด ฐานข้อมูลอยู่บนเซิร์ฟเวอร์ที่แยกต่างหาก

ขณะนี้เนื่องจากเว็บไซต์เหล่านี้เป็นเว็บไซต์ที่ได้รับความนิยมอย่างสูงเราจึงมีผู้เยี่ยมชมเว็บไซต์ครั้งละ 7-8,000 คนโดยแต่ละหน้ามีการเข้าใช้ฐานข้อมูลเป็นส่วนใหญ่ ฉันเชื่อว่านี่เป็นสาเหตุของปัญหาของเรา

เนื่องจากเรามีฐานข้อมูลขนาดใหญ่จำนวนมากบนเซิร์ฟเวอร์ MySQL และเนื่องจากข้อสงสัยสามารถทำได้ดีกว่ามากในซอฟต์แวร์ฉันคิดว่า MySQL อาจล้มเหลวในการส่งคืนผลลัพธ์เป็น PHP ในเวลาที่เหมาะสมสร้างผลกระทบที่ตามมาในที่สุด ทำให้ทุกอย่างหยุดลงจนกว่าเราจะโหลด PHP-FPM ใหม่ หลังจากที่เราทำสิ่งต่าง ๆ เริ่มทำงานได้ดีอีกครั้ง

เหตุผลที่ฉันมีปัญหาในการแก้ไขปัญหานี้เป็นเพราะฉันไม่สามารถแยกแยะอะไรจากบันทึก ในบันทึกการสืบค้น MySQL ที่ช้าฉันไม่เห็นสิ่งใดที่น่าสนใจเมื่อเกิดการหยุดทำงาน ในบันทึก nginx ฉันเห็นรายการนับพันที่บอกว่าคำขอการอ่านหมดเวลาหรือการเชื่อมต่อหมดเวลา (ไปที่ PHP-FPM) และในบันทึกของ PHP-FPM ฉันเห็นหลายบรรทัดที่ระบุว่า "การดำเนินการหมดเวลา (31 วินาที) การยกเลิก

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

ตอนนี้ฉันมี crontab ให้บริการโหลด php5-fpm ทุก ๆ 10 นาทีซึ่งดูแลปัญหาการล่ม แน่นอนเมื่อโหลด PHP อีกครั้ง nginx ส่งข้อผิดพลาดเกตเวย์ 502 ดังนั้นจึงไม่ใช่วิธีแก้ปัญหามากนัก

PHP กำลังเรียกใช้แคช APC ถ้าเป็นเช่นนั้น ฉันได้อ่านในบางจุดที่ APC สามารถทำให้เกิดการหยุดชะงักในบางสถานการณ์

ตัวชี้ใด ๆ จะเป็นประโยชน์ ฉันไม่ต้องกังวลเกี่ยวกับเครื่องนี้ตลอดเวลา

ข้อมูลเพิ่มเติมสามารถให้แน่นอน เพียงแจ้งให้เราทราบสิ่งที่คุณต้องการ

ปรับปรุง:ฉันเพิ่งคัดลอก apc.php ไปยังเว็บรูทและเข้าถึงเพื่อดูสถิติของเรา สิ่งที่ดูดี จากนั้นฉันคลิกลิงก์เพื่อไปที่สถิติผู้ใช้และ BOOM เซิร์ฟเวอร์หยุดทำงานทันที ฉันโหลด php-fpm อีกครั้งจากนั้นโหลดหน้าเว็บสถิติผู้ใช้อีกครั้ง รอสักครู่โหลดใหม่อีกครั้งเซิร์ฟเวอร์หยุดทำงานอีกครั้ง

ดังนั้นนี่น่าจะเกี่ยวข้องกับ APC อย่างแน่นอน คำถามคือ - เราจะแก้ไขได้อย่างไร

การกำหนดค่า APC:

[apc]
apc.enabled="1"
apc.stat = "1"
apc.max_file_size = "2M"
apc.localcache = "1"
apc.localcache.size = "256"
apc.shm_segments = "1"
apc.ttl = "3600"
apc.user_ttl = "7200"
apc.gc_ttl = "3600"
apc.cache_by_default = "1"
apc.filters = ""
apc.write_lock = "1"
apc.num_files_hint= "10000"
apc.user_entries_hint="10000"
apc.shm_size = "1G"
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.include_once_override = "0"
apc.file_update_protection="2"
apc.canonicalize = "1"
apc.report_autofilter="0"
apc.stat_ctime="0"

อัปเดต 2:เรามีความคืบหน้าเกี่ยวกับเรื่องนี้ที่นี่ ปรากฎว่าปลั๊กอินแคช WordPress (W3 Total Cache) เป็นสิ่งที่ทำให้เกิดปัญหา เรายังไม่รู้ว่าทำไม แต่เมื่อปิดการใช้งานเราได้ใช้งาน PHP มาเกือบ 4 ชั่วโมงแล้วโดยไม่ต้องโหลดซ้ำไม่มีการชะลอตัวไม่มีข้อผิดพลาด เรายังคงใช้ APC ในฟอรัม vBulletin และไม่มีปัญหาเลย มีวิธีใดบ้างที่เราจะตัดสินว่าทำไม APC ถึงพัง ฉันชอบที่จะใช้มันในการติดตั้ง WordPress ของเรา แต่ไม่คุ้มกับระบบที่เปราะบาง


คุณสามารถโพสต์การตั้งค่า APC ที่เกี่ยวข้องที่คุณมีได้หรือไม่
Kyle

ใช่ความคิดที่ดี เสร็จสิ้น
Kevin

คุณมี ram และ swap บนเครื่องนี้เท่าไหร่? มีการใช้เท่าไหร่เมื่อเริ่มตาย?
Kyle

2
APC เป็นฝันร้ายรถอย่างน่ากลัวและเป็นแหล่งเดียวของการเกิดปัญหาเช่นนี้ในหนึ่งในเว็บไซต์ของฉันสำหรับปีที่ผ่านมา ในที่สุดฉันก็กำจัดมันทิ้งไปโดยสิ้นเชิง และ PHP นั้นแข็งแกร่ง หากคุณต้องการแคชลอง Zend Opcache ซึ่งเป็นแคชเริ่มต้นจาก PHP 5.5
Michael Hampton

1
ใช่มันเป็น APC ซึ่งพัง PHP เมื่อเราปิดการใช้งาน APC เราหยุดการรีสตาร์ท PHP อย่างต่อเนื่อง
Kevin

คำตอบ:


27

คุณกำลังใช้ php-fpm ดังนั้นฉันขอแนะนำให้คุณก้าวร้าวมากขึ้นว่าลูกของ php-fpm จะได้รับอนุญาตให้อยู่ได้นานแค่ไหน คุณต้องหาจุดที่น่าสนใจระหว่างกระทู้ / ลูกที่มีอายุสั้นและมีความมั่นคง ค่าเริ่มต้น php-fpm เป็นวิธีที่เอื้อเฟื้อเผื่อแผ่สำหรับระบบการผลิตใด ๆ IMHO

ฉันจะลดจำนวนpm.max_requestsสำหรับกลุ่มการผลิตของคุณ ฉันคิดว่าค่าเริ่มต้นคือ 200 ฉันจะเริ่มต้นจาก 50 และดูว่าจะพาคุณไปที่ไหน

ล้มเหลว / เสริมคุณสามารถลองใช้ตัวเลือกสากลเหล่านี้ (AFAIK ตัวเลือกเหล่านี้ถูกปิดใช้งานโดยค่าเริ่มต้น):

emergency_restart_threshold=3
emergency_restart_interval=1m
process_control_timeout=5s

สิ่งนี้หมายความว่า? หากกระบวนการย่อย PHP-FPM 3 รายการออกโดยใช้ SIGSEGV หรือ SIGBUS (เช่นเกิดข้อผิดพลาด) ภายใน 1 นาที PHP-FPM จะเริ่มต้นใหม่โดยอัตโนมัติ เด็กกระบวนการรอ 5s สำหรับปฏิกิริยาต่อสัญญาณจากต้นแบบ

สิ่งนี้ควรทำให้กลุ่มคนทำงาน PHP ของคุณน่าอยู่สดชื่นและสะอาด ยิ่งคนงานได้รับอนุญาตให้ส่งคำขออีกต่อไปก็จะได้รับความไม่แน่นอนมากขึ้น นอกจากนี้ยังมีความเสี่ยงสูงที่หน่วยความจำรั่ว

นี่เป็นภาพรวมที่ดีของตัวเลือกการตั้งค่าทั้งหมดที่ฉันพูดถึงที่นี่เช่นเดียวกับคนอื่น ๆ : http://myjeeva.com/php-fpm-configuration-101.html

หวังว่าเคล็ดลับเหล่านี้จะช่วยคุณได้! จำไว้ว่าให้ปรับแต่งและสังเกต แต่น่าเสียดายที่ไม่มีกฎง่ายๆสำหรับทั้งหมดนี้มีตัวแปรมากเกินไปที่ส่งผลต่อพฤติกรรมและความเสถียรของ PHP


1
คุณมีความคิดเห็นอย่างไรกับการใช้ cron เพื่อเริ่ม php5-fpm ทุกชั่วโมง
CMCDragonkai

2
นั่นเป็นวิธีที่ค่อนข้างไร้สาระในการทำและอาจไม่ทำงานเลย PHP-FPM มี tweaks ในตัวเป็นจำนวนมากดังนั้นจึงเป็นการดีกว่าถ้าใช้ tweakability
Rouben

1
คำตอบนี้ชี้ให้ฉันในทิศทางที่ถูกต้อง ฉันเห็นปัญหาที่คล้ายกันเช่นนี้ด้วยตัวเองทางออกสำหรับฉันคือการเปลี่ยนpmจากdynamicเป็นondemandและทั้งหมดดูเหมือนว่าจะทำงานได้ดีในตอนนี้ด้วยค่าเริ่มต้นอื่น ๆ ทั้งหมด
llanato

(ใน php-fpm.conf) ควรเป็น '=' แทนที่จะเป็น '' เพื่อแยกคีย์และค่า Emergency_restart_threshold = 3 emergency_restart_interval = 1m
กระบวนการ _control_timeout

ฉันได้รับERROR: [/etc/php/7.0/fpm/pool.d/www.conf:135] unknown entry 'emergency_restart_threshold'
deweydb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.