redis机器物理死机问题分析(OOM)

来源:互联网 发布:usb端口定义 编辑:程序博客网 时间:2024/06/17 22:27

问题的表现

在测试主搜索增量bolt的loader程序的时候,它有一步是将数据加载到redis里。在平时做测试的时候,几次发生做loader导致了redis所在的测试机器死机(物理死机)。


问题分析

造成了物理死机,我们初步认为是由于测试机器内存不足,而数据量过大,导致内存爆满,最后死机的。

觉得需要寻找一种解决机器挂掉的方法,后来发现

/home/admin/redis/bin/redis-cli info(命令可以查看redis使用了多少内存)

同时,我们也注意到了redis的一个配置项目maxmemory(通过查阅资料,得知是可以限制redis对物理内存的使用的),通过监控maxmemory这个配置。后来确定了,这

 

个限制是有效的。

关键代码:

if (server.maxmemory) freeMemoryIfNeeded();

if (server.maxmemory && (c->cmd->flags & REDIS_CMD_DENYOOM) &&

zmalloc_used_memory() > server.maxmemory)

{

addReplyError(c,"command not allowed when used memory > 'maxmemory'");

return REDIS_OK;

}

一般情况下,我们跑一次loader(将数据载入到redis里),大概redis需要占用7G左右的内存(测试机器内存一共才8G)。

/home/admin/redis/bin/redis-cli info |grep memory

used_memory:2998410616

used_memory_human:2.79G

used_memory_rss:3609223168

我们开启了两个进程,也就是对上面的数据的2倍,就是我们需要的内存数目。


问题原因

而之前死机的原因,也很简单,本身redis就占用了7G左右的内存,同时,我们机器还是一个Hadoop的一个slave,偶尔会产生1G多的内存占用。而我们机器的物理内存

 

一共就是8G,两个一旦同时相加,则内存耗尽(OOM),机器死机。

防止redis机器死机的方法:

现在新增一个maxmemory的配置,将它设置为总和小于6.5G的占用。当数据使用一旦达到maxmemory,则程序会直接停止写入内存。

Redis还有一个功能,可以为key值设置过期时间,一旦内存满了,则先将过期的key值换出去。

0 0