Analyze IBM HeapDump (IBM WebSphere)
30 January 2024
บ่อยครั้งที่ application ที่พัฒนาโดยใช้ java ไม่ยอมตอบสนองการ request บ้าง มีการใช้งาน cpu สูงบ้าง ส่วนใหญ่ปัญหาที่เกิดขึ้นมักจะเกิดจาก heap memory ของ JVM (Java Virtual Machine) เต็ม
heap เป็น memory ของตัว JVM (หรือเทียบกับเครื่อง server ก็คือ memory ของตัว server) เมื่อตัว java มีการสร้าง object ขึ้นมาก็จะนำไปเก็บไว้ที่ heap แล้วก็จะเก็บไปเรื่อย ๆ พอถึงเวลาหนึ่งก็จะมีตัว process garbage collector มาทำหน้าที่เอา object ที่ไม่ใช้แล้วออกจาก heap ทำให้ heap ว่างสำหรับจะรองรับการสร้าง object ต่อไป
ภาพการใช้งาน heap “ปกติ” จะเป็นรูปฟันปลา
คือเวลาสร้าง object เพิ่มขึ้นกราฟก็จะขึ้นไปเรื่อย ๆ พอถึงเวลาที่ gc (garbage collector) ทำงานกราฟการใช้ heap ก็จะตก (คือ heap เหลือมากขึ้น)
ในการใช้งานที่ “ไม่ปกติ” เรามักจะพบว่ามีการใช้ heap เพิ่มขึ้นเรื่อย ๆ ไปจนเต็ม และถึงแม้ว่าตัว gc จะพยายาม clear object ออกจาก heap เพื่อให้มี heap ว่าง แต่ก็ทำไม่ได้ ส่วนใหญ่จะเกิดจาก object ใน heap ยังต้องใช้อยู่จึงทำให้ gc ไม่สามารถเอา object นั้นออกไปได้ (อาจเกิดจากการเขียนโปรแกรมไม่ถูก หรืออาจเกิดจาก object นั้นมีความต้องการในการทำงานในระบบนาน)
ซึ่งการทำงานแบบนี้จะทำให้เมื่อมีการ request เข้าไป ระบบก็จะไม่ตอบสนอง
การตรวจสอบการใช้งาน heap นั้นเราจะต้อง dump heap ออกมาวิเคราะห์ว่ามี object อะไรครอบครอง heap ไว้มาก ไว้นาน จน heap เต็ม
ซึ่งเครื่องมือที่ใช้ในการวิเคราะห์ heap นี้ก็มีให้เลือกใช้เยอะ แต่ใน blog นี้จะนำเครื่องมือของ IBM มาแนะนำ เนื่องจาก heap dump ของ IBM มักจะหาเครื่องมือมาใช้ด้วยน้อย 😛
file heap dump ของ IBM จะมีนามสกุลเป็น “.phd” ซึ่งเป็น binary file จะใช้โปรแกรม IBM Memory Analyzer Tool
วิธีติดตั้งก็ให้ไปที่ url “https://eclipse.dev/mat/downloads.php” นี้เพื่อทำการ download program ให้ตรงกับเครื่องที่เราใช้
พอดีผมใช้เป็น Windows เลยจะขอเล่าเป็นขั้นตอนของ Windows นะครับ
หลังจาก download มาแล้วก็ทำการแตก file เก็บไว้ที่เครื่อง ผมแตก file ลงไว้ที่ “D:\MAT”
จากนั้นให้เปิด command prompt แล้วเข้าไปที่ directory นี้
แล้วเปิดโปรแกรม MemoryAnalyzer โดยใช้คำสั่ง
MemoryAnalyzer -vmargs -Xmx4g
“-Xmx4g” เป็นการสั่งให้ run program โดยให้ memory ให้กับ program MemoryAnalyzer จำนวน 4GB ถ้าเครื่องใครมี memory เหลือเยอะก็ใส่เพิ่มได้ครับ
หลังเปิด program ขึ้นมาได้แล้ว ให้ไปเลือก “Install New Software”
โดยให้ใส่ site url เป็น “https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/runtimes/tools/dtfj/” และตั้งชื่อว่า “IBM Monitoring and Diagnostic Tools”
จากนั้นให้กดปุ่มที่เครื่องหมาย check และกด accept agreement เพื่อทำการ install software
หลังจากที่ install เสร็จแล้วให้ restart MAT หลังจากที่ program เปิดขึ้นมาใหม่ ให้ไปที่ menu File -> “Open Heap Dump” แล้วเลือก file heap dump ของเราที่เป็นนามสกุล “.phd”
จากนั้นเครื่องจะอ่านข้อมูลจาก file heap dump เข้ามาวิเคราะห์ อาจจะใช้เวลามากน้อยขึ้นอยู่กับขนาดของ file heap dump
จากตัวอย่างนี้ หากเราต้องการดูว่ามี memory leak เกิดขึ้นที่ไหน เราก็เลือกไปที่ Leak Suspects
ก็จะเห็นผลวิเคราะห์ออกมาว่าน่าจะเกิด leak ที่ 3 จุด (Problem Suspect 1,2,3)
จากนั้นเราก็คงต้องไปวิเคราะห์ต่อเอาเองแล้วว่าทำไมถึงได้มี object นั้นค้างอยู่ใน heap มากจนทำให้ heap เต็มนะครับ จากนั้นก็แก้ไขเพื่อไม่ให้ระบบเรามีปัญหาอีก
โชคดีครับ 😄