解决Redis 延迟故障

前一段时间redis客户端在使用php connect 连接redis 的经常报一个redis server went away 等信息。

首先想到的想到的是reids超时设置的问题,timeout、tcp-keepalive、以及php的default_socket_timeout时间

 127.0.0.1:6381> CONFIG GET *
  17) "timeout"
  18) "0"
  19) "tcp-keepalive"
  20) "0"

 vim  xxx/php_path/php.ini
 default_socket_timeout = 300

注意这个socket时间不能改成0 要是0的话你会悲剧的。

测试 不解决还是ent away

php改 pconnect不解决。好吧,这个诡异的问题已经越来越严重了。

 # vmstat  1 3
 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
  0  0      0 6022256 383340 10371320    0    0     0    25    0    0  0  0 100  0  0
  0  0      0 6022380 383340 10371368    0    0     0   116 6401 3463  0  0 100  0  0
  0  0      0 6022380 383340 10371368    0    0     0    16 5880 3022  0  0 100  0  0

 # iostat -x -k 1                    
 Linux 2.6.18-308.el5 (yq-bbsrqueue1)    12/24/2015

 avg-cpu:  %user   %nice %system %iowait  %steal   %idle
            0.07    0.00    0.05    0.00    0.00   99.87

 Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
 cciss/c0d0        0.00     2.52  0.00  0.51     0.20    12.12    48.39     0.00    0.47   0.25   0.01
 cciss/c0d0p1      0.00     2.52  0.00  0.51     0.20    12.12    48.39     0.00    0.47   0.25   0.01
 cciss/c0d1        0.00    91.90  0.00  3.32     0.44   380.88   229.15     0.03    9.40   0.19   0.06
 cciss/c0d1p1      0.00    91.90  0.00  3.32     0.44   380.88   229.15     0.03    9.40   0.19   0.06

好吧检查网络
没问题…

哪还有什么能造成延迟呢?
AOF 和硬盘I/O操作延迟、数据过期造成的延迟、redis看门狗的延迟

从iostat上来看aof基本不会造成这方面的延迟可以排除掉

key过期:
好吧我们看看文档

  Latency generated by expires
 Redis evict expired keys in two ways:
 One lazy way expires a key when it is requested by a command, but it is found to be already expired.
 One active way expires a few keys every 100 milliseconds.

就是说有两种方式:
lazy 在key被请求的时候才检查是否过期
active 每0.1秒进行一次过期检查
好吧问问拍黄片的哥哥是否有大面积过期的key。咨询木有。

那找找看门狗吧

 127.0.0.1:6381> config get watchdog
 (empty list or set)

木有….

难道就真的没有办法了嘛
(当时没有抓包)苦恼的只能看配置 看日志找问题了

那就在重新浏览配置吧

能出问题的配置项只有:
timeout
tcp-keepalive
tcp-backlog
maxclients

查看一下当前的连接数 :

 # redis-stat host 10.xx.xxx.xxx port 6381                        
 ------- data ------ --------------------- load -------------------- - child -
 keys       mem      clients blocked requests            connections          
 4325509    2.00G    25      0       526898898 (+526898898) 100841471   
 4325510    2.00G    14      0       526899989 (+1091)   100841670   
 4325511    2.00G    20      0       526901583 (+1594)   100841933   
 4325509    2.00G    16      0       526903336 (+1753)   100842128   
 4325511    2.00G    9       0       526904748 (+1412)   100842328

出问题的timeout tcp-keepalive 。
哪还有什么地址配置的呢?
sysctl
那查看一下 tcp方面的配置 主要是时间和队列长度的
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 150
net.ipv4.tcp_max_tw_buckets = 20000

那只能改一下这俩个试试了

测试解决

最后改成
net.ipv4.tcp_fin_timeout = 60
最后这个问题应该是应用层和内核层 连接时间不匹配导致的。
内核层超时断开了,应用层以为还能用,请求就过不去,只能再重新走一遍,就会间接性延迟。

可惜当时没有抓包。

http://www.redis.io/topics/latency
官方文档

原创文章,作者:可乐,如若转载,请注明出处:http://www.178linux.com/10503

(0)
可乐可乐
上一篇 2016-02-14 10:19
下一篇 2016-02-14 10:23

相关推荐

  • psql: undefined symbol: PQconnectdbParams 已解决

    操作PostgreSQL的过程中,在执行psql的时候,遇到了如下错误:  /path/to/postgresql/bin/psql: symbol lookup error: /usr/pgsql-9.2/bin/psql: undefined symbol: PQconnectdbParams 整理后发现是,PostgreSQL的动态链接库没有…

    Linux干货 2015-03-08
  • N28-第二周作业

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。
    2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
    3、请使用命令行展开功能来完成以下练习:
    (1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
    (2)、创建/tmp/mylinux目录下的:
    mylinux/
    ├── bin
    ├── boot
    │   └── grub
    ├── dev
    ├── etc
    │   ├── rc.d
    │   │   └── init.d
    │   └── sysconfig
    │   └── network-scripts
    ├── lib
    │   └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │   └── local
    │   ├── bin
    │   └── sbin
    └── var
    ├── lock
    ├── log
    └── run
    4、文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息。
    5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?
    6、显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
    7、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
    8、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
    9、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
    10、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
    11、复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
    12、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

    Linux干货 2017-12-11
  • CentOS Linux解决Device eth0 does not seem to be present

    CentOS Linux解决Device eth0 does not seem to be present 今天早上打开xshell链接虚拟机,突然链接不上。然后进入虚拟机执行 ifconfig 或者 ip addr list 命令发现eth0 不见。然后执行重启网卡命令发现  解决办法:   首先,打开/etc/udev/rules.d/70-p…

    Linux干货 2016-08-02
  • ansible部署KeepAlived动态站点

    一、设计原因 利用ansible可以自动化部署KeepAlived 的双方模型(其中包括两个动态的站点),多组服务器需要一样的部署时 可以利用ansible写的程序来代替重复性的操作。 二、设计拓扑结构及服务器详情   三、详细步骤 1、环境的搭建 (1)安装ansible,同时配置私钥免密码进行通信 [root@localhost ~]# ssh…

    2015-05-13
  • keepalive高可用haproxy实现URL资源的动静分离

    keepalive高可用haproxy实现动静分离URL资源 实现要点: (1) 动静分离discuzx,动静都要基于负载均衡实现; (2) 进一步测试在haproxy和后端主机之间添加varnish缓存; (3) 给出拓扑设计; (4) haproxy的设定要求:     (a…

    Linux干货 2016-11-12
  • RAID各级别的特性及使用介绍(8.3博客作业)

    RAID各级别的特性及使用介绍 介绍: 独立硬盘冗余阵列(RAID:Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列,简称磁盘阵列。 组成: 多块磁盘,RAID控制器(硬件RAID、软件RAID)     硬件RAID:自带CPU的RAID卡,不消耗服务器资源,可通过备份…

    Linux干货 2016-07-16

评论列表(1条)

  • stanley
    stanley 2016-02-14 10:22

    宝贵的排查思路,文章如果精心打造可以推公众号了~