เว็บเซิร์ฟเวอร์ apache ไม่ตอบสนองกับสถานะเซิร์ฟเวอร์แสดงกระบวนการลูกทั้งหมดที่รอการเชื่อมต่อ [ปิด]


10

การตั้งค่าของฉัน: ฉันมีเครื่องเว็บเซิร์ฟเวอร์เกือบ 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


เว็บไซต์แสดงอาการเดียวกันเมื่อคุณเรียกใช้ wget หรือ curl จากโฮสต์ท้องถิ่นหรือระหว่างเซิร์ฟเวอร์ (หากอยู่ในเครือข่ายเดียวกัน)
Alex Forbes

บางทีทราฟฟิกทราฟิก ( tcpdump) จะช่วยให้คุณเข้าใจถึงปัญหา ... btw การใช้หน่วยความจำและนโยบายไฟร์วอลล์ของคุณคืออะไร
drcelus

@ al4 เป็นครั้งสุดท้ายที่เกิดขึ้นนี้ฉันสามารถเชื่อมต่อกับหน้าสถานะเซิร์ฟเวอร์จากโฮสต์ท้องถิ่นในขณะที่ฉันไม่สามารถเชื่อมต่อกับหน้าเว็บจากภายนอก ฉันไม่แน่ใจเพราะมันอาจเป็นสิ่งที่สุ่มในขณะที่คนงานบางคนก็พร้อมใช้งาน ฉันจะทดสอบในครั้งต่อไปที่เกิดปัญหาขึ้น สิ่งที่จะเป็นคำแนะนำของคุณถ้าฉันสามารถยืนยันความแตกต่างระหว่างการเชื่อมต่อภายนอกและท้องถิ่น?
Jeff

หากคุณสามารถยืนยันได้ว่ามันทำงานได้ในพื้นที่ แต่ไม่ใช่จากภายนอกมันจะช่วยเพิ่มความแข็งแกร่งให้กับกรณีที่เครือข่ายเป็นปัญหา - หมายความว่าคุณควรทดสอบด้วย tcpdumps และ wireshark ที่ปลายทั้งสองเพื่อดูว่ามีอะไรเกิดขึ้นบ้าง ฉันจะทดสอบจากโฮสต์บน LAN เดียวกันถ้าเป็นไปได้ และตรวจสอบ dmesg เพื่อดูว่ามีข้อความใด ๆ ที่อาจเกี่ยวข้องกันหรือไม่ แต่ดูเหมือนว่าคุณได้ทำไปแล้ว
Alex Forbes

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

คำตอบ:


2

คุณควรเปิดใช้งานสถานะเพิ่มเติมของ mod_status ( http://httpd.apache.org/docs/2.2/mod/mod_status.html#extendedstatus ) เพื่อตรวจสอบโฮสต์ปัจจุบันและคำขอที่กำลังประมวลผล ฉันคิดว่ามีสคริปต์ / หน้า (s) ซึ่งใช้เวลามากเกินไปที่จะปล่อยการเชื่อมต่อและทำให้การเชื่อมต่อซ้อนกัน


1

ก่อน: ตรวจสอบMax open filesขีด จำกัดของคุณในกระบวนการ การเชื่อมต่อซ็อกเก็ตที่ใช้งานนับเป็นไฟล์เปิด cat /proc/###/limitsเป็นวิธีที่ดีในการตรวจสอบค่าที่มีประสิทธิภาพสำหรับกระบวนการอื่น คุณสามารถรับรายการไฟล์ที่เปิดได้โดยlsof -p ###ที่ ### เป็นรหัสกระบวนการของเว็บเซิร์ฟเวอร์ของคุณ คุณสามารถเปรียบเทียบlsof -p ### | wc -lเพื่อดูว่าคุณเข้าใกล้ขีด จำกัด มากแค่ไหน คุณควรเห็นข้อความใน error_log ของ apache หากคุณกดขีด จำกัด

คุณต้องมีตัวจัดการไฟล์สำหรับการเชื่อมต่อซ็อกเก็ตแต่ละตัวและสำหรับสคริปต์ cgi แต่ละตัวหรือการอ้างอิงไฟล์ข้อมูล สำหรับ 920 MaxClients คุณควรกำหนดค่าอย่างน้อย 4,000 ไฟล์สำหรับกระบวนการ httpd คุณสามารถเพิ่มจำนวนไฟล์โดยเพิ่มไฟล์ใน /etc/security/limits.d/ ด้วยเนื้อหาต่อไปนี้ ตรวจสอบให้แน่ใจว่าชื่อผู้ใช้ตรงกับสิ่งที่คุณใช้สำหรับเว็บเซิร์ฟเวอร์ของคุณ

apache soft nofile 10000
apache hard nofile 10000

ข้อที่สอง: หากพอร์ตของคุณเป็นปัญหาคุณสามารถปรับการตั้งค่า ip ได้ใน /etc/sysctl.conf (เริ่มต้นด้วยnet.ipv4.tcp_fin_timeout) ซึ่งมักเป็นปัญหากับการเชื่อมต่อขนาดเล็กจำนวนมากเท่านั้น ซ็อกเก็ต TIME_WAIT หลายคนเป็นหนึ่งในตัวบ่งชี้นี้ แต่นี้บ่งชี้อ่อนเพลียพอร์ตเท่านั้นเมื่อมาพร้อมกับความผิดพลาดใน syslog เกี่ยวกับและpossible SYN flooding Sending cookiesคุณควรตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ของคุณอยู่หลังไฟร์วอลล์ที่สามารถป้องกันการโจมตี SYN ที่เป็นอันตรายได้


0

นอกจากนี้โปรดทราบว่าใน prefork MPM แต่ละกระบวนการจะมี PHP ในพื้นที่หน่วยความจำ (การตั้งค่าขีด จำกัด หน่วยความจำคืออะไร) คุณอาจต้องการลองเปลี่ยนเป็น MPM ของผู้ปฏิบัติงานซึ่งอาจต้องใช้โมดูล PHP ที่แตกต่างกันเล็กน้อย

นอกจากนี้ยังมีค่าต่างหูระยะไกลเพื่อตัดแต่ง Apache โมดูลโมดูลภายนอกของคุณ

จากประสบการณ์ของฉันสิ่งต่าง ๆ ถูกกระตุ้นโดยสิ่งต่าง ๆ เช่นโปรแกรมรวบรวมข้อมูลของเครื่องมือค้นหาหรือสิ่งต่าง ๆ เช่นความขัดแย้ง ARP หรือระดับการรับส่งข้อมูลในบางส่วนที่เกี่ยวข้องของเครือข่าย

คุณอาจพบว่า 'sar' มีประโยชน์ ... ไม่ใช่เป็นมิตรที่สุด แต่มีประโยชน์อย่างแน่นอน

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.