一醉顽、背景
之前使用websocket服務(wù)為H5頁面進行實時數(shù)據(jù)推送沼溜,突然有一天產(chǎn)品給我反饋,說該頁面的實時刷新功能失效了游添,于是開始進行排查和處理系草,并將過程記錄下來。
這個服務(wù)是有監(jiān)控程序的唆涝,每分鐘檢查一次websocket是否正常找都,不正常的話會將進程全部殺掉進行重啟。
當天接到反饋后石抡,我看了下服務(wù)檐嚣,監(jiān)控程序是正常的,會對websocket進行重啟啰扛,但每次重啟過后不超過30s嚎京,websocket的master節(jié)點就又掛了。
情況就是這樣的隐解,下面進入排查流程鞍帝。
二、master節(jié)點為什么會掛掉煞茫?
在官網(wǎng)上有列舉以下三種情況會導(dǎo)致無法提供服務(wù):
(1)系統(tǒng)負載過大swoole無法申請到內(nèi)存而掛掉
(2)swoole底層發(fā)生段錯誤
(3)Server占用內(nèi)存過大被內(nèi)核Kill帕涌,或者被某些程序誤殺
但是根據(jù)當前環(huán)境,并不符合上述情況续徽,所以這個問題暫時還沒有找到具體的原因蚓曼。
三、根據(jù)日志報錯解決
(1)首先看了下nginx的error.log钦扭,發(fā)現(xiàn)大量報錯:
13247#0: *176909901 connect() failed (111: Connection refused) while connecting to upstream,
看了下nginx配置,可以看出一開始的配置是很小的纫版,所以對幾個配置進行增大
worker_processes 1; //worker角色的進程個數(shù)
worker_rlimit_nofile 1024;// 更改worker進程的最大打開文件數(shù)限制。
worker_connections 1024;//每一個worker進程能并發(fā)處理(發(fā)起)的最大連接數(shù)(包含所有連接數(shù))
(2)swoole自帶的log日志中也有很多報錯:
ERROR swServer_master_onAccept (ERROR 502): accept() failed. Error: Too many open files[24]
(3)還有在程序啟動會輸出:
WARN swServer_start_check: serv->max_conn is exceed the maximum value[1024].
官方解釋為啥會出現(xiàn)這個報錯,所以說明當前的問題就是因為ulimit -n設(shè)置的過低導(dǎo)致的問題:
max_connection最大不得超過操作系統(tǒng)ulimit -n的值客情,否則會報一條警告信息其弊,并重置為ulimit -n的值
綜合(2)(3)可以得出結(jié)論就出在這個ulimit -n上面了,之前也修改過這個值但實際上并沒有生效膀斋。
ulimit -n 指定同一時間最多可打開的文件數(shù)
vim /etc/security/limits.conf -------永久修改
ulimit -n 1024 -----------------------即時修改梭伐,但重啟后就無效了
四、后續(xù)問題
(1)訪問量上來后仰担,發(fā)現(xiàn)會出現(xiàn)redis偶爾鏈接失敗的報錯糊识,查找原因是因為大量建立鏈接導(dǎo)致機器上的端口都在使用中,通過調(diào)整內(nèi)核參數(shù)解決。
vim /etc/sysctl.conf
編輯文件赂苗,加入以下內(nèi)容:
net.ipv4.tcp_tw_reuse = 1 //表示開啟重用铃将。允許將TIME-WAIT sockets重新用于新的TCP連接,默認為0哑梳,表示關(guān)閉劲阎;
net.ipv4.tcp_tw_recycle = 1 //表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0鸠真,表示關(guān)閉悯仙。
然后執(zhí)行/sbin/sysctl -p讓參數(shù)生效。
(2)訂閱redis后吠卷,一段時間后會無法收到信息锡垄。原因暫時不明,通過增加鏈接超時捕獲異常后重新建立訂閱請求解決祭隔。
ini_set('default_socket_timeout', 10);
五货岭、后記
整理文檔的同時就是將解決問題的過程重新復(fù)盤一遍,以后解決這種問題的思路就會比較清晰了疾渴。