Apache เข้าถึง MaxClients และล็อคเซิร์ฟเวอร์


9

ขณะนี้ฉันมีเซิร์ฟเวอร์ Apache2 ที่ใช้งานmpm-preforkและmod_phpบน OpenVZ VPS พร้อม RAM ที่สามารถระเบิดได้ 512M จริง / 1024M (ไม่มีการสลับ) หลังจากใช้การทดสอบบางอย่างฉันพบว่าขนาดกระบวนการสูงสุดที่ Apache ได้รับคือ 23M ดังนั้นฉันจึงตั้งค่าMaxClientsเป็น 25 (23M x 25 = 575 MB ตกลงสำหรับฉัน) ฉันตัดสินใจรันการทดสอบโหลดบนเซิร์ฟเวอร์ของฉันและผลลัพธ์ก็ทำให้ฉันงง

ฉันใช้abเครื่องเดสก์ท็อปเพื่อขอหน้าหลักจากบล็อก WordPress

เมื่อฉันทำงานabด้วยการเชื่อมต่อพร้อมกัน 24 รายการทุกอย่างดูใช้ได้ แน่นอนว่าซีพียูสูงขึ้นแรมฟรีลดลงและผลลัพธ์ก็คือเวลาตอบสนอง 2-3 วินาทีต่อคำขอ

แต่ถ้าฉันใช้abการเชื่อมต่อพร้อมกัน 25 ครั้ง (ขีด จำกัด เซิร์ฟเวอร์ของฉัน) Apache จะหยุดทำงานหลังจากผ่านไปสองสามวินาที มันเริ่มประมวลผลการร้องขอจากนั้นจะหยุดตอบสนอง CPU กลับไปที่ไม่ได้ใช้งาน 100% และabหมดเวลา Apache log บอกว่ามันมาถึงMaxClientsแล้ว

เมื่อสิ่งนี้เกิดขึ้น Apache จะล็อคตัวเองด้วยกระบวนการทำงาน 25 กระบวนการ (ทั้งหมดอยู่ใน "W" ถ้าฉันตรวจสอบสถานะเซิร์ฟเวอร์) และหลังจากการTimeOutตั้งค่ากระบวนการเริ่มตายและเซิร์ฟเวอร์เริ่มตอบสนองอีกครั้ง (ในกรณีของฉันมันตั้งไว้ ถึง 45)

คำถามของฉัน: นั่นเป็นพฤติกรรมที่คาดหวังหรือไม่ ทำไม Apache ถึงตายเมื่อมันมาถึงMaxClients? หากใช้งานได้กับ 24 คนเชื่อมต่อมันจะไม่ทำงานกับ 25 แค่ใช้เวลานานกว่านี้ในการตอบคำขอแต่ละครั้งและรอคิวที่เหลือ

มันฟังดูแปลก ๆ นะกับผมว่าเด็ก ๆ วิ่งเพียงอย่างเดียวสามารถฆ่าเว็บเซิร์ฟเวอร์เพียงโดยการตั้งค่าการเชื่อมต่อพร้อมกันไปยังเซิร์ฟเวอร์abMaxClients

คำตอบ:


17

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

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

โดยทั่วไป PHP กำลังทำให้เซิร์ฟเวอร์ของฉันอยู่ในสถานะหยุดชะงักและ Apache จะเริ่มทำงานได้ตามปกติหลังจากการเชื่อมต่อเหล่านี้หมดเวลารอคำขอ "ลูก" ของพวกเขา

หลังจากที่ฉันลบฟังก์ชั่นนี้ออกจากธีมของฉันตอนนี้ฉันสามารถabเซิร์ฟเวอร์ของฉันด้วยการเชื่อมต่อพร้อมกันมากเท่าที่ฉันต้องการและ Apache กำลังรอคิวพวกเขาตามที่คาดไว้


ขอขอบคุณที่โพสต์สิ่งนี้ที่นี่ฉันพยายามคิดว่ามีอาการแบบเดียวกันนี้มาหลายวันแล้ว - คิดว่าเรามีการหยุดชะงักด้วย!
James Yale

คุณทราบได้อย่างไรว่าส่วนใหญ่สนใจในบันทึกและเครื่องมือที่คุณใช้เพื่อกำหนดคำขอขาออกสำรอง
Anirudh Goel

2

สิ่งที่เกิดขึ้นที่นี่คือคุณมี 25 เธรดที่สามารถยอมรับการเชื่อมต่อและคุณกำลังส่งคำขอที่เกิดขึ้นพร้อมกัน 26 รายการ คำขอล่าสุดนั้นอยู่ในคิวซ็อกเก็ตขึ้นอยู่กับขนาดของงานในมือของคุณ

ปัญหาที่สองคือสิ่งที่คุณกำลังเรียกใช้ซึ่งใช้เวลา 2-3 วินาทีใช้เวลานานพอที่จะตอบสนองได้ว่าการเชื่อมต่อที่เกิดขึ้นพร้อมกัน 25 รายการทำให้เครื่องช้าลง sleep (1) อาจทำงานได้ แต่บางสิ่งที่คุณกำลังทำการล็อกไฟล์หรือล็อคตารางจาก mysql คำขอแบบขนานแต่ละรายการอาจรอก่อนที่จะเสร็จสมบูรณ์จนกว่าพวกเขาจะหมดเวลา 45 วินาที

23mb ฟังดูเล็กสำหรับกระบวนการ apache ด้วย mod_php และโมดูลใด ๆ ที่โหลดดังนั้นฉันสงสัยว่าคุณอาจเห็นกระบวนการ apache เหล่านั้นใช้ RAM เพิ่มขึ้นอีกเล็กน้อยเมื่อแอปพลิเคชันของคุณทำงานอยู่ คุณไม่สามารถทำคณิตศาสตร์กับ MaxClients และความทรงจำแบบนี้ได้จริง ๆ ... มันจะค่อนข้างใกล้เคียง แต่คุณไม่มีทางรู้

www-data  1495  0.1  0.9  56288 19996 ?        S    15:48   0:01 /usr/sbin/apache2 -k start
www-data  1500  0.0  0.5  49684 12436 ?        D    15:48   0:00 /usr/sbin/apache2 -k start

มีหนึ่งเครื่องกระบวนการ 56M และ 49M

เครื่องอื่น:

www-data  7767  0.1  0.1 213732 14840 ?        S    14:55   0:08 /usr/sbin/apache2 -k start
www-data  8020  0.2  0.1 212424 13660 ?        S    14:57   0:08 /usr/sbin/apache2 -k start

เครื่องอื่น:

www-data 28509  0.8  0.1 161720 10068 ?        S    14:39   0:43 /usr/sbin/apache2 -k start
www-data 28511  0.8  0.1 161932 10344 ?        S    14:39   0:43 /usr/sbin/apache2 -k start

ดังนั้นการใช้หน่วยความจำขึ้นอยู่กับงานมากโมดูลที่โหลด ฯลฯ ในสองครั้งล่าสุดฉันเชื่อว่าเราได้ปิดการใช้งาน pdo & pdo_mysql เนื่องจากแอปพลิเคชันนั้นไม่ได้ใช้งาน

คำถามจริงคือคุณกำลังทำอะไรที่ใช้เวลา 3 วินาที? ในโลกปัจจุบันนั่นคือนิรันดร์และถือว่าเป็นแอปพลิเคชัน 'บล็อก' Apache ปกติจะไม่ตาย แต่จะปล่อยให้เธรดเหล่านั้นอยู่ในคิวงานค้างจนกว่ามันจะสามารถให้บริการพวกเขาหรือการรอคำขอหมดเวลา ฉันเชื่อว่าแอปพลิเคชันของคุณอาจทำให้อาปาเช่หมดเวลา ลองใช้ในหน้าที่มีเพียง phpinfo (); และดูว่าผลลัพธ์เหมือนกันหรือไม่


ขอบคุณสำหรับเคล็ดลับ! ฉันรู้ว่าฉันยังต้องการเพิ่มประสิทธิภาพหลายอย่าง (ฉันเพิ่งเริ่มต้นกำหนดค่าเซิร์ฟเวอร์สองสามวันที่ผ่านมาและเป็นประสบการณ์ครั้งแรกของฉันกับ VPS) แต่ปัญหานั้นลึกกว่านั้น ... ฉันโพสต์คำตอบไปที่ คำถามอธิบายสิ่งที่เป็นปัญหาในกรณีเฉพาะของฉัน
Rodrigo Sieiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.