ari*_*wan 4 postgresql docker docker-compose
我想postgres
从 default调整容器的共享内存大小64M
。所以我补充说:
build:
context: .
shm_size: '2gb'
Run Code Online (Sandbox Code Playgroud)
我正在使用 3.6 版的撰写文件postgres
服务定义。
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'
Run Code Online (Sandbox Code Playgroud)
但是,这种变化不会生效,即使我重新启动该服务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
Run Code Online (Sandbox Code Playgroud)
午餐后仪表板:
$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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
nyb*_*bon 11
发生这种情况是因为 Postgres 向共享内存写入了超过 64MB(/dev/shm
在 Linux 下)。在默认的 Linux 设置中,最大共享内存大小为 64M。
确认
0d807385d325:/usr/src# df -h | grep shm
shm 64.0M 0 64.0M 0% /dev/shm
Run Code Online (Sandbox Code Playgroud)
services:
my_service:
....
tty: true
shm_size: '4mb'
Run Code Online (Sandbox Code Playgroud)
0d807385d325:/usr/src# df -h | grep shm
shm 4.0M 0 4.0M 0% /dev/shm
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
修复此问题
我们只需将这个值调整为一个更大的值即可。
对于docker run
,我们可以使用--shm-size
来调整它(https://docs.docker.com/engine/reference/commandline/run/)
对于 docker-compose,我们可以使用shm_size
docker-compose 文件中的选项来调整它,如上所示(https://docs.docker.com/compose/compose-file/compose-file-v3/#shm_size)
对于 Kubernetes,我们必须使用emptyDir
Kubernetes 中的选项(https://kubernetes.io/docs/concepts/storage/volumes/#emptydir)。基本上,我们需要:
3.1) 添加一个emptyDir
以“Memory”为介质的新卷
volumes:
- name: dshm
emptyDir:
medium: Memory
Run Code Online (Sandbox Code Playgroud)
3.2)将其安装到/dev/shm
stonewave容器上
volumeMounts:
- mountPath: /dev/shm
name: dshm
Run Code Online (Sandbox Code Playgroud)
根据 Kubernetes 的文档(https://kubernetes.io/docs/concepts/storage/volumes/#emptydir),默认情况下它将使用 50% 的内存作为最大值。
如果启用了 SizeMemoryBackedVolumes 功能门,您可以指定内存支持卷的大小。如果未指定大小,则内存支持卷的大小将为 Linux 主机上内存的 50%。
参考
您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
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM postgres:10
RUN df -h | grep shm
Run Code Online (Sandbox Code Playgroud)
然后,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
Run Code Online (Sandbox Code Playgroud)
您可以在构建时看到它显示的内容256m
,但它显示的是运行时容器512m
。
归档时间: |
|
查看次数: |
9657 次 |
最近记录: |