环境

系统平台: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  # 建议挂载数据卷,方便后期授权更新(根据实际路径配置)
     ......
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐