Docker的shm-size配置是否受容器deploy内存限制约束?
答案
该配置的实际内存表现属于第三种:其他内存占用场景,具体规则如下:
- 第二个选项的描述完全不成立:容器内的
/dev/shm是属于容器命名空间的tmpfs临时文件系统,产生的内存占用全额计入容器的cgroup内存配额,不会在你设置的内存限制之外额外占用宿主机内存,不存在所谓独立内存池的设计。 - 第一个选项的总内存上限描述正确,但内存分配逻辑有误:
shm_size: '2gb'只是给/dev/shm设置了最高可用容量阈值,不是容器启动时就从总内存里预划2GB固定给共享内存。tmpfs本身是按需申请内存的,只有进程实际往/dev/shm写数据时才会占用对应空间,这部分开销和Postgres进程运行内存、文件页缓存等所有容器内的内存消耗一起,共享24GB的总硬限额:- 如果实际共享内存只用了500MB,那Postgres等进程最多可以用23.5GB内存
- 如果共享内存用量摸到了2GB的shm上限,此时进程可使用的剩余内存就是22GB
- 所有内存消耗加总一旦碰到24GB的总限制,就会触发OOM杀死容器内进程
- 额外提一个配置生效的差异点:
deploy.resources.limits.memory配置最初仅在Swarm模式下通过docker stack deploy部署时生效,较新版本的Docker Compose V2虽然已经兼容非Swarm模式下的该配置,但如果是老版本Compose或者用经典的docker-compose(V1)启动,这个24GB的内存限制不会生效,此时容器可使用宿主机全部空闲内存,仅/dev/shm的2GB容量限制正常生效。
内容的提问来源于stack exchange,提问作者nluk
相关产品推荐
相关产品推荐

