ศูนย์คู่มือ Ruk-Com PaaS

คู่มือการพัฒนา Deploy และดูแล Application บน Platform

RUK-COM PAAS / APPLICATION SETTINGS

แก้ปัญหา 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

คำแนะนำทั่วไป

  1. หากใช้ InnoDB engine (ฝังตั้งแต่ MySQL เวอร์ชัน 5.5) ให้ตรวจสอบขนาดบัฟเฟอร์ด้วยคำสั่งนี้:
    แสดงสถานะเครื่องยนต์ INNODB\G;
    ในกรณีที่มีค่าบัฟเฟอร์สูง (มากกว่า 80% ของ RAM Container ทั้งหมด) ให้คุณลดขนาดของ pool ที่อนุญาตด้วย Parameter innodb_buffer_pool_size ในไฟล์/etc/my.cnfมิฉะนั้น ให้จัดสรร RAM เพิ่มเติมให้กับ Server
  2. ตรวจสอบ 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 จึงแตกต่างกันไปและขึ้นอยู่กับกระบวนการ - ดูตารางด้านล่างเพื่อหาคำแนะนำที่เหมาะสม