Redis Can’t save in background: fork: Cannot allocate memory 解决

先说如何解决:

echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
sysctl -p
echo never > /sys/kernel/mm/transparent_hugepage/enabled

以下是解决过程:

网上大部分这个问题都是通过设置以下参数,使得应用可以向系统申请超量内存使用

vm.overcommit_memory=1

在出现这个问题的时候设置确实是有用的,后续没有再报内存分配失败的错误。
但是我发现日志中redis持久化一次非常慢

162755:M 16 Nov 11:56:22.032 * 10000 changes in 60 seconds. Saving...
162755:M 16 Nov 11:56:22.564 * Background saving started by pid 140259
140259:C 16 Nov 11:57:33.776 * DB saved on disk
140259:C 16 Nov 11:57:34.258 * RDB: 30 MB of memory used by copy-on-write

居然要一分多钟,而且内存占用也相比之前大了很多,并且发现启动日志中有warning:

 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

查看了一下,这个是说明redis最好禁用linux中的一个透明大页的特性,否则会有性能和内存使用上的问题。

Transparent Huge Pages 缩写 THP ,这个是 RHEL 6 开始引入的一个功能,在 Linux6 上透明大页是默认启用的。

由于 Huge pages 很难手动管理,而且通常需要对代码进行重大的更改才能有效的使用,因此 RHEL 6 开始引入了 Transparent Huge Pages ( THP ), THP 是一个抽象层,能够自动创建、管理和使用传统大页。

THP 为系统管理员和开发人员减少了很多使用传统大页的复杂性 , 因为 THP 的目标是改进性能 , 因此其它开发人员 ( 来自社区和红帽 ) 已在各种系统、配置、应用程序和负载中对 THP 进行了测试和优化。这样可让 THP 的默认设置改进大多数系统配置性能。但是 , 不建议对数据库工作负载使用 THP 。

为了确认是不是这个问题影响的,查了一下redis进程占用内存的情况
在这里插入图片描述
居然占用了44%的内存
在这里插入图片描述
而且内存使用情况应该是设置了vm.overcommit_memory=1使用早就超了限制。

查阅redis官网资料发现THP会造成每次持久化fork调用的延迟和不必要的内存消耗,果断以下命令关闭THP后,重启redis。

echo never > /sys/kernel/mm/transparent_hugepage/enabled

隔天在业务繁忙时段查看redis 发现内存占用不到0.3%,且日志也好看了很多

105009:M 17 Nov 11:10:31.099 * 10000 changes in 60 seconds. Saving...
105009:M 17 Nov 11:10:31.101 * Background saving started by pid 20714
20714:C 17 Nov 11:10:31.702 * DB saved on disk
20714:C 17 Nov 11:10:31.704 * RDB: 2 MB of memory used by copy-on-write

参考资料

Huge pages (标准大页)和 Transparent Huge pages(透明大页)
Redis latency problems troubleshooting


今日诗词
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐