1. 程式人生 > 其它 >TCP 應答時間引數對網路效能的影響

TCP 應答時間引數對網路效能的影響

TCP 應答延遲的概念

TCP 應答延遲是 TCP 傳輸層的一個優化策略,為了降低網路資料包壓力,減少小資料包而進行的一個處理,稱之為 Nagle 演演算法。從本質上講,幾個 應答響應可能結合在一起,成一個響應,減少協議開銷。然而,在某些情況下,該技術可以降低應用程式的效能。

通常情況下,在伺服器之間收發資料包,依據 TCP 協議,節點 A 向節點 B 傳送一個數據報文 , 節點 B 收到這個資料報文以後,會向節點 A 返回一個 acknowledge 資訊。然後,對於 A 節點向 B 節點發送的資料報文,可能只是簡單的資訊傳遞,也有可能是請求資訊,對於請求資訊,B 節點還需要返回相應的資料報文。

預設當客戶端向伺服器端發出一個數據報文之後,希望得到伺服器端的確認。在一些互動式應用中,比如 telnet,當客戶端輸入一個字串命令時,該字串是以單個位元組被傳送到伺服器,伺服器 TCP 程序收到來自的客戶端的資料之後向客戶端傳送一個 ACK 確認已經收到來自客戶端的資料,之後將資料交給應用層 telnet。伺服器應用層需要將收到的資料回顯到客戶端螢幕,於是伺服器將需要回顯的資料交由 TCP 程序傳送。伺服器 TCP 程序再將需要回顯的資料發往客戶端,客戶端收到來自的伺服器端的資料之後需要傳送一個 ACK 來向伺服器確認資料已經收到。之後客戶端再次傳送 telnet 字串命令的下一個位元組。

這個過程中,TCP 連線共產生了 4 個報文。在這個模型中,我們可以將伺服器往客戶傳送的資料位元組確認報文和資料位元組回顯報文合併成一個報文,這樣,上述 TCP 連線就只需交換 3 個報文。

於是,下面引入延遲 ACK 機制:TCP 在接收到資料時不立即向傳送方返回 ACK,而是延遲傳送。一般延遲時間是 200ms。在等待發送 ACK 期間,TCP 收集需要往另一端傳送的資料,直到收集的資料大小超過 MSS 的定義或者延遲時間超時,TCP 才將 ACK 資訊和需要傳送的資料合併成一個報文一起傳送。這樣有利於減少網路中的資料包,避免網路擁塞。

TCP 應答的延遲的時間統計是從收到包開始統計的,因此,對於包較小的情況 tcp_nodelayack 的效果要明顯大於包比較大的情況。

例如,節點 A 向節點 B 發包,B 在接收到包的時候,就開始計算 ACK 延遲時間,由於包較小,很快可以接收完畢,接收完畢以後,檢視應答延遲,如果延遲時間 - 收包的時間 <=0, 那麼 B 節點會馬上將 ACK 返回給 A 節點。

舉個例子,例如 a 應答延遲設定成 100ms,B 節點收包用了 50ms,把麼 B 節點將會在收完網路包以後的 50ms 後,再向 A 節點發送 ack。

節點 A 向節點 B 發比較大的網路包,B 在接收到包的時候,就開始計算 ACK 延遲時間,由於包較大,接收需要一定的時間,網路包接收完畢以後,檢視應答延遲,如果延遲時間 - 收包的時間 <=0, 那麼 ACK 會返回給 A 節點。在這種情況下,即使 tcp_nodelayack 設定為 1,也就是沒有延遲,由於網路包較大,接收時間較長,延遲還是比接收小的資料包要大一些。

舉個例子,例如 a 應答延遲設定成 100ms,B 節點收包用了 150ms,由於 100-150<0,B 節點會馬上將 ack 返回給 A 節點。因此,可以說,對於包較小的情況,tcp_nodelayack 的效果要大於包比較大的情況明顯。

AIX 中的應答延遲引數

網絡卡的 intr_rate 引數設定

對於物理網絡卡而言,我們可以通過設定 intr_rate 來設定網絡卡的最大中斷頻率。需要注意的是,虛擬網絡卡和 IVE 網絡卡是沒有這個引數的。

圖 1. 網絡卡的引數設定

intr_rate 代表著每秒網絡卡中斷的次數,預設的數值是 10000 次。通過對網絡卡最大中斷次數的限制,網絡卡會將多個小的網路包聚集在一起,一次傳送。這樣帶來的好處是提高網絡卡的效能,帶來的缺點是降低了網絡卡的響應時間。

我們可以將 intr_rate 設定成 0-10000 中的任何一個數值

 #chdev -l ent0 -a intr_rate=100 – P
圖 2. 網絡卡的 intr_rate 引數設定

如果將這個值設定成 0,就是從系統層面將網絡卡中斷次數的限制關閉,即收發網路包沒有延遲。

測試 intr_rate 引數設定對網路效能的影響

我們通過一個指令碼,增加網路壓力。

圖 3. 網路加壓指令碼

為了保證網路壓力,執行這個指令碼 30 次:

 /.ftp $1 25.39 $2 15000000&

檢視此時的網路流量:

圖 4. 網絡卡的網路效能

此時,將 ent0 的網絡卡 intr_rate 的數值從預設 1000 修改為 0:

圖 5. 修改網絡卡的引數

觀察網路流量的變更:

圖 6. 觀察網絡卡的效能

網絡卡流量和接收包的數量略有增加,但並不顯著。

檢視此段時間收集的 nmon,網絡卡的網路包的數量並未有顯著變化。因此,對於 intr_rate 引數,通常情況下我們使用預設的引數即可,即 10000。

圖 7. 觀察 nmon 結果輸出

tcp_nodelayack 引數

如下圖所示,在 AIX 6.1 中,可以使用 no -a 命令對 tcp_nodelayack 引數進行檢視,這個引數預設設定為 0。

圖 8. tcp_nodelayack 引數值

在 AIX 系統中,預設的 TCP 應答的延遲的 200ms,如果將 tcp_nodelayack 設定為 1,將沒有延遲。對於 packet 較小的系統,將 tcp_nodelayack 設定為 1,將會造成網絡卡發包數量的大幅增加。這個引數可以動態調整:

 # no -o tcp_nodelayack=1 
 Setting tcp_nodelayack to 1

我們繼續採用上小節中的實驗場景,啟動八個 ftp 指令碼,在引數修改前,網路情況如下圖:

圖 9. 觀察網路效能

此時,我們將 tcp_nodelayack 引數設定為 1:

然後觀察網絡卡的效能,並沒有太顯著的變化:

圖 10. 觀察網路效能

此時,我們將對端伺服器,也就是 172.16.15.56 伺服器的引數設定為 1,再觀察網路效能:

圖 11. 觀察網路效能

此時網絡卡接收網路包的數量大幅增加。在網絡卡吞吐量基本不變的情況下,接收網路包的數量大度增加,會提高資料的傳輸速度,從而提高網路效能。

fasttimo 引數

如果我們想將應答延遲設定成 0-200ms 之間的數值,可以將 tcp_nodelayack 設定為 0,然後調整如下數值(例如調整為 50ms):

#no -o fasttimo=50
 Setting fasttimo to 50

需要注意的是,應答延遲的設定,儘量在收發端設定為一致。而引數設定為多少,要結合應用的型別和網路包的型別,而不是簡單地設定成 0 或者 200。

如何監控網絡卡的響應時間

使用 ping

我們可以使用 ping,大概計算一下從一個伺服器向對端網絡卡發包的速度。

 # date;ping -c 10000 -f 172.16.15.56;date
圖 12. ping 命令的使用

由於目前網路上沒有壓力,因此從上面的結果,大致可以判斷髮 10000 個網路包用了 2s 的時間,網絡卡響應很快。round-trip 可以作為網絡卡響應時間的衡量值。

執行指令碼:

#/.ftp $1 15.56 $2 15000000
圖 13. 執行網路加壓指令碼

此時監控網絡卡的響應時間,同樣 10000 個網路包,需要 4 秒鐘才能完成,round-trip 中的 max 值也從上一個場景的 0 增加到了 3。

圖 14. 執行 ping 命令

啟動三個 FTP 指令碼,再監控網絡卡的響應時間:

圖 15. 執行三個網路加壓指令碼

檢視 ping 結果:

圖 16. ping 命令執行結果

我們可以看到包的傳輸時間和網絡卡的響應時間最大值都有所增減。

使用 netstat -in 我們通過寫一個簡單的迴圈,可以監控網絡卡收發佇列中的包的數量:

圖 17. netstat 指令碼

執行指令碼:

圖 18. netstat 指令碼輸出

從上圖可以看出,本機網絡卡的接收佇列為 0,傳送佇列的包數量比較多,可以粗略地判斷本機網絡卡的影響時間和效能沒有存在太大的問題,而如果傳送佇列中長期積壓很多的網路包,則需要從對端網絡卡進行分析,即目標地址:172.16.15.56 的網絡卡。