All checks were successful
Build & Deploy on Dev / build (push) Successful in 1m2s
7.2 KiB
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 (ระยะยาว)
ปัญหานี้เกิดจากการโหลดข้อมูลจำนวนมากในครั้งเดียว แนะนำให้:
- ใช้ Pagination สำหรับ batch_update_posMasters
- แบ่ง batch ให้เล็กลง (เช่น ทำละ 1,000 records)
- ใช้ Streaming แทนการโหลดทั้งหมดลง memory
- เพิ่ม 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 ถูกโหลดพร้อมกัน |
เอกสารอ้างอิง
- Node.js Heap Size: https://nodejs.org/docs/latest-v20.x/api/cli.html#--max-old-space-sizesize
- Docker Memory Limits: https://docs.docker.com/config/containers/resource_constraints/
- RabbitMQ Consumer Timeout: https://www.rabbitmq.com/consumers.html#acknowledgement-timeout
รายงานนี้จัดทำโดย Claude Code Security Audit Specialist