解決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.www58058.com/10503

(0)
可樂可樂
上一篇 2016-02-14
下一篇 2016-02-14

相關推薦

  • vim編輯器-練習題

    1 、復制/etc/profile至/tmp/目錄,用查找替換命令刪除/tmp/profile文件中的行首的空白字符 #cp /etc/profile /tmp #vim /tmp/profile :%s/^[[:space:]]\+// 2 、復制/etc/rc.d/init.d/functions 文件至/tmp 目錄,用查找替換命令為/tmp/func…

    Linux干貨 2016-08-15
  • Linux Basics–part6

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; tmp]# cp /etc/rc.d/init.d/rc.sysinit /tmp/rc.sysinit tmp]# vim rc.sysinit : 進入末行模式 %s@^[[:space:]]\+@#@g 2…

    Linux干貨 2017-08-24
  • 源碼編譯nginx和Nginx的特性,配置文件指令說明

    nginx的官方站點 www.nginx.org Nginx:engine X Tenginx:Taobao enginx libevent:高性能的網絡庫 epoll(); Nginx特性  模塊化設計,較好擴展性:但不支持模塊的動態裝卸載;Tenginx支持;  高可靠性   master –> …

    Linux干貨 2017-04-30
  • Ansible(From Wikipedia)

           Ansible 是一個免費的用于配置和管理計算機的的軟件平臺。它集成了軟件部署,ad hoc任務執行,和管理配置的功能。它依賴Python2.4之后的版本和通過SSH或者PowerShell管理節點。模塊工作在JSON格式,輸出信息可以被任何編程語言再次編寫。系統管理員可以使用YAML…

    Linux干貨 2015-11-18
  • tcp通訊的服務器和客戶端解析

    服務器端編程步驟, 1.創建Socket對象,下文中的socket都表示一個socket對象 2.綁定IP地址和端口,服務器的IP和端口 3.開始監聽,將在指定的端口上監聽,listen() 如果對方申請連接這個IP和端口,將被聽到,這個過程 4.獲取用于傳輸數據的Socket對象 socket.accept() ->(socket object,ad…

    Linux干貨 2018-01-01
  • Linux文件管理和Bash特性

    一、Linux基本文件管理命令 主要介紹cp、mv、rm命令的基本用法以及使用示例 cp命令 cp命令用來將一個或多個源文件或者目錄復制到指定的目的文件或目錄 cp (選項) (參數) 常用選項: -a:此參數的效果和同時指定”-dpR”參數相同,用于實現歸檔; -d:復制符號鏈接文件本身,而非其指向的源文件; -f:強行復制文件或目錄,不論目標文件或目錄是…

    Linux干貨 2017-07-09

評論列表(1條)

  • stanley
    stanley 2016-02-14 10:22

    寶貴的排查思路,文章如果精心打造可以推公眾號了~

欧美性久久久久