用過Jmeter的應該都了解,有個ServerAgent工具,放在linux或者windows服務器上開啟服務后,在Jmeter中配置下監視器,就可以抓取到服務器的一些資源信息,抓取的主要是cpu、內存、磁盤、網絡等大項,基本夠用,肯定是比不上其他的一些資源監控工具詳細,但是配置方便啊,拷貝,開啟服務就能用,具體的配置過程就不說了,比較好奇實現原理,就研究了下。
分析過程
jmeter運行端就稱為客戶端吧,ServerAgent所在的機器稱為服務端。服務器運行ServerAgent服務后,監聽的默認端口是4444。
客戶端要拿到服務端的資源數據,肯定是有數據交互的,只不過交互不一定是http協議的,用fiddler可能抓不到通訊過程(實測,確實抓不到)。
那就用萬能抓包工具吧,從客戶端網卡抓,神器wireshark。
首先搭建好了環境,配置了jmeter測試請求及資源監聽,運行並用wireshark抓包,服務器那邊是這樣的:
從ServerAgent的日志來着,應該是開啟監聽后,建立tcp連接—>接收test指令測試—>接收cpu、內存等客戶端預先配置的監控指標收集命令—>關閉連接,大致是這么個步驟。
那就看看wireshark吧。wireshark是抓整個網卡的,所以一些無效信息會比較多,通過兩端的ip過濾,果然找到了4444端口相關的交互信息。
首先,確定通訊協議是tcp。然后就是tcp的三次握手,以及發送test指令,發送資源收集指令,一清二楚。
第一次是客戶端發往服務端的,no.57,標識為SYN,表示客戶端想要發起連接,帶了一個客戶端SEQ=0(SEQ隨機生成);
第二次是服務端響應客戶端,no.58,標識為ACK,表示服務端的響應,並返回ACK=客戶端SEQ+1(本次返回ACK=1),同時帶上服務端SEQ=0;
第三次為客戶端的確認,no.59,檢查ACK是否等於客戶端SEQ+1,如果正確,則發送ACK=服務端SEQ+1(本次ACK=1);服務端收到后,三次握手完成,連接成功;
第四次為發送請求數據,no.60,標識為PSH,表示有請求數據,可以看到確實帶了個test指令,只不過是16進制的;
第五次為服務端對test指令的響應,no.61,返回了個Yep;
第六次就是真正的請求資源了,no.62,發了所有配置的資源選項,只不過仍然是16進制的;
至此,工作過程已經很明確了,tcp會一直保持連接,直至主動斷開為止,客戶端會源源不斷接收到服務端的資源數據。
測試
那我們就發tcp測試下吧,把wireshark抓到的16進制拿過來,或者自己把那段資源指標轉為16進制,可能有結束符或者空格,轉出來不一定對,還是直接照16進制那個抄吧。
把AgentServer重啟一下,然后用jmeter創建tcp請求,照着wireshark抄那個請求的16進制Data。
然后運行測試,發現請求會一直執行,直到手動結束測試。看看服務端和得到的響應數據吧。
看這控制台輸出,應該是沒問題。然后看下jmeter請求的返回值。
返回了不少,不過也是16進制的,當然執行的時間越長,返回的數據量越多。
把16進制解出來看下,嗯沒錯,就是這些了,按照順序對到相應的指標上就行了。
這么看,完全可以用ServerAgent做個簡單的資源監控系統啊,代碼里發請求,解析返回的響應,然后呈現在圖像上,易配置,跨操作系統,基本不占資源,想開就開,豈不是美滋滋。