linux 下的頻寬 延時 吞吐率 PPS

2021-10-12 03:31:34 字數 4219 閱讀 4275

linux 網路協議棧是根據 tcp/ip 模型來實現的,tcp/ip 模型由應用層、傳輸層、網路層和網路介面層,共四層組成,每一層都有各自的職責。

應用程式要傳送資料報時,通常是通過 socket 介面,於是就會發生系統呼叫,把應用層的資料拷貝到核心裡的 socket 層,接著由網路協議棧從上到下逐層處理後,最後才會送到網絡卡傳送出去。

而對於接收網路包時,同樣也要經過網路協議逐層處理,不過處理的方向與傳送資料時是相反的,也就是從下到上的逐層處理,最後才送到應用程式。

網路的速度往往跟使用者體驗是掛鉤的,那我們又該用什麼指標來衡量 linux 的網路效能呢?以及如何分析網路問題呢?

這次,我們就來說這些。

通常是以 4 個指標來衡量網路的效能,分別是頻寬、延時、吞吐率、pps(packet per second),它們表示的意義如下:

當然,除了以上這四種基本的指標,還有一些其他常用的效能指標,比如:

你可能會問了,如何觀測這些效能指標呢?不急,繼續往下看。

要想知道網路的配置和狀態,我們可以使用ifconfig或者ip命令來檢視。

這兩個命令功能都差不多,不過它們屬於不同的軟體包,ifconfig屬於net-tools軟體包,ip屬於iproute2軟體包,我的印象中net-tools軟體包沒有人繼續維護了,而iproute2軟體包是有開發者依然在維護,所以更推薦你使用ip工具。

學以致用,那就來使用這兩個命令,來檢視網口eth0的配置等資訊:

雖然這兩個命令輸出的格式不盡相同,但是輸出的內容基本相同,比如都包含了 ip 位址、子網掩碼、mac 位址、閘道器位址、mtu 大小、網口的狀態以及網路包收發的統計資訊,下面就來說說這些資訊,它們都與網路效能有一定的關係。

第一,網口的連線狀態標誌。其實也就是表示對應的網口是否連線到交換機或路由器等裝置,如果ifconfig輸出中看到有running,或者ip輸出中有lower_up,則說明物理網路是連通的,如果看不到,則表示網口沒有接網線。

第二,mtu 大小。預設值是1500位元組,其作用主要是限制網路包的大小,如果 ip 層有乙個資料報要傳,而且資料幀的長度比鏈路層的 mtu 還大,那麼 ip 層就需要進行分片,即把資料報分成干片,這樣每一片就都小於 mtu。事實上,每個網路的鏈路層 mtu 可能會不一樣,所以你可能需要調大或者調小 mtu 的數值。

第三,網口的 ip 位址、子網掩碼、mac 位址、閘道器位址。這些資訊必須要配置正確,網路功能才能正常工作。

第四,網路包收發的統計資訊。通常有網路收發的位元組數、包數、錯誤數以及丟包情況的資訊,如果tx(傳送) 和rx(接收) 部分中 errors、dropped、overruns、carrier 以及 collisions 等指標不為 0 時,則說明網路傳送或者接收出問題了,這些出錯統計資訊的指標意義如下:

ifconfigip命令只顯示的是網口的配置以及收發資料報的統計資訊,而看不到協議棧裡的資訊,那接下來就來看看如何檢視協議棧裡的資訊。

我們可以使用netstat或者ss,這兩個命令檢視 socket、網路協議棧、網口以及路由表的資訊。

雖然netstatss命令檢視的資訊都差不多,但是如果在生產環境中要檢視這類資訊的時候,盡量不要使用netstat命令,因為它的效能不好,在系統比較繁忙的情況下,如果頻繁使用netstat命令則會對效能的開銷雪上加霜,所以更推薦你使用效能更好的ss命令。

從下面這張圖,你可以看到這兩個命令的輸出內容:

可以發現,輸出的內容都差不多, 比如都包含了 socket 的狀態(state)、接收佇列(recv-q)、傳送佇列(send-q)、本地位址(local address)、遠端位址(foreign address)、程序 pid 和程序名稱(pid/program name)等。

接收佇列(recv-q)和傳送佇列(send-q)比較特殊,在不同的 socket 狀態。它們表示的含義是不同的。

當 socket 狀態處於established時:

而當 socket 狀態處於listen時:

在 tcp 三次握手過程中,當伺服器收到客戶端的 syn 包後,核心會把該連線儲存到半連線佇列,然後再向客戶端傳送 syn+ack 包,接著客戶端會返回 ack,服務端收到第三次握手的 ack 後,核心會把連線從半連線佇列移除,然後建立新的完全的連線,並將其增加到全連線佇列 ,等待程序呼叫accept()函式時把連線取出來。

半連線佇列與全連線佇列

也就說,全連線佇列指的是伺服器與客戶端完了 tcp 三次握手後,還沒有被accept()系統呼叫取走連線的佇列。

那對於協議棧的統計資訊,依然還是使用netstatss,它們檢視統計資訊的命令如下:

ss命令輸出的統計資訊相比netsat比較少,ss只顯示已經連線(estab)、關閉(closed)、孤兒(orphaned) socket 等簡要統計。

netstat則有更詳細的網路協議棧資訊,比如上面顯示了 tcp 協議的主動連線(active connections openings)、被動連線(passive connection openings)、失敗重試(failed connection attempts)、傳送(segments send out)和接收(segments received)的分段數量等各種資訊。

可以使用sar命令當前網路的吞吐率和 pps,用法是給sar增加-n引數就可以檢視網路的統計資訊,比如

比如,我通過sar命令獲取了網口的統計資訊:

它們的含義:

對於頻寬,我們可以使用ethtool命令來查詢,它的單位通常是gb/s或者mb/s,不過注意這裡小寫字母b,表示位元而不是位元組。我們通常提到的千兆網絡卡、萬兆網絡卡等,單位也都是位元(bit)。如下你可以看到, eth0 網絡卡就是乙個千兆網絡卡:

$ ethtool eth0 | grep speed

speed: 1000mb/s

要測試本機與遠端主機的連通性和延時,通常是使用ping命令,它是基於 icmp 協議的,工作在網路層。

顯示的內容主要包含icmp_seq(icmp 序列號)、ttl(生存時間,或者跳數)以及time(往返延時),而且最後會彙總本次測試的情況,如果網路沒有丟包,packet loss的百分比就是 0。

不過,需要注意的是,ping不通伺服器並不代表 http 請求也不通,因為有的伺服器的防火牆是會禁用 icmp 協議的。

頻寬 延時 吞吐率 PPS 這些都是啥?

linux 網路協議棧是根據 tcp ip 模型來實現的,tcp ip 模型由應用層 傳輸層 網路層和網路介面層,共四層組成,每一層都有各自的職責。應用程式要傳送資料報時,通常是通過 socket 介面,於是就會發生系統呼叫,把應用層的資料拷貝到核心裡的 socket 層,接著由網路協議棧從上到下逐...

頻寬 資料率(位元率) 吞吐量的理解

頻寬 資料率 位元率 吞吐量的理解。總 頻寬在模擬時指的是訊號的頻頻寬度,單位是hz。在數字時指的就是資料率或位元率,單位是bit s。正因為頻寬可以代表數碼訊號的傳送速率,因此頻寬 即資料率或位元率 有時也稱為吞吐量,後者單位也是bit s,但嚴格意義上吞吐量受額定資料率的限制,並小於其額定資料率...

Linux下timer延時的使用

因筆者工作在嵌入式平台上 非x386 下面給出的結論僅在arm平台上測試過。1.在原子上下文,延遲應該少於100微秒。使用udelay 2.在非原子上下文延遲的使用 0 100us 使用udelay 100us以上 使用usleep range 20ms以上且不要求精確 使用msleep mslee...