--shm-size 是什么
--shm-size 设置容器内 /dev/shm 的大小,默认 64m。/dev/shm 是基于内存的临时文件系统,浏览器内核渲染、数据库与多进程服务常因共享内存不足失败,表现是进程莫名崩溃、日志含糊。需要时显式放大,并把它纳入内存预算。
基本信息
| 语法 | --shm-size=512m |
|---|---|
| 默认值 | 64m |
| 底层实现 | 基于内存的临时文件系统 |
| 内存计量 | 计入容器内存限制 |
| 适用平台 | Linux 容器为主,其他平台按各自说明 |
典型使用场景
- 无头浏览器渲染容器:页面复杂时共享内存不够会直接崩溃
- 数据库容器:共享内存是连接与排序缓冲的重要来源
- 多进程应用:进程间共享大块数据时需要更大的共享内存
- 排障:应用出现难以复现的崩溃时先确认共享内存是否够用
- 性能调优:让共享内存容量与并发规模匹配
设置与核对
设置与核对
docker run -d --shm-size=512m --name chrome browser/headless:126
docker exec chrome df -h /dev/shm # 核对容器内共享内存容量
docker inspect -f '{{.HostConfig.ShmSize}}' chrome # 核对配置值
docker run -d --shm-size=1g --memory=2g --name api app/api:1.4.2 # 与内存预算一起评估调整前后要注意
| 关注点 | 默认表现 | 调整后注意 |
|---|---|---|
| 容量 | 64m,复杂场景容易不够 | 调大要同步核对内存预算 |
| 内存计量 | 计入容器内存 | 可能更早触发 OOM |
| 数据生命周期 | 随容器生命周期存在 | 重建即清空 |
| 平台差异 | 非 Linux 行为不同 | 按平台说明核对 |
临时文件系统的页计入容器内存限制,设了内存上限时调大共享内存等于压缩应用可用内存,两件事要一起评估。
无头浏览器类容器最容易踩这个默认值:表现是莫名其妙的渲染崩溃且日志含糊,排查时先看共享内存容量。
调大共享内存后没有同步检查内存上限,容器会更早触发 OOM,却被归咎于应用缺陷,容量调整要成对进行。
共享内存内容随容器生命周期存在,容器重建即清空;需要跨重启保留的数据要放到卷而不是共享内存。
共享内存只是进程间通信的一种方式,某些应用改用文件或套接字通信也能绕开容量限制,但改造成本通常高于直接调大参数。