Saki's 研究记录

docker-compose 部署 Redis 的异常解决

字数统计: 394阅读时长: 1 min
2021/12/27

背景

使用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
2
...
vm.overcommit_memory = 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
2
docker exec -it redis-server cat /proc/sys/net/core/somaxconn
128

会发现容器的这个值还是128,需要修改docker-compose.yaml,添加:

1
2
sysctls:
- net.core.somaxconn=65535

重启服务后问题解决,清净世界~

以上。

CATALOG
  1. 1. 背景
  2. 2. 内核参数 overcommit_memory
    1. 2.1. step 1
    2. 2.2. step 2
  3. 3. TCP 连接数异常
    1. 3.1. 解决