could not resize shared memory segment “/PostgreSQL.XXXXXX“ to XXXXX bytes: No space left on device
·
环境
系统平台:UOS(海光),银河麒麟svs(X86_64),银河麒麟(龙芯)svs,银河麒麟(飞腾)svs,银河麒麟 (X86_64),银河麒麟 (飞腾),银河麒麟 (鲲鹏),银河麒麟 (海光)
版本:4.5.8,4.5.10
症状
数据库部署在docker容器中,业务程序在执行sql时报错:
could not resize shared memory segment "/PostgreSQL.XXXXXX" to XXXXX bytes: No space left on device
问题原因
Docker 容器设置的共享内存(/dev/shm)过小,默认为64MB,而数据库在执行大查询、并行操作时需要更大的共享内存空间,导致内存分配失败,触发报错。
解决方案
Docker 的–shm-size(共享内存配置)属于容器「创建级参数」,运行中的容器无法直接修改,必须通过重建容器使配置永久生效;
设置 --shm-size 需遵循以下规则,避免配置过大浪费资源或过小仍触发报错:
-
最小值要求: 必须大于数据库 shared_buffers 配置值(瀚高数据库默认 shared_buffers 通常为容器分配内存的1/4,需以实际配置为准);
-
容量上限: 共享内存大小需小于宿主机物理内存的 50%,防止容器占用过多内存导致宿主机资源耗尽;
-
参考值: 建议设置为 shared_buffers + 动态共享内存预留空间(通常推荐 2GB~4GB,需结合宿主机内存和业务负载调整)。
具体配置方案如下:
方案 1:Docker Run 启动(单容器部署)
在启动命令中显式指定–shm-size参数扩容共享内存:
docker run -dit \
--name=hgdb458 \
-p 5866:5866 \
--restart always \
--memory=16g \ #为容器分配16GB内存(根据宿主机资源调整)
--cpus=8 \ # 限制容器CPU核心数
--shm-size=6g \ # 按规则计算(16GB*1/4 + 2GB预留 = 6GB)
-e HGDB_PASSWORD=your_password \ # 补充必要环境变量
-v /data/docker/hgdb4588/data:/opt/highgo/hgdb-see-4.5.8/data \ # 建议挂载数据卷,避免数据丢失(根据实际路径配置)
-v /data/docker/hgdb4588/license:/opt/highgo/hgdb-see-4.5.8/etc/lic \ #建议挂载数据卷,方便后期授权更新(根据实际路径配置)
xxxxxxxxx \ #替换实际使用镜像id
postgres
方案 2:Docker Compose 启动(多容器 / 标准化部署)
在docker-compose.yml中添加shm_size配置项:
yaml:
version: 'xx' # Compose版本
services:
hgdb458:
image: xxxxxxxx # 替换为实际镜像
container_name: hgdb458
ports:
- "5866:5866"
deploy:
resources:
limits:
memory: 16g # 为容器分配16GB内存(根据宿主机资源调整)
cpus: '8' # 限制容器CPU核心数
shm_size: 6gb # 按规则计算(16GB*1/4 + 2GB预留 = 6GB)
restart: always
environment:
- HGDB_PASSWORD=your_password # 补充必要环境变量
volumes:
- /data/docker/hgdb4588/data:/opt/highgo/hgdb-see-4.5.8/data # 建议挂载数据卷,避免数据丢失(根据实际路径配置)
- /data/docker/hgdb4588/license:/opt/highgo/hgdb-see-4.5.8/etc/lic # 建议挂载数据卷,方便后期授权更新(根据实际路径配置)
......
更多推荐


所有评论(0)