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

2021-10-22 14:27:03 字數 4063 閱讀 1410

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 協議的。

linux 下的頻寬 延時 吞吐率 PPS

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

頻寬 線速 吞吐量

頻寬 頻寬應用的領域非常多,可以用來標識訊號傳輸的資料傳輸能力 標識單位時間內通過鏈路的資料量 標識顯示器的顯示能力。1 在模擬訊號系統又叫頻寬,是指在固定的時間可傳輸的資料數量,亦即在傳輸管道中可以傳遞資料的能力。通常以每秒傳送週期或赫茲 hz 來表示。2 在數字裝置中,頻寬指單位時間能夠通過鏈路...

傳輸速率 頻寬 吞吐量概念區別

舉個例吧 一條路每秒最多能過100輛車 寬頻就相當於100輛 秒 而並不是每秒都會有100輛車過,假如第一秒有0輛,第二秒有10輛.但是最多不能超過100輛 所以有第1秒0輛 秒,第2秒10輛 秒,第3秒30輛 秒,這不能說頻寬多少吧,於是就用吞吐量表示具體時間通過的量有多少 也有可能等於頻寬的量 ...