แก้ปัญหา OOM Killer: Process ที่เสี่ยงเกิด Memory Leak
คู่มือนี้เรียบเรียงสำหรับ Ruk-Com PaaS หน้าจอและตัวเลือกอาจแตกต่างตามเวอร์ชันและสิทธิ์ของบัญชี
ตรวจสอบ Environment, Region, สิทธิ์บัญชี และสำรองค่าปัจจุบันก่อนดำเนินการกับระบบจริง
วัตถุประสงค์
บทความนี้อธิบายการใช้งาน แก้ปัญหา OOM Killer: Process ที่เสี่ยงเกิด Memory Leak บน Ruk-Com Cloud PaaS โดยจัดลำดับขั้นตอนและจุดตรวจสอบสำหรับการนำไปใช้งานจริง
ก่อนเริ่มดำเนินการ
- เข้าสู่ระบบด้วยบัญชีที่มีสิทธิ์จัดการ Environment ที่เกี่ยวข้อง
- ตรวจสอบชื่อ Environment, Region และ Resource เป้าหมายก่อนบันทึกการเปลี่ยนแปลง
- สำรองข้อมูลหรือกำหนดแผนย้อนกลับก่อนแก้ไขระบบ Production
กระบวนการในกลุ่มเหล่านี้ส่วนใหญ่เป็นสาเหตุของปัญหาหน่วยความจำไม่เพียงพอ (เรียงตามบทบาทของ Server):
Load Balancer
จัดสรร RAM เพิ่มเติมให้กับ Node ที่เกี่ยวข้อง - บริการนี้อาจต้องการ memory เพิ่มเติมสำหรับการทำงานปกติ
ApplicationServer
รายการด้านล่างจะแสดงคำแนะนำทั่วไปเกี่ยวกับการจัดการปัญหาหน่วยความจำไม่เพียงพอ โดยพิจารณาจากภาษาโปรแกรมที่ใช้ตลอดจนวิธีแก้ไขที่เหมาะสมสำหรับกระบวนการที่เกี่ยวข้องกับความต้องการมากที่สุด:
- ชวา
คำแนะนำทั่วไป
ตรวจสอบการกำหนดค่าการจัดการหน่วยความจำหลักสำหรับเครื่อง Java ของคุณและหากจำเป็นให้ปรับเปลี่ยนตามความต้องการของ Application ของคุณ เช่น:
ชวา -Xmx2048m -Xms256m
โดยที่: - เอ็กซ์เอ็มเอ็กซ์flag ระบุหน่วยความจำฮีปหน่วยความจำสูงสุดที่สามารถจัดสรรให้กับ Java Virtual Machine (JVM)
- Xmsflag กำหนดสระว่ายน้ำการจัดสรรหน่วยความจำเริ่มต้น
อ้างอิงถึงเอกสารอย่างเป็นทางการสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดการหน่วยความจำจาวาระบบ
เคล็ดลับ:Ruk-Com Cloud ยังใช้การจัดการหน่วยความจำแบบอัตโนมัติที่ช่วยเสริม Java container โดยใช้คนเก็บขยะคุณสามารถปรับแต่งการตั้งค่าได้โดยพิจารณาจาก Application ของคุณโดยเฉพาะเพื่อหลีกเลี่ยงปัญหา OOM และใช้หน่วยความจำอย่างมีประสิทธิภาพมากขึ้น
นอกจากนี้ พิจารณาด้วยว่า JVM ต้องการหน่วยความจำที่มากกว่า heap - อ่านโครงสร้างหน่วยความจำ Javaเพิ่มเติมเพื่อรับข้อมูลเชิงลึกที่ลึกซึ้งยิ่งขึ้น
- PHP
คำแนะนำทั่วไป
1. หากเกิดปัญหาขึ้นกับบริการของ httpd (httpd.itk) ให้ปรับ Parameter การจัดการหน่วยความจำ Server ดังนี้
- ตรวจสอบจำนวนของ RAM ที่ใช้เฉลี่ยในแต่ละhttpdInstance
- ลบเครื่องหมายการกำหนดค่าอัตโนมัติของ Ruk-Com PaaSภานในไฟล์/etc/httpd/httpd.conf
- ลดค่าServer จำกัดและMaxClientsตามที่กำหนด:(Total_RAM - 5%) / Average_RAM
เพิ่มเติม:ในกรณีที่คุณสังเกตเห็นการเติบโตของการใช้หน่วยความจำต่อ Instance (การรั่วไหล) อย่างต่อเนื่องคุณจะต้องลดค่าMaxRequestsPerChild(เหลือประมาณ 1, 000-5, 000)
2. สำหรับกระบวนการ NGINX ให้เชื่อมต่อกับ Container ของคุณผ่าน SSH และตรวจสอบขนาดของ Instance php-fpm (เช่น ps หรือเครื่องมือชั้นนำ):
- หากใช้ RAM ทั้งหมด ~ 50-100Mb ให้ปิดใช้งานการกำหนดค่าอัตโนมัติและลด Parameter max_children
- หากขนาดของ Instance แตกต่างกันอย่างมากหรือมากกว่า 200-300Mb กระบวนการอาจจะรั่ว คุณต้องตรวจสอบและเพิ่มประสิทธิภาพ Code หรือปิด การกำหนดค่าอัตโนมัติและลด Parameter max_requests_per_child
- ทับทิม
คำแนะนำทั่วไป
ปัญหาหน่วยความจำรั่วเป็นเรื่องปกติสำหรับ Ruby ดังนั้นสิ่งแรกที่ควรทำคือพิจารณาตรวจสอบและเพิ่มประสิทธิภาพ Code ของคุณหรือลองเพิ่มขีดจำกัด RAM สำหรับ Instance
- หลาม
คำแนะนำทั่วไป
1. หากเกิดปัญหาขึ้นกับบริการของ httpd (httpd.itk) ให้ปรับ Parameter การจัดการหน่วยความจำ Server ดังนี้:
- ตรวจสอบจำนวนของ RAM ที่ใช้เฉลี่ยแต่ละ Instance
- ลบเครื่องหมายการกำหนดค่าอัตโนมัติของ Ruk-Com PaaSภานในไฟล์/etc/httpd/httpd.conf
- ลดค่าServer จำกัด และMaxClientsตามที่กำหนด:(Total_RAM - 5%) / Average_RAM
เพิ่มเติม:ในกรณีที่คุณสังเกตเห็นการเติบโตของการใช้หน่วยความจำต่อ Instance (การรั่วไหล) อย่างต่อเนื่องคุณจะต้องลดค่าMaxRequestsPerChild(เหลือประมาณ 1, 000-5, 000)
2. อีกทางหนึ่งให้จัดสรร RAM เพิ่มเติมให้กับ node - กระบวนการหลักของ Python อาจต้องการหน่วยความจำเพิ่มขึ้นสำหรับการทำงานปกติ
- NodeJS
คำแนะนำทั่วไป
Restart Container เพื่อกู้คืน kill process(es) หากปัญหาเกิดซ้ำอีก - ให้จัดสรร RAM เพิ่มเติมให้กับ node Application อาจต้องการหน่วยความจำเพิ่มขึ้นสำหรับการทำงานปกติ
ServerDatabase
รายการด้านล่างจะแสดง DB Stack พร้อมกับคำแนะนำทั่วไปเกี่ยวกับปัญหา OOM ตลอดจนวิธีการแก้ไขสำหรับ killed processes โดยเฉพาะ
- MySQL
คำแนะนำทั่วไป
- หากใช้ InnoDB engine (ฝังตั้งแต่ MySQL เวอร์ชัน 5.5) ให้ตรวจสอบขนาดบัฟเฟอร์ด้วยคำสั่งนี้:
แสดงสถานะเครื่องยนต์ INNODB\G;
ในกรณีที่มีค่าบัฟเฟอร์สูง (มากกว่า 80% ของ RAM Container ทั้งหมด) ให้คุณลดขนาดของ pool ที่อนุญาตด้วย Parameter innodb_buffer_pool_size ในไฟล์/etc/my.cnfมิฉะนั้น ให้จัดสรร RAM เพิ่มเติมให้กับ Server - ตรวจสอบ MySQL log เพื่อดูคำเตือนและคำแนะนำ
- MongoDB
คำแนะนำทั่วไป
หากเกิดปัญหาขึ้นกับบริการของhttpdให้ปรับ Parameter การจัดการหน่วยความจำ Server ดังนี้:
- ตรวจสอบจำนวนของ RAM ที่ใช้เฉลี่ยแต่ละ Instance
- ลบเครื่องหมายการกำหนดค่าอัตโนมัติของ Ruk-Com PaaSภานในไฟล์/etc/httpd/httpd.conf
- ลดค่า Server จำกัดและMaxClientsตามที่กำหนด:(Total_RAM - 5%) / Average_RAM
เพิ่มเติม:ในกรณีที่คุณสังเกตเห็นการเติบโตของการใช้หน่วยความจำต่อ Instance (การรั่วไหล) อย่างต่อเนื่องคุณจะต้องลดค่าMaxRequestsPerChild(เหลือประมาณ 1, 000-5, 000)
- PostgreSQL
คำแนะนำทั่วไป
จัดสรร RAM เพิ่มเติมให้กับ Node ที่เกี่ยวข้อง - บริการนี้อาจต้องการ memory เพิ่มเติมสำหรับการทำงานปกติ
- เรดิส
คำแนะนำทั่วไป
จัดสรร RAM เพิ่มเติมให้กับ Node ที่เกี่ยวข้อง - บริการนี้อาจต้องการ memory เพิ่มเติมสำหรับการทำงานปกติ
การดำเนินการทั่วไปสำหรับ Stack ประเภทต่างๆ
คำแนะนำทั่วไป
กระบวนการในส่วนนี้สามารถรันได้และต่อมาจะถูกทำลายภายใน Node ประเภทต่างๆ ดังนั้นการแก้ปัญหาของ OOM จึงแตกต่างกันไปและขึ้นอยู่กับกระบวนการ - ดูตารางด้านล่างเพื่อหาคำแนะนำที่เหมาะสม
