背景
使用docker-compose
部署Redis
后,拉起服务后通过docker log
查看有异常报错。。。
内核参数 overcommit_memory
1 | WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. |
内核参数 overcommit_memory,它是内存分配的策略,可选值有:0、1、2。
- 0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
- 1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
- 2,表示内核允许分配超过所有物理内存和交换空间总和的内存。
step 1
修改配置文件 vim /etc/sysctl.conf
, 写入下面内容(注意是宿主机)
1 | ... |
step 2
使配置生效:
1 | sysctl -p |
TCP 连接数异常
1 | WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. |
解决
通过编辑/etc/sysctl.conf
,添加/修改net.core.somaxconn = 65535
,然后使其生效:
1 | sysctl -p |
但容器中还是会报错,也就是说修改宿主机并没有同步改变容器的这个值!
执行命令进行验证:
1 | docker exec -it redis-server cat /proc/sys/net/core/somaxconn |
会发现容器的这个值还是128
,需要修改docker-compose.yaml
,添加:
1 | sysctls: |
重启服务后问题解决,清净世界~
以上。