本文于 2026-09-11 08:44 更新,部分内容具有时效性,如有失效,请留言
PostgreSQL执行查询、建索引或维护任务时,如果报 could not resize shared memory segment 并带有 No space left on device,在容器环境里常见原因不是数据盘已满,而是 /dev/shm 这类动态共享内存空间不足。
先区分主机内存、数据卷磁盘与容器共享内存三个不同资源。 盲目清理数据库文件既危险,也通常无法解决这条错误。

先确认错误与触发操作
保留PostgreSQL日志中的完整错误、段名称、请求大小和SQL类型,再检查当前共享内存实现与并行设置:
SHOW dynamic_shared_memory_type;
SHOW max_parallel_workers_per_gather;
SHOW max_parallel_maintenance_workers;
PostgreSQL官方文档说明,动态共享内存可使用POSIX、System V、Windows或mmap等实现,具体可用值与平台有关。Linux上的POSIX动态共享内存通常会反映到 /dev/shm,并行查询在启动额外工作进程时可能申请更多空间。
还要记录故障是普通SELECT、CREATE INDEX、VACUUM还是其他维护任务触发。不要只凭错误文本永久关闭所有并行能力;应先确认是容量不足、inode不足、挂载异常还是并发工作负载过高。
检查容器内的/dev/shm
在PostgreSQL实际运行的容器中检查容量、使用量、inode和挂载类型:
docker exec postgres df -h /dev/shm
docker exec postgres df -i /dev/shm
docker exec postgres mount | grep ' /dev/shm '
docker exec postgres ls -lah /dev/shm
再从宿主机读取容器配置的共享内存字节数:
docker inspect --format '{{.HostConfig.ShmSize}}' postgres
Docker官方CLI文档说明,未指定 --shm-size 时容器默认共享内存大小为64m。不同编排平台可能使用不同默认值和配置入口,不能把64m当成所有容器环境的统一结论。