All checks were successful
Build & Deploy on Dev / build (push) Successful in 1m2s
225 lines
7.2 KiB
Markdown
225 lines
7.2 KiB
Markdown
# รายงานการตรวจสอบปัญหา 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:
|
|
|
|
```yaml
|
|
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:**
|
|
```bash
|
|
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:
|
|
|
|
```yaml
|
|
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:**
|
|
```bash
|
|
ssh -i ~/.ssh/id_warunee dev@192.168.1.63
|
|
```
|
|
|
|
**แก้ไขไฟล์ compose.yaml:**
|
|
```bash
|
|
cd /home/dev/repo
|
|
vi compose.yaml
|
|
```
|
|
|
|
เพิ่ม `NODE_OPTIONS: --max-old-space-size=1536` ใน environment section ของ `hrms-api-org`
|
|
|
|
**Deploy ใหม่:**
|
|
```bash
|
|
./deploy.sh hrms-api-org
|
|
```
|
|
|
|
หรือ:
|
|
```bash
|
|
docker compose pull hrms-api-org
|
|
docker compose up -d hrms-api-org
|
|
```
|
|
|
|
**ตรวจสอบสถานะ:**
|
|
```bash
|
|
docker logs -f hrms-api-org
|
|
```
|
|
|
|
---
|
|
|
|
## การตรวจสอบหลังแก้ไข
|
|
|
|
หลังจากแก้ไขแล้ว ให้ตรวจสอบ:
|
|
|
|
```bash
|
|
# ตรวจสอบสถานะ 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*
|