ทำความเข้าใจเกี่ยวกับ Shared memory size (--shm-size) และผองเพื่อนใน Docker
Table of contents
Intro
สวัสดีครับ บทความนี้จะพูดถึง shm (shared memory) ใน Docker ซึ่งเป็นการจัดการ Memory แบบหนึ่งใน Container เป็นบทความเสริมจาก "วิธีการจัดการ Resouces limits ของ CPU (cores) และ Memory ใน Docker containers"
โดยตามปกติค่าของ shm ของ Docker ได้กำหนด Default ไว้ที่ 64MB
และเพิ่มได้ด้วย Option --shm-size
หรือ shm_size
สำหร ับ Docker compose
shm คืออะไร
shm คือ Shared memory บน /dev/shm
โดยเป็น device ประเภทหนึ่งของ Linux ในรูปแบบ Temporary File System (tmpfs) ที่ทำงานบน inter-process communication (IPC)
โดย shm เป็นส่วนหนึ่งของ memory ที่สามารถเข้าถึงได้หลาย Processes (multiple processes) ซึ่งมักจะใช้เก็บข้อมูลที่ Shared ร่วมกันระหว่าง Processes เช่น buffers หรือ locks
ความสำคัญของ –shm-size ใน docker
โดยตามปกติค่าของ shm ของ Docker ได้กำหนด Default ไว้ที่ 64MB
และเ พิ่มได้ด้วย Option --shm-size
หรือ shm_size
สำหรับ Docker compose
--shm-size
flag ใน Docker สามารถระบุค่าขนาดของ Size ของ Shared memory โดยคุณสมบัตินี้มีประโยชน์สำหรับบาง Applications ที่มีการใช้ /dev/shm เช่น Databases หรือ Applications ที่มีความต้องการใช้การประมวลผลสูงบน in-memory
ถ้าไม่มี --shm-size
flag บางครั้ง Applications ที่มีความสามารถแบบ Parallel workers, Thereads, Multi-Process หรือจะเรียกอะไรก็แล้วแต่ ที่มีบางใช้ Shared memory ร่วมกันอาจจะเจอปัญหาเรื่อง Performance หรือบางที Application อาจจะ failure ไปเลยก็ได้เพราะ Shared memory ไม่เพียงพอ ตัวอย่าง Error logs ของ PostgreSQL database เมื่อ shm ไม่เพียงพอ
pq: could not resize shared memory segment "/PostgreSQL.2058389254" to 12615680 bytes: No space left on device
วิธีตรวจสอบ shm ใน Container
$ docker exec -it container_name df -h | grep shm
Filesystem Size Used Avail Use% Mounted on
shm 64M 0 64M 0% /dev/shm
การปรับขนาดของ –shm-size
$ docker run --shm-size=512M my_container
$ docker exec -it container_name df -h | grep shm
Filesystem Size Used Avail Use% Mounted on
shm 512M 0 512M 0% /dev/shm
สรุป
shm (--shm-size
) มีความสำคัญสำหรับ Performance กับบาง Applications ที่มีความสามารถแบบ Parallel workers, Thereads, Multi-Process หรือจะเรียกอะไรก็แล้วแต่ ที่ทำงานบน inter-process communication (IPC)
นอกจากนี้ยังมี swap (--memory-swap
) เมื่อ Container ทำงานเมื่อถึงจุด ๆ หนึ่งที่ Main memory (RAM) ไม่พอใช้ก็จะ swap ไปใช้ Virtual memory (RAM disk) แทน ซึ่งก็คนละตัวกับ shm ที่เป็น Shared memory ระหว่าง Process ก็อย่าเข้าใจผิดสลับกัน ("วิธีการจัดการ Resouces limits ของ CPU (cores) และ Memory ใน Docker containers")