การตั้งค่าของฉัน: ฉันมีเครื่องเว็บเซิร์ฟเวอร์เกือบ 3 เครื่องที่ให้บริการเหมือนกันกับเว็บไซต์ที่มีการโหลดสูงแบบไดนามิกพร้อมกับการปรับสมดุลภาระแบบง่าย ๆ มากกว่า dns บริการนี้ใช้งานได้นานกว่าสองปีด้วยการตั้งค่า apache เดียวกัน: apache2, php5, ubuntu 8.04 linux 2.6.24-29-server
ปัญหาของฉัน: ตั้งแต่ประมาณสองสัปดาห์ที่ผ่านมาฉันประสบปัญหากับการกำหนดค่านี้ เกือบทุกวันฉันมีช่วงเวลาเล็ก ๆ อยู่ประมาณ 5 นาทีซึ่งเว็บไซต์ไม่สามารถเข้าถึงได้ ฉันยังสามารถเข้าสู่เซิร์ฟเวอร์ผ่าน ssh ถ้าฉันวิ่งhtop
ฉันจะเห็นเครื่องไม่ทำอะไรเลย ฉันมีกระบวนการของ apache ประมาณ 1,000 รายการที่ทำงาน แต่ไม่มีกิจกรรม cpu
ฉันใช้ apache mod_status เพื่อดีบักสถานการณ์นี้ กระดานคะแนนกระบวนการมีลักษณะดังนี้:
_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
ดังนั้นกระบวนการส่วนใหญ่จึงรอการเชื่อมต่อ หลังจากนั้นประมาณ 5 นาทีสถานการณ์จะกลับสู่ปกติ: ฉันมีกระบวนการน้อยมากในทุก ๆ เครื่องคนงานส่วนใหญ่มีสถานะ "." - (หมายความว่าพวกเขาเปิดให้ดำเนินการตามคำขอ) และแน่นอนว่าเว็บไซต์เข้าถึงได้!
ดังนั้นฉันพยายามหาบางอย่างในบันทึก แต่ไม่มีอะไรเลย ... ล็อกการเข้าถึง apache เงียบประมาณ 4 นาทีเหมือนกันกับบันทึกข้อผิดพลาด ฉันยังไม่สามารถเข้าใจสิ่งผิดปกติในบันทึกของระบบอื่นได้
สถานการณ์เหมือนกันในเว็บเซิร์ฟเวอร์ทั้ง 3 แห่ง (ทั้งหมดมีโหลดสูงสุดและสภาพไม่ตอบสนองในเวลาเดียวกัน) ดังนั้นฉันจึงไม่ได้ทำสิ่งนี้เกี่ยวข้องกับฮาร์ดแวร์ แต่ฉันคิดว่านี่อาจเกี่ยวข้องกับปัญหาเครือข่าย (tcp)
ความคิดใด ๆ
แก้ไข: ข้อมูลเพิ่มเติมที่ฉันเพิ่งค้นพบ:
มันเพิ่งเกิดขึ้นอีกครั้งและฉันสามารถตรวจสอบได้ว่าฉันยังไม่สามารถเชื่อมต่อภายในเครื่องเมื่อเกิดปัญหานี้ขึ้น
ฉันสร้างสถิติการเชื่อมต่อด้วยคำสั่งต่อไปนี้หลังจากที่มันเกิดขึ้น: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
- 109 CLOSE_WAIT
- 2652 ก่อตั้งขึ้น
- 2 FIN_WAIT1
- 11 LAST_ACK
- 12 รับฟัง
- 91 SYN_RECV
- 1 SYN_SENT
- 16 TIME_WAIT
หากฉันรันคำสั่งเดียวกันในภายหลังฉันมีสิ่งนี้:
- 4 การปิด
- 108 ก่อตั้งขึ้น
- 18 FIN_WAIT1
- 182 FIN_WAIT2
- 37 LAST_ACK
- 12 รับฟัง
- 50 SYN_RECV
- 11276 TIME_WAIT
ดังนั้นในสถานการณ์ปกติฉันมีเพียง 100-200 การเชื่อมต่อแบบเปิดโดยลูกค้าที่ถูกจัดการโดย apache ในขณะนี้ เมื่อฉันมี "ความผิดพลาด" นี้ฉันมีการเชื่อมต่อมากขึ้น วิธีที่ดีที่สุดในการวิเคราะห์สิ่งนี้คืออะไร?
EDIT2: บรรทัดสำคัญใน apache2.conf คือ:
KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit 920
StartServers 30
MinSpareServers 80
MaxSpareServers 120
MaxClients 920
MaxRequestsPerChild 700
</IfModule>
มันเป็น prefork apache2 ที่มี php_mod
เซิร์ฟเวอร์มี 8GB ram และพาร์ทิชัน swap 4gb
tcpdump
) จะช่วยให้คุณเข้าใจถึงปัญหา ... btw การใช้หน่วยความจำและนโยบายไฟร์วอลล์ของคุณคืออะไร