hrms-api-org/docs/hrms-api-org-error-report.md
waruneeauy 519fd97968
All checks were successful
Build & Deploy on Dev / build (push) Successful in 1m2s
fix performance
2026-04-30 16:35:00 +07:00

7.2 KiB

รายงานการตรวจสอบปัญหา Service hrms-api-org

วันที่ตรวจสอบ: 30 เมษายน 2026 เครื่องเป้าหมาย: 192.168.1.63 (hrms) Service: hrms-api-org Container Image: forgejo.chamomind.com/hrms-bangkok/hrms-api-org:v1.1.64


สรุปสถานะปัญหา

รายการ สถานะ
Container Status Running (ถูก restart เมื่อ 3 ชั่วโมงก่อน)
Memory Usage 144.2 MiB / 2 GiB (7.04%)
CPU Usage 0.02%
สถานะหลัก พบปัญหา Memory Leak และ Heap Overflow

รายละเอียดปัญหา

1. JavaScript Heap Out of Memory (รุนแรง)

ข้อความ Error:

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

สาเหตุ:

  • Node.js default heap size ~1GB
  • ระหว่างประมวลผล batch_update_posMasters มีข้อมูลจำนวนมาก:
    • posMaster count: 22,635 records
    • historyCreateIds: 17,554 records
    • posMasterAssigns: 1,141 records
  • Garbage Collection ทำงานหนักเกินไป:
    Mark-Compact 1007.9 (1042.1) -> 1001.0 (1043.6) MB, 262.34 / 0.00 ms
    
  • การประมวลผลใช้เวลานาน (48.9 วินาที ในครั้งแรก)

ผลกระทบ:

  • Application crash และ restart อัตโนมัติ
  • ข้อมูลที่กำลังประมวลผลอาจสูญหายหรือไม่สมบูรณ์

2. AMQ Channel Timeout (RabbitMQ)

ข้อความ Error:

Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message
"PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out.
Timeout value used: 1800000 ms (30 นาที)"

สาเหตุ:

  • Process ค้างเนื่องจาก heap overflow
  • ไม่สามารถ acknowledge message ภายใน timeout period (30 นาที)
  • RabbitMQ ปิด connection เนื่องจากถือว่า consumer ไม่ตอบสนอง

3. Container Restart Loop

หลักฐาน:

hrms-api-org   Up 2 hours (restart 3 hours ago)
  • Container ถูก restart เมื่อประมาณ 3 ชั่วโมงก่อน
  • ปัจจุบันใช้งานได้ปกติ แต่มีความเสี่ยงที่จะเกิดปัญหาซ้ำ
  • เมื่อมี workload หนักเข้า อาจเกิด heap overflow ซ้ำอีก

วิธีแก้ไขปัญหา

วิธีที่ 1: เพิ่ม Node.js Heap Size (แนะนำ)

แก้ไขไฟล์ /home/dev/repo/compose.yaml เพิ่ม NODE_OPTIONS environment variable:

hrms-api-org:
  container_name: hrms-api-org
  image: ${GITEA_INSTANCE}/hrms-bangkok/hrms-api-org:${API_ORG}
  restart: unless-stopped
  deploy:
    resources:
      limits:
        memory: 2G
  ports:
    - "20201:13001"
    - "20401:13002"
  env_file:
    - .env
  environment:
    DB_NAME: hrms_organization
    # เพิ่มบรรทัดนี้เพื่อขยาย heap size เป็น 1.5GB
    NODE_OPTIONS: --max-old-space-size=1536

คำสั่ง apply:

cd /home/dev/repo
docker compose pull hrms-api-org
docker compose up -d hrms-api-org

วิธีที่ 2: เพิ่ม Docker Memory Limit

หากวิธีที่ 1 ยังไม่พอ ให้เพิ่ม memory limit เป็น 4GB:

hrms-api-org:
  container_name: hrms-api-org
  image: ${GITEA_INSTANCE}/hrms-bangkok/hrms-api-org:${API_ORG}
  restart: unless-stopped
  deploy:
    resources:
      limits:
        memory: 4G  # เพิ่มจาก 2G เป็น 4G
  ports:
    - "20201:13001"
    - "20401:13002"
  env_file:
    - .env
  environment:
    DB_NAME: hrms_organization
    NODE_OPTIONS: --max-old-space-size=3072  # 75% ของ 4GB

วิธีที่ 3: ปรับปรุง Query Logic (ระยะยาว)

ปัญหานี้เกิดจากการโหลดข้อมูลจำนวนมากในครั้งเดียว แนะนำให้:

  1. ใช้ Pagination สำหรับ batch_update_posMasters
  2. แบ่ง batch ให้เล็กลง (เช่น ทำละ 1,000 records)
  3. ใช้ Streaming แทนการโหลดทั้งหมดลง memory
  4. เพิ่ม Connection Pool ขนาดเพื่อให้ query เร็วขึ้น

ต้องแก้ไขที่ source code ของ hrms-api-org


ขั้นตอนการแก้ไขด่วน (Immediate Fix)

SSH ไปที่เครื่อง hrms:

ssh -i ~/.ssh/id_warunee dev@192.168.1.63

แก้ไขไฟล์ compose.yaml:

cd /home/dev/repo
vi compose.yaml

เพิ่ม NODE_OPTIONS: --max-old-space-size=1536 ใน environment section ของ hrms-api-org

Deploy ใหม่:

./deploy.sh hrms-api-org

หรือ:

docker compose pull hrms-api-org
docker compose up -d hrms-api-org

ตรวจสอบสถานะ:

docker logs -f hrms-api-org

การตรวจสอบหลังแก้ไข

หลังจากแก้ไขแล้ว ให้ตรวจสอบ:

# ตรวจสอบสถานะ container
docker ps | grep hrms-api-org

# ตรวจสอบ log ล่าสุด
docker logs --tail 100 hrms-api-org

# ตรวจสอบ resource usage
docker stats hrms-api-org --no-stream

สัญญาณที่ดี:

  • ไม่พบข้อความ "JavaScript heap out of memory"
  • ไม่พบ "PRECONDITION_FAILED" error
  • batch_update_posMasters ใช้เวลาน้อยลง

สรุป

ประเด็น รายละเอียด
ปัญหาหลัก JavaScript Heap Out of Memory
ความรุนแรง High - ทำให้ service restart
วิธีแก้ไขด่วน เพิ่ม NODE_OPTIONS=--max-old-space-size=1536
วิธีแก้ไขระยะยาว ปรับปรุง query logic ให้ใช้ memory น้อยลง
ปัจจัยเสี่ยง ข้อมูล 22,635+ records ถูกโหลดพร้อมกัน

เอกสารอ้างอิง


รายงานนี้จัดทำโดย Claude Code Security Audit Specialist