Skip to main content

ทำความเข้าใจเกี่ยวกับ Shared memory size (--shm-size) และผองเพื่อนใน Docker

Kongvut Sangkla

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

--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")

References

Loading...