当前位置:首页 > 问答 > 正文

Redis突然没反应了,报错也不知道咋回事,整得我一头雾水

Redis突然没反应了,敲命令也没回应,或者应用连不上,报的错误也看不懂,这确实让人特别头疼,你别急,这种情况很多搞技术的人都遇到过,咱们一点点捋。

最常见的一个情况就是内存用完了,Redis这东西特别吃内存,它把所有数据都放在内存里跑,要是你的内存不够了,它可能就直接卡死,或者开始疯狂删数据(如果配置了淘汰策略的话),你可以想象一下,就像一个仓库塞满了东西,连转身的地方都没了,那工人自然就干不了活了,这时候你看Redis的日志,可能会看到类似“OOM”(内存不足)的提示,或者客户端报“Could not connect”之类的错,有个叫“redis-cli”的命令行工具,你可以试着用一下info memory命令看看内存使用情况,但这前提是Redis还没完全卡死,还能响应命令。

Redis突然没反应了,报错也不知道咋回事,整得我一头雾水

可能是持久化操作卡住了,Redis为了把内存里的数据保存到硬盘上,防止重启后数据丢了,会有两种主要方式:RDB(快照)和AOF(日志),如果数据量很大,生成RDB快照的时候,Redis可能会fork一个子进程来干活,这个fork过程如果遇到机器内存压力大,可能会非常慢,导致主进程也跟着卡住,而AOF日志如果设置成每次写操作都同步(appendfsync always),也会让性能急剧下降,这就像你在用电脑,突然后台启动了一个巨大的复制任务,整个电脑都会变慢,根据一些技术社区的经验分享,很多人都是在数据量增长后,没调整持久化设置,突然就遇到这个问题。

第三个要留神的是配置问题,特别是网络绑定的配置,配置文件里的“bind”设置可能只绑定了127.0.0.1,那别的机器肯定就连不上了,或者“protected-mode”设置成了yes,但又没设置密码,导致外部连接被拒绝,还有一种情况是最大连接数(maxclients)设得太小,连接一多就被耗尽了,这些配置就像家里的门锁规则,规则设错了,要么自己进不去,要么客人来了被挡在门外。

Redis突然没反应了,报错也不知道咋回事,整得我一头雾水

第四,系统资源不够了,Redis跑得欢,不光靠内存,还得看CPU和文件描述符(你可以简单理解为系统允许的打开文件或连接的数量上限),如果CPU被别的程序吃光了,Redis处理命令就会慢得像蜗牛,或者系统的文件描述符限制太低,连接数一多就耗尽了,新的连接就进不来,这就像你手机同时开了太多APP,再想开新的就会卡住或者闪退。

也不能排除Redis服务本身真的挂了,比如遇到了严重的bug,或者进程因为某种原因被系统杀掉了,你可以用ps aux | grep redis这样的命令看看进程还在不在,或者检查一下系统日志(var/log/messages里),有时候能找到它崩溃的线索。

当Redis“罢工”时,别慌,你可以按这个顺序摸摸底:先看内存是不是满了;然后看看是不是正在做持久化(检查硬盘IO);再回顾一下最近是不是改过配置;接着用top命令看看CPU和内存的整体压力;最后确认一下Redis进程是否还活着,很多问题的答案其实藏在Redis的日志文件里,所以养成看日志的习惯很重要,虽然报错信息一开始看着懵,但把里面的关键词复制出来,到技术论坛里搜一搜,经常能找到和你一样的“倒霉蛋”,他们的解决经验就是最好的解药。