อะไรสามารถทำให้บริการทั้งหมดบนเซิร์ฟเวอร์ล่ม แต่ยังคงตอบสนองต่อการ ping และวิธีการคิดออก


9

มันเกิดขึ้นกับฉันแล้วสองครั้งภายในไม่กี่วันที่เซิร์ฟเวอร์ของฉันลงไปอย่างสมบูรณ์หมายถึง http, ssh, ftp, dns, smtp โดยทั่วไปบริการทั้งหมดหยุดตอบสนองราวกับว่าเซิร์ฟเวอร์ถูกปิดยกเว้นว่ามันยังตอบสนองต่อ ping ซึ่งเป็นสิ่งที่ฉันบุฟเฟ่ต์มากที่สุด

ฉันมีสคริปต์ php บางตัวที่ทำให้เกิดการโหลดจำนวนมาก (cpu และหน่วยความจำ) บนเซิร์ฟเวอร์ในช่วงเวลาสั้น ๆ ที่ใช้โดยผู้ใช้กลุ่มเล็ก ๆ แต่โดยปกติแล้วเซิร์ฟเวอร์ "อยู่รอด" ได้ดีกับการระเบิดเหล่านี้อย่างสมบูรณ์ ไม่ตรงกับยอดการใช้งานดังกล่าว (ฉันไม่ได้บอกว่ามันไม่เกี่ยวข้อง แต่มันไม่ได้เกิดขึ้นหลังจากนั้น)

ฉันไม่ได้ขอให้คุณสามารถบอกสาเหตุที่แท้จริงของการล่มเหล่านี้ได้อย่างน่าอัศจรรย์คำถามของฉันคือ: มีกระบวนการเดียวที่ความตายอาจทำให้บริการทั้งหมดเหล่านี้ลงไปพร้อมกันหรือไม่? สิ่งที่ตลกคือบริการเครือข่ายทั้งหมดลงไปยกเว้น ping หากเซิร์ฟเวอร์มี CPU 100% ที่กินเข้าไปในบางกระบวนการมันจะไม่ตอบสนองต่อการ ping เช่นกัน หาก apache ขัดข้องเนื่องจาก (ตัวอย่าง) สคริปต์ php ที่ใช้งานไม่ได้ซึ่งจะมีผลกับ http เท่านั้นไม่ใช่ ssh และ dns .... เป็นต้น

ระบบปฏิบัติการของฉันคือ Cent OS 5.6

ที่สำคัญที่สุดหลังจากรีบูตเซิร์ฟเวอร์อย่างหนักแล้วฉันควรดูบันทึกระบบอะไร / var / log / messages ไม่เปิดเผยสิ่งที่น่าสงสัย

คำตอบ:


8

( tl; drยังคงตอบสนองต่อ ping เป็นพฤติกรรมที่คาดไว้ตรวจสอบการใช้หน่วยความจำของคุณ)

คำร้องขอ ICMP echo (เช่น ping) ได้รับการจัดการโดยสแต็กเครือข่ายในเคอร์เนลโดยไม่มีการพึ่งพาอื่น

เคอร์เนลเรียกว่า "หน่วยความจำที่อยู่อาศัย" ซึ่งหมายความว่ามันจะถูกเก็บไว้ใน RAM เสมอและไม่สามารถเปลี่ยนเป็นดิสก์ได้เหมือนแอปพลิเคชันทั่วไป

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

ในเรื่องเกี่ยวกับปัญหาของคุณฉันสงสัยอย่างยิ่งว่าปัญหาหน่วยความจำ ติดตั้ง "sysstat" และใช้คำสั่ง "sar" เพื่อดูบันทึกของหน่วยความจำ / cpu / load / io load เป็นต้นฉันคาดว่าในช่วงเวลาที่เกิดข้อผิดพลาดคุณจะเห็นทั้ง 100% ทางกายภาพและการแลกเปลี่ยนที่ใช้

ฉันจะพิจารณาดูที่dmesgหรือ/ var / log / messagesเพื่อดูสัญญาณของ OOM-killer ใด ๆ ที่ถูกเรียกใช้ออกมา นี่คือระบบฉุกเฉินของเคอร์เนลซึ่งจะเริ่มฆ่ากระบวนการในกรณีที่หน่วยความจำหมด ประสิทธิภาพขึ้นอยู่กับว่ากระบวนการใดถูกฆ่า กระบวนการเดียวที่กินหน่วยความจำจะถูกฆ่าอย่างมีประสิทธิภาพและเป็นอิสระจากหน่วยความจำอย่างไรก็ตามเว็บไซต์ที่ใช้ apache จะวางไข่กระบวนการแทนที่ทันทีที่กระบวนการลูกถูกฆ่า


+1 สำหรับ OOM Killer
HTTP500

ขอบคุณมากฉันเกือบจะแน่ใจว่านี่เป็นปัญหาเนื่องจากทั้ง RAM และการสลับเต็มก่อนที่เซิร์ฟเวอร์จะล้มเหลว (ฉันสามารถดูสถิติผู้จัดการของ ovh) และอาจเป็นสคริปต์ php บ้าๆของฉันที่ใช้หน่วยความจำจำนวนมาก มันทำให้ฉันสับสน แต่ด้วยเหตุผลสองประการ (1) ดูเหมือนว่าหน่วยความจำที่กินโดย php จะไม่ได้รับการปลดปล่อยหลังจากนั้น แต่ก็ไม่สมเหตุสมผล (2) ไม่ว่าในกรณีใดฉันจะไม่คาดหวังว่าระบบปฏิบัติการที่เหมาะสมจะตายอย่างสมบูรณ์เพียงเพราะกระบวนการหนึ่ง (หรือแม้แต่น้อย) ที่ใช้หน่วยความจำมากเกินไป ... ฉันคาดหวังให้มัน
matteo

ปฏิเสธที่จะจัดสรรหน่วยความจำให้กับโปรแกรมที่ขอเมื่อหน่วยความจำไม่เพียงพอสำหรับระบบเพื่อให้ทำงานได้อย่างถูกต้อง ... ฉันหมายถึงรถที่เป็นอันตรายหรือแม้กระทั่งโปรแกรมที่เป็นอันตรายไม่ควรทำลายระบบทั้งหมดได้ ...
matteo

3
@matteo Linux มีสิ่งที่เรียกว่า "overcommit": เพราะคุณมีmalloc()RAM 1GB ไม่ได้หมายความว่าคุณจะใช้มันดังนั้นตัวจัดการหน่วยความจำจะติดตามจำนวนหน่วยความจำที่โปรแกรมของคุณคิดว่ามีและจำนวนหน่วยความจำ โปรแกรมใช้งานจริงและใช้งานได้จริงโดยส่วนใหญ่แล้ว อย่างน้อยก็จนกว่าจะมีมากกว่าหนึ่งโปรแกรมที่ต้องการใช้ 1GB ทั้งหมดที่คิดว่ามีอยู่
DerfK

1
@matteo ฉันไม่เห็นว่านี่เป็นปัญหา OOM โดยทั่วไปแล้ว OOM-killer จะเลือกเฉพาะหรือกระบวนการที่ตรงกับเกณฑ์บางอย่าง แต่จะไม่ฆ่า daemon อย่าง ssh นี่คือด้าน I / O แน่นอน คุณไม่ได้อธิบายสถานการณ์ / รายละเอียดฮาร์ดแวร์ของคุณตามที่ฉันขอในคำตอบ
ewwhite

5

โดยปกติจะเป็นปัญหา I / O หรือระบบย่อยของดิสก์ บ่อยครั้งสิ่งนี้จะถูกผนวกเข้ากับค่าเฉลี่ยการโหลดระบบที่สูงมาก ตัวอย่างเช่นระบบที่มีรายละเอียดในกราฟด้านล่างไม่ตอบสนอง (ยังเป็น pingable) เมื่อสคริปต์ทำงานผิดพลาดล็อคไฟล์จำนวนมากและโหลดเพิ่มขึ้นเป็น 36 ... บนระบบ 4 CPU

ป้อนคำอธิบายรูปภาพที่นี่

บริการที่ทำงานใน RAM และไม่จำเป็นต้องใช้การเข้าถึงดิสก์ดำเนินการต่อเพื่อให้ทำงาน ... ดังนั้นเครือข่ายสแต็ค (ping) จะทำงาน แต่บริการอื่น ๆ จะหยุดทำงานเมื่อต้องการเข้าถึงดิสก์ ... SSH เมื่อมีการอ้างอิงคีย์หรือ จำเป็นต้องค้นหารหัสผ่าน SMTP มีแนวโน้มที่จะปิดเมื่อโหลดเฉลี่ยฮิต 30 หรือดังนั้น ...

เมื่อระบบอยู่ในสถานะนี้ให้ลองรีโมตnmapเทียบกับ IP ของเซิร์ฟเวอร์เพื่อดูว่าเกิดอะไรขึ้น

การบันทึกของคุณอาจไม่ทำงานหากนี่เป็นปัญหาเกี่ยวกับดิสก์หรือพื้นที่เก็บข้อมูล ...

คุณอธิบายการตั้งค่าฮาร์ดแวร์ได้ไหม นี่เป็นเครื่องเสมือนหรือไม่? รูปแบบการจัดเก็บคืออะไร?

มากกว่าการบันทึกคุณต้องการดูว่าคุณสามารถกราฟประสิทธิภาพของระบบและเข้าใจว่าเกิดเหตุการณ์นี้หรือไม่ ดูว่าสิ่งนี้มีความสัมพันธ์กับกิจกรรมที่เฉพาะเจาะจง


คิดว่าเป็นปัญหาหรือไม่มีวิธีบอก SSH ให้เก็บรหัสผ่านไว้ในหน่วยความจำดังนั้นแม้ว่าเซิร์ฟเวอร์จะอยู่ในสถานะนี้ฉันอย่างน้อยฉันก็อาจจะสามารถเข้าสู่ระบบผ่านทาง ssh และเรียกใช้คำสั่งบางอย่างเพื่อดู เกิดอะไรขึ้น?
matteo

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