1、问题背景:
redis版本:3.2.10,集群模式,3主3从,分布在三台服务器,每台都一主一从,对应的主从交叉分布,主从不能都在同一台机器上。
2、问题描述:
单台redis的流量上升,导致服务器报警。
3、问题处理过程:
在对应的redis服务器上,使用命令:iftop -npP 监控流量进出,可以看到ip尾数是3的这台服务器访问redis 流量异常。
到3这台机器上(业务服务器),查看所占用端口为39868的进程id,使用命令:netstat -ap|grep 39868 查出占用39868的程序信息。
因为我们这台服务器上面只有一个java进程,所以这步直接过了,使用top直接查看了。
top -H -p 1748 查看具体线程信息,可以看到,有三个线程执行100多小时,而且占用较多cpu资源,线程没有办法查看对应占用端口(有方法的朋友可以分享下),怀疑二者有关联。
然后jstack 1748 > jstack.log,查看线程堆栈信息。将图中标出的进程号换算成16进制,找到对应的线程堆栈信息。三个线程都在执行同一个redis操作。
找到对应代码,发现有可能导致死循环的代码段,一直在进行redis查询操作。
为了确认,在服务器上抓包
tcpdump -i eth0 -t -s 0 -c 100 port 39868 -w package.cap
然后在Wireshark打开,追踪TCP流,可以看到,程序一直在发送ZRANGE请求,并且请求参数都一样,并且redis返回为空。
4、问题总结:
根据对应代码和抓包的内容,可以得出结论:是因为程序存在问题,Sorted Set中没有数据,导致一直循环请求,最终导致流量上涨。