前一段時間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
寶貴的排查思路,文章如果精心打造可以推公眾號了~