部門主要做數(shù)據(jù)采集服務(wù)燕刻,采集過程使用到兩級代理箫柳,都是自建服務(wù)。昨晚在做優(yōu)化和測試的時候遇到了一個奇怪問題,在本地測試時代理服務(wù)很快悯衬,但是部署到開發(fā)測試機(jī)之后會有卡頓,而且是秒級的业稼,本機(jī)安裝的虛擬機(jī)測試也很快溪猿。
然后就不停的嘗試,但是還是沒有效果通過打印日志發(fā)現(xiàn)抠艾,二級代理很快就返回了苛萎,但是一級代理過了一會才收到數(shù)據(jù),初步懷疑是不是一級代理沒有設(shè)置TCP_NODELAY標(biāo)志检号,導(dǎo)致雖然應(yīng)用層打印是返回了腌歉,但是網(wǎng)絡(luò)層會延遲發(fā)送。然后就不停的嘗試齐苛,但是還是沒有效果翘盖。懷疑跟TCP_NODELAY標(biāo)志無關(guān),因為TCP_NODELAY只會影響40毫秒左右凹蜂。
由于對netty和代理服務(wù)代碼不是很熟悉馍驯,對打印log的地方產(chǎn)生了懷疑阁危。之后通過tcpdump將開發(fā)測試服務(wù)器和本地測試服務(wù)器網(wǎng)絡(luò)包進(jìn)行了抓取(這里有個小技巧汰瘫,由于網(wǎng)端口產(chǎn)生的數(shù)據(jù)包很多狂打,比較難以分析,所以我將測試和代理服務(wù)都部署在同一臺機(jī)器混弥,通過抓取lo端口包進(jìn)行分析)趴乡,然后通過wireshark打開抓取的網(wǎng)絡(luò)包文件。測試及代理服務(wù)如下:
通過分析開發(fā)測試機(jī)的抓包蝗拿,發(fā)現(xiàn)關(guān)鍵部分如下:
上圖53030對應(yīng)二級代理的v1端口浙宜,6014對應(yīng)一級代理的s2端口,7978對應(yīng)測試程序的c端口蛹磺,63030對應(yīng)一級代理的s1端口粟瞬。可以發(fā)現(xiàn)二級代理很快就返回了數(shù)據(jù)(其中藍(lán)條表示一級代理收到數(shù)據(jù)的響應(yīng)ACK)萤捆,但是一級代理過了3秒左右的時間才返回了數(shù)據(jù)裙品,所以問題出在一級代理上面。進(jìn)一步排查發(fā)現(xiàn)是一級代理上面有一個filter在本地和測試開發(fā)機(jī)表現(xiàn)不同造成的俗或,問題也很快被解決市怎。
雖然問題很快得到解決,但是問題排查過程中用到的一些方法和思考值得學(xué)習(xí)和反思辛慰,比如抓包測試方案等区匠。最后通過siege連續(xù)發(fā)送2次請求對兩級代理keep-alive長連接進(jìn)行了驗證??。