docker SHM_SIZE / dev / shm:调整共享内存的大小

时间:2019-07-01 17:31:33

标签: postgresql docker docker-compose

我想从默认postgres调整64M容器共享内存的大小。所以我添加:

build:
      context: .
      shm_size: '2gb'

我正在使用撰写文件postgres服务定义的3.6版。

version: "3.6"

services:

 #other services go here..
 postgres:
    restart: always
    image: postgres:10
    hostname: postgres
    container_name: fiware-postgres
    expose:
      - "5432"
    ports:
      - "5432:5432"
    networks:
      - default
    environment:
      - "POSTGRES_PASSWORD=password"
      - "POSTGRES_USER=postgres"
      - "POSTGRES_DB=postgres"
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    build:
      context: .
      shm_size: '2gb'

但是,即使重新启动服务docker-compose down,然后重新启动up,此更改也不会生效。因此,我立即开始与postgres进行交互以在仪表板上显示一些数据,但出现共享内存问题。

在仪表板吃午餐之前:

$docker exec -it fiware-postgres df -h
Filesystem                                                                                        Size  Used Avail Use% Mounted on
/dev/mapper/docker-253:1-107615-1541c55e4c3d5e03a7716d5418eea4c520b6556a6fd179c6ab769afd0ce64d9f   10G  266M  9.8G   3% /
tmpfs                                                                                              64M     0   64M   0% /dev
tmpfs                                                                                             1.4G     0  1.4G   0% /sys/fs/cgroup
/dev/vda1                                                                                         197G   52G  136G  28% /etc/hosts
shm                                                                                                64M  8.0K   64M   1% /dev/shm
tmpfs                                                                                             1.4G     0  1.4G   0% /proc/acpi
tmpfs                                                                                             1.4G     0  1.4G   0% /proc/scsi
tmpfs                                                                                             1.4G     0  1.4G   0% /sys/firmware

午餐后,仪表板:

$docker exec -it fiware-postgres df -h
Filesystem                                                                                        Size  Used Avail Use% Mounted on
/dev/mapper/docker-253:1-107615-1541c55e4c3d5e03a7716d5418eea4c520b6556a6fd179c6ab769afd0ce64d9f   10G  266M  9.8G   3% /
tmpfs                                                                                              64M     0   64M   0% /dev
tmpfs                                                                                             1.4G     0  1.4G   0% /sys/fs/cgroup
/dev/vda1                                                                                         197G   52G  136G  28% /etc/hosts
shm                                                                                                64M   50M   15M  78% /dev/shm
tmpfs                                                                                             1.4G     0  1.4G   0% /proc/acpi
tmpfs                                                                                             1.4G     0  1.4G   0% /proc/scsi
tmpfs                                                                                             1.4G     0  1.4G   0% /sys/firmware

postgres错误日志:

2019-07-01 17:27:58.802 UTC [47] ERROR:  could not resize shared memory segment "/PostgreSQL.1145887853" to 12615680 bytes: No space left on device

这是怎么回事?

2 个答案:

答案 0 :(得分:2)

发生这种情况是因为 Postgres 向共享内存(Linux 下的 /dev/shm)写入了超过 64MB。在 Linux 默认设置下,最大共享内存大小为 64M。

我们可以使用以下命令来验证这一点:

0d807385d325:/usr/src# df -h | grep shm
shm             64.0M     0  64.0M   0% /dev/shm

并且我们可以通过配置 docker-compose.yml 手动调整最大共享内存,例如(调整为 4MB,https://docs.docker.com/compose/compose-file/compose-file-v3/#shm_size):

services:
  my_service:
    ....
    tty: true
    shm_size: '4mb'

改成4MB后,再次验证:

0d807385d325:/usr/src# df -h | grep shm
shm             4.0M     0  4.0M   0% /dev/shm

在此之后,我们无法将超过 4MB 的数据写入共享内存设备:

# write 4MB (1kb * 4096) to /dev/shm/test file succeeds
0d807385d325:/usr/src# dd if=/dev/zero of=/dev/shm/test bs=1024 count=4096 
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.0042619 s, 984 MB/s


# write 4.001MB (1kb * 4097) to /dev/shm/test file fails
0d807385d325:/usr/src# dd if=/dev/zero of=/dev/shm/test bs=1024 count=4097 
dd: error writing '/dev/shm/test': No space left on device
4097+0 records in
4096+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.0041456 s, 1.0 GB/s

为了解决这个问题,我们只需将该值调整为更大的值。

  1. 对于docker run,我们可以使用--shm-size来调整它(https://docs.docker.com/engine/reference/commandline/run/)

  2. 对于 docker-compose,我们可以使用 docker-compose 文件中的 shm_size 选项像上面一样调整它(https://docs.docker.com/compose/compose-file/compose-file-v3/#shm_size

  3. 对于 Kubernetes,我们必须使用 Kubernetes 中的 emptyDir 选项 (https://kubernetes.io/docs/concepts/storage/volumes/#emptydir)。

基本上,我们需要:

  1. 添加一个新的 emptyDir 卷,以“Memory”为介质
volumes:                          
    - name: dshm
      emptyDir:
        medium: Memory
  1. 将其安装到 Stonewave 容器的 /dev/shm
volumeMounts:                 
        - mountPath: /dev/shm
          name: dshm

根据 Kubernetes 的文档 (https://kubernetes.io/docs/concepts/storage/volumes/#emptydir),默认情况下它将使用 50% 的内存作为最大值。

<块引用>

如果启用了 SizeMemoryBackedVolumes 功能门,您可以指定内存支持卷的大小。如果未指定大小,则内存支持卷的大小为 Linux 主机上内存的 50%。

参考文献:

答案 1 :(得分:1)

您在shm_size中设置了build,这只会影响构建,您需要在服务级别中对其进行设置,如下所示:

docker-compose.yaml:

version: "3.6"

services:

 #other services go here..
 postgres:
    restart: always
    image: postgres:10
    hostname: postgres
    container_name: fiware-postgres
    expose:
      - "5432"
    ports:
      - "5432:5432"
    networks:
      - default
    environment:
      - "POSTGRES_PASSWORD=password"
      - "POSTGRES_USER=postgres"
      - "POSTGRES_DB=postgres"
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    build:
      context: .
      shm_size: 256mb
    shm_size: 512mb

Dockerfile:

FROM postgres:10

RUN df -h | grep shm

然后,docker-compose up -d --build将其启动并检查:

shubuntu1@shubuntu1:~/66$ docker-compose --version
docker-compose version 1.24.0, build 0aa59064
shubuntu1@shubuntu1:~/66$ docker-compose up -d --build
Building postgres
Step 1/2 : FROM postgres:10
 ---> 0959974989f8
Step 2/2 : RUN df -h | grep shm
 ---> Running in 25d341cfde9c
shm             256M     0  256M   0% /dev/shm
Removing intermediate container 25d341cfde9c
 ---> 1637f1afcb81

Successfully built 1637f1afcb81
Successfully tagged postgres:10
Recreating fiware-postgres ... done
shubuntu1@shubuntu1:~/66$ docker exec -it fiware-postgres df -h | grep shm
shm             512M  8.0K  512M   1% /dev/shm

您可以在构建时看到它显示256m,但是在运行时容器中显示512m