Linux 網絡常用性能指標 帶寬、延遲、吞吐率、pps的基本概念


Linux 網絡協議棧是根據 TCP/IP 模型來實現的,TCP/IP 模型由應用層、傳輸層、網絡層和網絡接口層,共四層組成,每一層都有各自的職責。

 

 

應用程序要發送數據包時,通常是通過 socket 接口,於是就會發生系統調用,把應用層的數據拷貝到內核里的 socket 層,接着由網絡協議棧從上到下逐層處理后,最后才會送到網卡發送出去。

而對於接收網絡包時,同樣也要經過網絡協議逐層處理,不過處理的方向與發送數據時是相反的,也就是從下到上的逐層處理,最后才送到應用程序。

網絡的速度往往跟用戶體驗是掛鈎的,那我們又該用什么指標來衡量 Linux 的網絡性能呢?以及如何分析網絡問題呢?

性能指標有哪些?

通常是以 4 個指標來衡量網絡的性能,分別是帶寬、延時、吞吐率、PPS(Packet Per Second),它們表示的意義如下:

  • 帶寬,表示鏈路的最大傳輸速率,單位是 b/s (比特 / 秒),帶寬越大,其傳輸能力就越強。
  • 延時,表示請求數據包發送后,收到對端響應,所需要的時間延遲。不同的場景有着不同的含義,比如可以表示建立 TCP 連接所需的時間延遲,或一個數據包往返所需的時間延遲。
  • 吞吐率,表示單位時間內成功傳輸的數據量,單位是 b/s(比特 / 秒)或者 B/s(字節 / 秒),吞吐受帶寬限制,帶寬越大,吞吐率的上限才可能越高。
  • PPS,全稱是 Packet Per Second(包 / 秒),表示以網絡包為單位的傳輸速率,一般用來評估系統對於網絡的轉發能力。

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

  • 網絡的可用性,表示網絡能否正常通信;
  • 並發連接數,表示 TCP 連接數量;
  • 丟包率,表示所丟失數據包數量占所發送數據組的比率;
  • 重傳率,表示重傳網絡包的比例;

你可能會問了,如何觀測這些性能指標呢?

網絡配置如何看?

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

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

ifconfig mgmt0

來查看網口 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 時,則說明網絡發送或者接收出問題了,這些出錯統計信息的指標意義如下:

  • errors 表示發生錯誤的數據包數,比如校驗錯誤、幀同步錯誤等;
  • dropped 表示丟棄的數據包數,即數據包已經收到了 Ring Buffer(這個緩沖區是在內核內存中,更具體一點是在網卡驅動程序里),但因為系統內存不足等原因而發生的丟包;
  • overruns 表示超限數據包數,即網絡接收/發送速度過快,導致 Ring Buffer 中的數據包來不及處理,而導致的丟包,因為過多的數據包擠壓在 Ring Buffer,這樣 Ring Buffer 很容易就溢出了;
  • carrier 表示發生 carrirer 錯誤的數據包數,比如雙工模式不匹配、物理電纜出現問題等;
  • collisions 表示沖突、碰撞數據包數;

ifconfig 和 ip 命令只顯示的是網口的配置以及收發數據包的統計信息,而看不到協議棧里的信息,那接下來就來看看如何查看協議棧里的信息

socket 信息如何查看?

我們可以使用 netstat 或者 ss,這兩個命令查看 socket、網絡協議棧、網口以及路由表的信息。

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

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

 

可以發現,輸出的內容都差不多, 比如都包含了 socket 的狀態(State)、接收隊列(Recv-Q)、發送隊列(Send-Q)、本地地址(Local Address)、遠端地址(Foreign Address)、進程 PID 和進程名稱(PID/Program name)等。

接收隊列(Recv-Q)和發送隊列(Send-Q)比較特殊,在不同的 socket 狀態。它們表示的含義是不同的。

當 socket 狀態處於 Established時:

  •      Recv-Q 表示 socket 緩沖區中還沒有被應用程序讀取的字節數;
  •      Send-Q 表示 socket 緩沖區中還沒有被遠端主機確認的字節數;

而當 socket 狀態處於 Listen 時:

  •      Recv-Q 表示全連接隊列的長度;
  •      Send-Q 表示全連接隊列的最大長度;

在 TCP 三次握手過程中,當服務器收到客戶端的 SYN 包后,內核會把該連接存儲到半連接隊列,然后再向客戶端發送 SYN+ACK 包,接着客戶端會返回 ACK,服務端收到第三次握手的 ACK 后,內核會把連接從半連接隊列移除,然后創建新的完全的連接,並將其增加到全連接隊列 ,等待進程調用 accept() 函數時把連接取出來。

 

 

也就說,全連接隊列指的是服務器與客戶端完成了 TCP 三次握手后,還沒有被 accept() 系統調用取走連接的隊列。

那對於協議棧的統計信息,依然還是使用 netstat 或 ss,它們查看統計信息的命令如下:

 

 

 

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

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

網絡吞吐率和 PPS 如何查看?

可以使用 sar 命令查看當前網絡的吞吐率和 PPS,用法是給 sar 增加 -n 參數就可以查看網絡的統計信息,比如

  •      sar -n DEV,顯示網口的統計數據;
  •      sar -n EDEV,顯示關於網絡錯誤的統計數據;
  •      sar -n TCP,顯示 TCP 的統計數據

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

 

 它們的含義:

  • rxpck/s 和 txpck/s 分別是接收和發送的 PPS,單位為包 / 秒。
  • rxkB/s 和 txkB/s 分別是接收和發送的吞吐率,單位是 KB/ 秒。
  • rxcmp/s 和 txcmp/s 分別是接收和發送的壓縮數據包數,單位是包 / 秒。

對於帶寬,我們可以使用 ethtool 命令來查詢,它的單位通常是 Gb/s 或者 Mb/s,不過注意這里小寫字母 b ,表示比特而不是字節。我們通常提到的千兆網卡、萬兆網卡等,單位也都是比特(bit)。如下你可以看到, eth0 網卡就是一個千兆網卡:

 

連通性和延時如何查看?

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

比如,如果要測試本機到 192.168.12.20 IP 地址的連通性和延時:

 

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

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

總結

網絡的指標:
帶寬:使用命令行 ethtool eth0 | grep Speed
延時:使用命令行ping 命令輸出結果的time字段的值
吞吐率:使用命令行sar -n命令
pps:使用命令行sar -n命令
網絡的可用性:使用命令行ping命令
並發連接數:使用ss -s命令或者netstat -s
丟包率:使用ss -s命令或者netstat -s
重傳率:使用ss -s命令或者netstat -s
網口的連接狀態:查看ifconfig 輸出中看到有 RUNNING,或者 ip 輸出中有 LOWER_UP,則說明物理網路是連通的,如果看不到,則表示網口沒有接網線。
mtu大小:使用命令行 ip -s add show dev mgmt0或者ifconfig mgmt0

 

文章轉載:https://mp.weixin.qq.com/s/uud_LciJ_9MaRTXgryKQ5A

備注:

ss 是 Socket Statistics 的縮寫。ss 命令可以用來獲取 socket 統計信息,它顯示的內容和 netstat 類似。但 ss 的優勢在於它能夠顯示更多更詳細的有關 TCP 和連接狀態的信息,而且比 netstat 更快。當服務器的 socket 連接數量變得非常大時,無論是使用 netstat 命令還是直接 cat /proc/net/tcp,執行速度都會很慢。ss 命令利用到了 TCP 協議棧中 tcp_diag。tcp_diag 是一個用於分析統計的模塊,可以獲得 Linux 內核中第一手的信息,因此 ss 命令的性能會好很多。

常用選項

-h, --help 幫助

-V, --version  顯示版本號

-t, --tcp 顯示 TCP 協議的 sockets

-u, --udp 顯示 UDP 協議的 sockets

-x, --unix 顯示 unix domain sockets,與 -f 選項相同

-n, --numeric 不解析服務的名稱,如 "22" 端口不會顯示成 "ssh"

-l, --listening 只顯示處於監聽狀態的端口

-p, --processes 顯示監聽端口的進程(Ubuntu 上需要 sudo)

-a, --all 對 TCP 協議來說,既包含監聽的端口,也包含建立的連接

-r, --resolve 把 IP 解釋為域名,把端口號解釋為協議名稱


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM