Wireshark?TS系統(tǒng)吞吐慢問題解決方案
問題背景
用戶反饋一個場景,說是兩個系統(tǒng)之間的吞吐很慢。吞吐量是系統(tǒng)性能分析中一個很重要的衡量指標(biāo),相關(guān)影響的因素也會有很多,因此反映在網(wǎng)絡(luò)數(shù)據(jù)包分析上,也會是一個相對比較復(fù)雜的分析過程。
案例取自 SharkFest 2010《Packet Trace Whispering》
問題信息
跟蹤文件基本信息如下:
λ capinfos EvilOddFinal.pcap
File name: EvilOddFinal.pcap
File type: Wireshark/tcpdump/... - pcap
File encapsulation: Ethernet
File timestamp precision: microseconds (6)
Packet size limit: file hdr: 8192 bytes
Packet size limit: inferred: 64 bytes
Number of packets: 1004
File size: 80 kB
Data size: 1109 kB
Capture duration: 6.013219 seconds
First packet time: 2010-01-13 04:55:32.247712
Last packet time: 2010-01-13 04:55:38.260931
Data byte rate: 184 kBps
Data bit rate: 1475 kbps
Average packet size: 1104.69 bytes
Average packet rate: 166 packets/s
SHA256: 19cc103f13f74f8c3359f99c5ff883cce880361c823ff736c4b6d89d26e68b9e
RIPEMD160: d879ea22aaff08a5b7a44ecd68b86cb71053bf46
SHA1: afc170ee286153a9d9ce8dd19a9a4fe27d3df46b
Strict time order: True
Number of interfaces in file: 1
Interface #0 info:
Encapsulation = Ethernet (1 - ether)
Capture length = 8192
Time precision = microseconds (6)
Time ticks per second = 1000000
Number of stat entries = 0
Number of packets = 1004
λ
跟蹤文件在 linux 上通過 tcpdump 所捕獲,數(shù)據(jù)包數(shù)量 1004 個,長度截斷為 64 字節(jié),文件數(shù)據(jù)大小 1109K 字節(jié),捕獲時長約 6 秒,平均速率 1475 kbps。
專家信息如下,異常簡潔,可以看到?jīng)]有任何一條 Warning 信息,像是重傳、亂序等,在簡單排除些常見性問題之后,真實(shí)原因就需要進(jìn)一步實(shí)際分析了。

此外統(tǒng)計(jì) - 會話信息如下,僅有一條 TCP 流,數(shù)據(jù)主要傳輸?shù)姆较蚴?10.10.10.10 -> 192.168.1.10,速率低,僅為 1451 kbps,確實(shí)符合吞吐慢的現(xiàn)象。

同樣統(tǒng)計(jì) - I/O Graphs 如下,有比較明顯一段時間,前后沒有任何數(shù)據(jù)傳輸,整體速率低。

問題分析
展開數(shù)據(jù)包跟蹤文件的主視圖,首先是 TCP 三次握手信息 。

簡要分析如下:
- IRTT 0.000339 秒,判斷在一個局域網(wǎng)內(nèi);
- 考慮到 SYN、SYN/ACK、ACK 的時間差,判斷抓包點(diǎn)在服務(wù)器或者靠近服務(wù)器的地方;
- 客戶端 Win 64512,不支持 WS(Window Scale 因子);服務(wù)器 Win 32768 ,也不支持 WS;
- 客戶端和服務(wù)器 MSS 均為 1460,標(biāo)準(zhǔn)值;
- 客戶端和服務(wù)器不支持 SACK 等;
- 客戶端和服務(wù)器不支持時間戳。
由于該 TCP Stream 不支持 WS 和 SACK ,此處的低效率可能會是一個問題。
考慮到整體傳輸速率低以及 I/O Graph 圖示結(jié)果,可以增加 frame.time_delta_displayed 信息列,檢查數(shù)據(jù)幀之間的時間間隔,并從大到小依次排序。

可見有明顯的一些大延遲,包括最大的 3.26s,多個 195ms 等等,依次分析:
- 3.26s
來自于客戶端 No.238 數(shù)據(jù)幀,Wireshark 也明顯的指示出這是一個 TCP Window Update 數(shù)據(jù)包,為客戶端的 Window 更新。
定位到 No.238 前后,可以看到數(shù)據(jù)傳輸方向是服務(wù)器端 10.10.10.10 -> 客戶端 192.168.1.10 ,服務(wù)器發(fā)送多個 MSS 分段,客戶端依次進(jìn)行 ACK 確認(rèn)。但在 No.237 的 Window 窗口明顯持續(xù)降低至 436(可能是客戶端的應(yīng)用處理能力問題,使得窗口未能及時釋放),由于接收窗口小于 1 個 MSS,使得服務(wù)器無法繼續(xù)發(fā)送數(shù)據(jù),直到客戶端 No.238 發(fā)送的 Window 更新,之后服務(wù)器才繼續(xù)發(fā)送數(shù)據(jù)。

故此處 3.26s 大延遲問題是 TCP Window 過小的原因,建議開啟支持 TCP WS 或檢查客戶端性能解決低效率問題。
- 195ms
195ms 同樣是來自于客戶端的延遲,展開其中一個 No.570 數(shù)據(jù)幀前后,也是可以看到數(shù)據(jù)傳輸方向是服務(wù)器端 10.10.10.10 -> 客戶端 192.168.1.10 ,服務(wù)器發(fā)送多個 MSS 分段,客戶端依次進(jìn)行 ACK 確認(rèn)。
客戶端 No.569 ACK 確認(rèn) No.553,但在收到服務(wù)器應(yīng)用所發(fā)送數(shù)據(jù)的最后一個分段 No.554 (帶有 PSH 標(biāo)志位),由于延遲 ACK 的機(jī)制,客戶端在等待服務(wù)器的第二個數(shù)據(jù)包到達(dá),但是剛好是應(yīng)用發(fā)送的最后一個分段,奇數(shù)問題~ 所以延遲確認(rèn)約 200ms 左右,客戶端才發(fā)送了 No.570 ACK 。

雖然看起來僅延遲了 200ms,但隨著數(shù)據(jù)傳輸?shù)倪M(jìn)行,會產(chǎn)生很多次類似這樣奇數(shù)包的接收延遲確認(rèn)(以下 No.632 同樣),所以加總起來也是一段比較大的空閑等待時間。實(shí)際上延遲確認(rèn)本身并沒有什么問題,但視實(shí)際應(yīng)用場景,也是可以通過設(shè)置像是 TCP_QUICKACK 選項(xiàng)來取消延遲確認(rèn)。

延遲 ACK參考
TCP Delayed ACK(延遲確認(rèn))為了努力改善網(wǎng)絡(luò)性能,它將幾個 ACK 響應(yīng)組合合在一起成為單個響應(yīng),或者將 ACK 響應(yīng)與響應(yīng)數(shù)據(jù)一起發(fā)送給對方,從而減少協(xié)議開銷。 具體的做法:
- 當(dāng)有響應(yīng)數(shù)據(jù)要發(fā)送時,ACK 會隨響應(yīng)數(shù)據(jù)立即發(fā)送給對方;
- 如果沒有響應(yīng)數(shù)據(jù),ACK 將會延遲發(fā)送,以等待看是否有響應(yīng)數(shù)據(jù)可以一起發(fā)送;
- 如果在等待發(fā)送 ACK 期間,對方的第二個數(shù)據(jù)包又到達(dá)了,這時要立即發(fā)送 ACK。但是如果對方的三個數(shù)據(jù)包相繼到達(dá),第三個數(shù)據(jù)段到達(dá)時是否立即發(fā)送 ACK,則取決于以上兩條。
問題總結(jié)
所以總體來說,系統(tǒng)吞吐慢,不一定全是網(wǎng)絡(luò)擁塞、丟包所產(chǎn)生的問題,TCP 窗口以及協(xié)議層面的一些機(jī)制,同樣也有可能是原因所在。
以上就是Wireshark TS系統(tǒng)吞吐慢問題解決方案的詳細(xì)內(nèi)容,更多關(guān)于Wireshark TS系統(tǒng)吞吐的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Objective-C 動態(tài)調(diào)用NSInvocation 的方法
NSInvocation是Objective-C編程中一個強(qiáng)大的特性,它允許開發(fā)者在運(yùn)行時動態(tài)地調(diào)用方法,本文詳細(xì)介紹了如何使用NSInvocation來獲取方法的選擇器、創(chuàng)建實(shí)例、設(shè)置目標(biāo)對象和方法參數(shù),并執(zhí)行方法,感興趣的朋友跟隨小編一起看看吧2024-09-09
vscode+picgo+github配置免費(fèi)圖床(圖文教程)
本文主要介紹了vscode+picgo+github配置免費(fèi)圖床,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
風(fēng)中葉老師講述的學(xué)習(xí)方法(學(xué)習(xí)編程的朋友需要看)
風(fēng)中葉老師講述的學(xué)習(xí)方法(學(xué)習(xí)編程的朋友需要看),希望大家能按照說明的那樣,自己多動手動腦2008-10-10
Git撤銷已經(jīng)推送(push)至遠(yuǎn)端倉庫的提交(commit)信息操作
這篇文章主要介紹了Git撤銷已經(jīng)推送(push)至遠(yuǎn)端倉庫的提交(commit)信息操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

