# รายงานการตรวจสอบปัญหา 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*