晚上10點(diǎn)多收到報(bào)警,有一臺(tái)服務(wù)器報(bào)錯(cuò)率突增,登陸機(jī)器后發(fā)現(xiàn)closed 數(shù)量過(guò)多,程序報(bào)錯(cuò)。
系統(tǒng)簡(jiǎn)單的架構(gòu)圖介紹
出問(wèn)題的是gosession 這個(gè)服務(wù), gosession 異步通知 interface 和tuyere
cat /proc/net/sockstat
close_wait 是TCP關(guān)閉連接過(guò)程中的一個(gè)正常狀態(tài)
close_wait只會(huì)發(fā)生在被動(dòng)關(guān)閉鏈接的那一端(各位親,請(qǐng)不要把圖里的client/server和項(xiàng)目里的客戶端服務(wù)器端混淆)
close_wait除非你殺進(jìn)程,close_wait是不會(huì)自動(dòng)消失的。當(dāng)然不消失意味著占著資源呢,這里就是占著FD。
查看程序日志 less -R /data/logs/console/gosession.stderr.log
發(fā)現(xiàn)大量報(bào)錯(cuò),出現(xiàn)這句提示的原因是程序打開的文件/socket連接數(shù)量超過(guò)系統(tǒng)設(shè)定值,
查看go程序進(jìn)程的打開文件數(shù)量
定位到是程序問(wèn)題,要開發(fā)仔細(xì)看看,運(yùn)維這邊,優(yōu)化下內(nèi)核參數(shù),加快time-wait 回收。
原因:
gosession 異步通知 interface http 沒有close ,導(dǎo)致gosession 占用大量closed .