結(jié)論
915投產(chǎn)演練時(shí),因服務(wù)器刀容存在問(wèn)題,引起了網(wǎng)絡(luò)抖動(dòng),致使響應(yīng)時(shí)間超長(zhǎng),耗盡了渠道接入數(shù)量,積累大量請(qǐng)求得不到請(qǐng)求,客戶(hù)端主動(dòng)斷開(kāi)鏈接,服務(wù)端后續(xù)處理返回時(shí)回寫(xiě)數(shù)據(jù)失敗。
問(wèn)題
以下截圖,是一段來(lái)自服務(wù)器的渠道接入(Socket)異常信息。

通信代碼拋異常:
java.net.SocketExcetipn:Broken pipe(Write failed)
是什么意思呢?
直觀(guān)解釋 —— 回寫(xiě)(服務(wù)端向前端socket連接管道寫(xiě)返回?cái)?shù)據(jù))數(shù)據(jù)時(shí),鏈接(pipe)卻斷了!….
從應(yīng)用角度分析,這是因?yàn)榭蛻?hù)端(TWS)等待返回超時(shí)了,主動(dòng)斷開(kāi)了與服務(wù)端(BS)的鏈接—— TWS 與 BS是短鏈接,請(qǐng)求時(shí)建立,“請(qǐng)求》處理》響應(yīng)”完成后即結(jié)束,關(guān)閉鏈接。
從服務(wù)端日志分析,交易邏輯均正常,無(wú)異常,處理速度也很快(包括:BS自己、BS與外界)只是在通信返回時(shí)報(bào)了Broken pipe的異常。
如何引起的?
解決這個(gè)問(wèn)題,根本在于找出【通信鏈接是如何被關(guān)閉的】這個(gè)根本原因所在!
渠道接入連接數(shù)設(shè)置太小,并發(fā)量增加后,造成大量請(qǐng)求排隊(duì)等待,等待了69秒才獲得處理,但是處理時(shí)間超過(guò)1秒,此時(shí)TWS主動(dòng)斷開(kāi)了鏈接(假設(shè):超時(shí)時(shí)長(zhǎng)為70秒),雖然服務(wù)端完成了處理,但是返回結(jié)果時(shí),發(fā)現(xiàn)此前建立的通信鏈接已斷開(kāi)了——Broken pipe(Write failed) ;
分析思路
- 使用【kcusage】查看系統(tǒng)參數(shù)設(shè)置情況,是否正常!命令:
/usr/sbin/kcusage

檢查系統(tǒng)用戶(hù)【可用文件句柄數(shù)】max_file_limt,設(shè)置太小,會(huì)導(dǎo)致渠道無(wú)法創(chuàng)建更多鏈接數(shù),導(dǎo)致渠道接入能力彈性伸縮失?。ㄔ黾咏尤霐?shù)失?。?/p>
檢查系統(tǒng)用戶(hù)【可用線(xiàn)程數(shù)】max_thread_proc,如果設(shè)置太小,導(dǎo)致建立渠道連接時(shí)無(wú)法可用線(xiàn)程,也會(huì)導(dǎo)致渠道接入能力的彈性伸縮失敗(增加接入數(shù)失?。粓?bào)錯(cuò)如下:
檢查應(yīng)用上渠道連接數(shù)配置,【接入數(shù)】應(yīng)該與【預(yù)期并發(fā)數(shù)】大小匹配。
檢查【啟動(dòng)內(nèi)存】設(shè)置,應(yīng)該足夠大,以支持大并發(fā)時(shí)建立連接、處理業(yè)務(wù)所需要內(nèi)存。
-Xms1024m -Xmx2048m -XX:MaxPermSize=256m
- 檢查【網(wǎng)絡(luò)延遲】情況,因?yàn)榫W(wǎng)絡(luò)延遲會(huì)增加socket通信時(shí)間,增加了對(duì)渠道連接數(shù)的消耗量,即使接入數(shù)量為預(yù)期配置,但是會(huì)被很快消耗掉;
- 查看客戶(hù)端與應(yīng)用服務(wù)器之間的【網(wǎng)絡(luò)情況】——ping, 是否有延遲,是否有丟包;
- 查看應(yīng)用服務(wù)器服務(wù)【端口占用數(shù)】—— netstat -an | grep 9901 | grep “ESTABLISH| "wc -l ,對(duì)比ESTABLISH的數(shù)量和配置參數(shù)值大小情況;
收獲
同樣的代碼,部署新環(huán)境后,出現(xiàn)問(wèn)題,排查內(nèi)容和順序:
服務(wù)器參數(shù)檢查(硬件)
-
網(wǎng)絡(luò)環(huán)境的檢查(網(wǎng)絡(luò))
檢查點(diǎn)1: 請(qǐng)求方與服務(wù)方之間的網(wǎng)絡(luò)ping情況
檢查點(diǎn)2: 服務(wù)器之間的網(wǎng)絡(luò)ping情況;
檢查點(diǎn)3: F5負(fù)載/軟負(fù)載/網(wǎng)關(guān) 這種入口系統(tǒng)與應(yīng)用服務(wù)器之間的網(wǎng)絡(luò)ping情況; -
應(yīng)用自身的配置(應(yīng)用配置)
- 檢查點(diǎn)1: 接入能力,如:渠道配置 —— ip、斷開(kāi)、接入數(shù)、彈性配置(初始、增量、最大)
- 檢查點(diǎn)2: DB能力,如:數(shù)據(jù)庫(kù)配置——ip、斷開(kāi)、用戶(hù)、密碼、彈性配置(初始、增量、最大)、恢復(fù)
- 檢查點(diǎn)3: 與Backend的通信能力,如:通道配置
3、做系統(tǒng)預(yù)熱(綜合)