問題描述
公司老的項目沒有任何監控,對于系統的運作健康情況完全不知,于是搭建了2套監控系統,一套sentry監控代碼層面的exception,一套cls告警,監控所有系統的狀态碼,應用日志等。監控系統上線後,就發現有一台跑定時任務的機器,經常偶現報錯 RedisException: Connection timed out,一天幾十次,也不是固定時間,如下圖:

問題分析
于是開始分析為何逾時,首先想到的是不是tcp連接配接數過多?于是檢視系統tcp連結狀态,發現并沒有太多連接配接,timewait也不多
ss -s
Total: 548 (kernel 808)
TCP: 745 (estab 209, closed 531, orphaned 1, synrecv 0, timewait 531/0), ports 0
檢視網絡統計,問題前後并沒有變化
netstat -s |grep reject
4 passive connections rejected because of time stamp
52 packets rejects in established connections because of timestamp
于是檢視發生逾時時的系統日志,也沒有發現異常
vi /var/log/messages
登入騰訊雲檢視redis監控,發生問題時候的連接配接數等都沒有太大的異常,對比另一台沒有報錯的redis服務,這個出問題的redis是叢集
于是猜想是不是redis叢集的問題,不過抱着對大廠産品的信任,還是從自身查起,看是不是自己使用姿勢有問題。
先從最簡單的方法入手,修改連結redis前後的代碼,增加時間戳記錄,判斷到底那個地方逾時了
monolog("start",time());
Redis::connection('redis_db_4');
monolog("end",time());
部署上線觀察,發現就是這地方connection 逾時了,難道是網絡問題?按理說都是騰訊家的服務,不應該存在這麼頻繁的網絡問題啊
繼續檢視sentry日志:
發現逾時時間基本是60s, 正好是php.ini下面socket的逾時時間
default_socket_timeout=60
既然懷疑網絡問題,那我們就抓包分析吧,因為是偶現問題,我們隻能持續抓包,沒過一段時間過來看下是否有新逾時了。
tcpdump抓包分析結果:
09:13:02.104349 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags
[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132733115 ecr
0,nop,wscale 7], length 0
09:13:03.104847 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags
[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132734116 ecr
0,nop,wscale 7], length 0
09:13:05.108833 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags
[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132736120 ecr
0,nop,wscale 7], length 0
09:13:09.116833 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags
[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132740128 ecr
0,nop,wscale 7], length 0
09:13:17.132842 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags
[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132748144 ecr
0,nop,wscale 7], length 0
09:13:33.148834 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags
[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132764160 ecr
0,nop,wscale 7], length 0
抓包發現三次握手 發了SYN Redis沒有 ACK回複,然後5次重傳都沒有回複,仿佛這時候我們就有點無從查起了,畢竟redis是雲服務,咱們也沒法上去抓包
看來隻能提工單了,抓包分析結果提給騰訊雲客服,經過跟騰訊雲持續一周左右的溝通(此處省略10000字...)
1.為了排除是機器硬體問題,騰訊雲給遷移了機器 (未能解決問題)
2.服務端不回複ack參考文章:
https://m.163yun.com/help/documents/230866483626037248
不過這是修改服務端的,咱們雖然是伺服器,但是相對于連結redis來說,咱們屬于用戶端,我也嘗試按照上面方法修改咱們的伺服器,并不管用
3.更新後端客服(網絡、伺服器、mem等技術後端一起排查問題),最後發現是redis叢集有些問題