天天看点

Tomcat应用报redis超时的故事业务背景介绍           

系统架构是通过分布式的方式进行部署的,登录的时候不会调用redis数据,假如用户登录成功了,会跳转到其它的项目上,并根据从redis中查到的权限缓存,像是相应的数据模块

问题一:用户登录失败,系统巨卡无比

问题二:Tomcat抛出 connect timed out错误

:sar -n DEV 1

这里发现了一个问题,服务器的内存资源居高不下,暂且不考虑服务器资源的正常与否

ps -ef 显示系统进程

这里不方便把服务器开启了那些进程罗列到此处,还请见谅;最后的分析结果就是,并无异常进程

这就奇怪了,到底是哪的问题呢?继续查找

生产环境有两个java项目都调用了这个服务器的redis服务,然后找到了这两个项目分别查看日志,几乎在相同时间都抛出了Time out的错误,因此断定应该是redis单方面的问题

查看了redis日志,并没有什么报错请求

使用redis-benchmark测试了redis的压力,也没有什么问题。

怀疑是有慢查询 连接数不够用 等待了 导致超时了

有这么几个命令:

  ./redis-cli -h 127.0.0.1 -p 6378 # 这个是连接上本机的6378的redis

  auth password #如果redis设置的有密码,使用auth进行密码验证

  CONFIG GET slowlog-log-slower-than #(10000us,Redis中的执行单位是微秒,相当于10ms)

  SLOWLOG LEN #查看redis存储的慢查询记录,默认查看128条

  SLOWLOG GET # 查看redis存储的慢查询记录,默认10条

从上面可以看出一个满查询在55毫秒左右,项目的配置文件在10秒左右,所以不存在超时的问题

怀疑redis的内存用到上线,因此查看了redis的配置

<code>maxmonery # 我的配置文件没有设置,默认是不限制内存</code>

介绍Memory的参数信息:

Tomcat应用报redis超时的故事业务背景介绍           

查看了redis使用内存很小,才使用了27.19M,排除了redis的内存使用情况

使用了speedtest-cli 命令测试了本机的网速情况

  speedtest-cli命令介绍:

测试结果:

Tomcat应用报redis超时的故事业务背景介绍           

使用这个命令查看本机网络,貌似有问题,于是那了两台机器之间互传了一个较大的文件,查看了速度,经测试速度在5MB-6MB左右,因此排除了网络问题】

开始认为是持久化导致的磁盘IO飙升问题,于是更改持久化策略

先说一下持久化分为两种方式,第一种为AOF,第二种为save的方式,格式大概为

方式一:

方式二:

注掉了从的持久化,主注掉save模式,开启AOF模式,可是io高的问题依旧没有解决,于是乎就有了下文

看到这个界面,好像找到了点头绪,服务器的磁盘IO较高,但是小编这里也提出了疑问,redis的数据全部存放到了sdb银盘上,而且redis的程序也都是在sdb上面,那为什么服务器的sda的

IO资源占用如此之高呢?

顺藤摸瓜&gt;&gt;&gt;就从高IO的线索查找问题根源:

iotop

<code>iotop执行命令结果,发现一个占用资源特别高的进程</code>

检查发现,这个进程存在的作用是,当系统的物理内存耗尽时候,系统会激活此进程,以来调用swap分区。

这下有点明白其中的道道了,问题原因大概如下:

Tomcat应用报redis超时的故事业务背景介绍           

检查都有那些系统应用占用了swap分区,编写脚本:

执行结果,发现

redis的进程全部存放在了swap分区中,果然是这样。

修改内核参数,合理分配内存使用

A.释放物理内存,并且叫新应用获取物理内存。

  1.在释放内存之前,检查可用内存多少

    free -m

    输出结果略

  2.手动释放内存

    echo 1 &gt; /proc/sys/vm/drop_caches

  3.释放完成后,检查可用内存是否进行了释放

  经过上述的三个命令,发现内存确实进行了释放。

  4.重启redis服务

  5.检查swap分区使用

    重启了redis发现内存走的依旧是swap分区,物理内存还有很多可用内存,但是系统为什么分给应用swap分区呢?

B.修改系统内核参数,叫所有的应用尽量使用物理内存,避免使用swap分区。

Tomcat应用报redis超时的故事业务背景介绍           

仔细看,物理内存还有将近1GB没有使用。但是swap已经开始被使用。怀疑是不是swappiness文件的值没有更改。

说明:在centos里面,swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。两个极端,对于Centos的默认设置,这个值等于60,建议修改为10。具体这样做:

最后重新加载swap虚拟内存:

但是上面操作后,重启了redis应用,系统依旧分给了redis swap分区。

C. 最后重启服务器,并再次启动redis服务,最后问题得到了解决。swap分区为0了

本文转自 xinsir999 51CTO博客,原文链接:http://blog.51cto.com/xinsir/2050754,如需转载请自行联系原作者