您的位置:首页 > 数据库 > Redis

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

2017-03-16 22:24 295 查看
问题的表现
在测试主搜索增量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值换出去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: