ฉันจะตรวจสอบหน่วยความจำ JVM ในวิธีที่เหมาะสมได้อย่างไร


9

ฉันกำลังคิดว่าเราจะตรวจสอบหน่วยความจำ JVM ด้วยค่าโสหุ้ยต่ำในสภาพแวดล้อมการผลิตได้อย่างไรภายใต้ชั่วโมงที่ยุ่ง

สมมติว่าฉันมีเซิร์ฟเวอร์แอพ Tomcat สองตัวในการผลิตโหลดบาลานซ์ตั้งค่าไว้ด้านหลัง หากฉันเห็นสถิติหน่วยความจำ jvm ฉันสามารถบอก load balance ให้หยุดส่งคำขอไปยังเซิร์ฟเวอร์ซึ่งจะพบปัญหา OOM ทำให้เหมาะสมหรือไม่ Jconsole หรือ VisualVM กินการเพิ่มประสิทธิภาพมากขึ้นไม่ใช่ตัวเลือกของฉัน


Java ไซมอนกรอบอาจจะมีความคุ้มค่าดู
khmarbaise

ซ้ำกันเป็นไปได้ - stackoverflow.com/questions/242958/best-tools-to-monitor-tomcat
jasonk

คำตอบ:



1

คนอื่น ๆ ได้ให้คำแนะนำเกี่ยวกับวิธีตรวจสอบการใช้งานหน่วยความจำ ...

สมมติว่าฉันมีเซิร์ฟเวอร์แอพ Tomcat สองตัวในการผลิตโหลดบาลานซ์ตั้งค่าไว้ด้านหลัง หากฉันเห็นสถิติหน่วยความจำ jvm ฉันสามารถบอก load balance ให้หยุดส่งคำขอไปยังเซิร์ฟเวอร์ซึ่งจะพบปัญหา OOM ทำให้เหมาะสมหรือไม่

เรียงจาก แต่มันก็ไม่ได้เป็นวิธีที่ดีที่สุดในการแก้ปัญหาของคุณ

ยอมให้ย้อนกลับไปที่รากของปัญหา ... OOME ในบริบทของ Tomcat OOME มีแนวโน้มที่จะเกิดจากหนึ่งในสาเหตุต่อไปนี้:

  • หน่วยความจำรั่วในแอปพลิเคชันของคุณ (หรืออาจเป็น Tomcat เอง)
  • พยายามประมวลผลคำขอมากเกินไปพร้อมกันในแต่ละ Tomcat หรือ
  • คำขอแต่ละรายการที่ต้องการหน่วยความจำมากเกินไประหว่างการประมวลผล

ในการแก้ปัญหาของคุณอันดับแรกคุณต้องค้นหาว่าสิ่งใดเกิดขึ้น ... เพราะวิธีการแก้ปัญหานั้นแตกต่างกันสำหรับแต่ละปัญหา

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

หากคุณมีหน่วยความจำรั่ววิธีที่ดีที่สุดคือการหาว่าส่วนใดของรหัสที่คุณรับผิดชอบและแก้ไข สิ่งอื่นใด ... รวมถึง load balancing ... เป็นโซลูชัน bandaid และอาจนำไปสู่ปัญหาที่แย่กว่าเดิมในการติดตาม

2) เมื่อมีการขจัดหน่วยความจำรั่วคุณต้องพิจารณาว่าปัญหาคือคุณกำลังประมวลผลคำขอมากเกินไปในคราวเดียวหรือไม่ ฉันไม่แน่ใจว่าวิธีที่ดีที่สุดในการทำเช่นนั้น แต่ถ้าเป็นปัญหา (หรือคุณสงสัยว่าเป็น) แล้วมีวิธีแก้ปัญหาที่เป็นไปได้:

  • ปรับการกำหนดค่าเซิร์ฟเวอร์ Tomcat เพื่อลดจำนวนเธรดผู้ปฏิบัติงาน

  • หากคำขอของคุณเป็น I / O ที่ถูกผูกไว้ความเป็นไปได้อีกอย่างหนึ่งก็คือการดูการสนับสนุนการจัดการคำขอแบบอะซิงโครนัสที่มีอยู่ในข้อกำหนด Servlet รุ่นล่าสุด - ดูที่http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm แต่นั่นจะทำงานได้มากขึ้น

3) หากปัญหาปรากฏว่าคำขอบางคำขอใช้หน่วยความจำมากเกินไปคุณต้องหาวิธีตรวจสอบคำขอเหล่านั้นก่อนส่งและ "จัดการกับพวกเขา" ทั้งการตรวจจับและจัดการกับคำขอเหล่านี้อาจเป็นเรื่องยาก ... และเป็นการยากที่จะให้คำแนะนำหากไม่มีรายละเอียดใบสมัครของคุณ แต่สองวิธีแก้ปัญหาในทางปฏิบัติคือ:

  • ส่งต่อคำขอที่ผิดปกติไปยังเซิร์ฟเวอร์อื่นด้วยกองใหญ่ ... ซึ่ง OOME จะไม่รบกวนการร้องขอ "ปกติ"

  • เพิ่มขนาดฮีพ หากคุณมีหน่วยความจำกายภาพเพียงพอการรันด้วยฮีปที่ใหญ่ขึ้นจะทำให้เซิร์ฟเวอร์ Tomcat ของคุณมีประสิทธิภาพมากขึ้น ... และหลีกเลี่ยง OOME


โดยสรุปแทนที่จะพยายามโหลดยอดเงินเพื่อหลีกเลี่ยง OOME ฉันขอแนะนำให้คุณหาสาเหตุที่ทำให้คุณได้รับ OOME ... และพยายามจัดการกับสาเหตุของ OOME โดยตรง


0

บางทีjvmtopน่าจะเหมาะกับคุณ

มันแสดงให้คุณเห็นในลักษณะ "เหมือนด้านบน" บนพื้นฐานการตรวจสอบพื้นฐานต่อ jvm เช่นปริมาณการใช้หน่วยความจำการใช้ cpu การนับด้าย ฯลฯ

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