Redis故障检查:内存问题
延迟问题检查完了,部署运行过程中的Redis还应该去检查可能的内存问题,因为Redis是一个基于内存的键值对数据存储服务器,里面所有的数据都是保存在内存中的,也就是说,当服务器重启时,里面的数据都会全部被清空。虽然RDB或AOF持久化会帮我们把数据写入到磁盘,以供数据库备份或是故障后的恢复,但如果运行过程中内存使用不合理,可能会导致OOM等问题。
查询缓冲区
首先我们可以检查下客户端的查询缓冲区,使用命令:
bin/redis-cli INFO MEMORY|egrep "used_memory_human|maxmemory_human"
used_memory表示当前Redis分配的内存空间,单位是字节,这里面包括了客户端的查询缓冲区,随着缓冲区内存使用的增长,used_memory的值也会变大。maxmemory表示最大内存空间限制,默认值是0,表示的是没有限制。我们可以使用CONFIG SET MAXMEMORY命令来设置这个内存限制。如果在Redis运行过程中发现这个used_memory远远大于maxmemory的话,证明缓冲区莫名增长很大。
此时我们之前配置的maxmemory_policy内存淘汰策略就开始起作用了,例如默认的noeviction,意思是不淘汰键,在内存满时,再进行新键的创建时,会直接返回OOM错误。
查询系统内存
上面这种方式是检查Redis实例的使用内存是否超过了配置的maxmemory,另外我们还可以查询redis-server进程的系统内存,使用命令
bin/redis-cli INFO MEMORY |grep used_memory_rss_human
查看:
大数据集
如果redis-server进程占用了太多的内存,可能的原因是很大的数据集导致的内存占满,进一步的我们可以使用命令
bin/redis-cli INFO MEMORY | egrep "used_memory_dataset| used_memory_dataset_perc"
查看:
如果used_memory_dataset_percset_perc指标大于90%,那么就是大数据集导致的内存问题,这时候我们就应该去查找Redis中的内存占用很大的键,一个很简单的方法就是直接使用命令
bin/redis-cli –bigkeys
来查找:
used_memory – slave_output_buffer_size – AOF_buffer_size的值是否超过了maxmemory,(从实例和AOF重写这些都知道吧。)如果想要模拟下缓冲区OOM问题,可以首先使用命令
bin/redis-benchmark -q -d 1024000 -n 10000 -r 2500 -t set
往Redis中导入大量的数据,之后你再用INFO MEMORY命令查看内存信息,会发现used_memory_human的值增大,甚至比maxmemory大(前提你的maxmemory不是设置为0)。之后再继续往Redis里写数据,发生OOM问题,Redis进程被杀死(可以在redis-server进程日志中看到输出“killed”)。
内存碎片
最后,因为多次频繁的写入数据和删除数据等操作,Redis会在内存中留下很大碎片,这个可以用命令
bin/redis-cli INFO MEMORY|grep mem_fragmen
查看:
如果发现内存碎片率大于1.5,那么可以用命令
bin/redis-cli MEMORY PURGE
进行释放内存碎片。