共享内存不够会直接崩
容器内的 /dev/shm 默认只有 64MB,浏览器内核、数据库的并行查询与图像处理都会大量使用共享内存。空间不足时通常不是返回一个清晰的错误,而是渲染进程或查询进程直接异常退出,日志里往往只有一条与共享内存相关的提示。compose 里用 shm_size 调整大小,对应命令行参数是 --shm-size,单位可以用 mb、gb 或直接写字节数。
基本信息
| 字段 | shm_size: 1gb 或 536870912 形式 |
|---|---|
| 默认值 | 64MB |
| 命令行对应 | docker run --shm-size=1g |
| 计费方式 | 共享内存计入容器内存用量,受内存限制约束 |
典型使用场景
- 浏览器自动化:无头浏览器渲染大页面时频繁崩溃,先看 /dev/shm 大小
- 数据库并行:查询并发高时出现共享内存分配失败
- 图像与视频处理:大帧缓冲需要更多共享内存
- 压测前的容量核对:把共享内存的额外开销算进容器内存预算
- 崩溃分析:进程异常退出但日志无异常的,检查共享内存是否撞到上限
配置与验证
配置与验证
services:
chrome:
image: selenium/standalone-chrome
shm_size: 1gb # 无头浏览器常见配置
db:
image: postgres:16-alpine
shm_size: 256m # 并行查询需要的共享内存
# 验证容器内实际大小
# docker exec chrome df -h /dev/shm按服务类型取值
| 服务类型 | 典型需求 | 建议起点 |
|---|---|---|
| 无头浏览器 | 页面渲染需要较大共享内存 | 1gb 起,按并发数上调 |
| 数据库 | 并行查询与哈希聚合 | 256m 起,结合并发度调整 |
| 图像与视频处理 | 大尺寸帧缓冲 | 按单帧大小乘并发估算 |
| 普通业务服务 | 几乎没有共享内存需求 | 保持默认,避免浪费内存预算 |
共享内存算在容器内存额度里,设置内存上限时要把这块一起算进去,否则会出现内存超限被杀的连带问题。
另一种常见做法是把共享内存目录改为内存态挂载,效果类似但语义不同;用 shm_size 更直接,也更容易在编排文件里统一管理。