一文掌握 Linux 效能分析之網路篇(續)
本文首發於我的公眾號 CloudDeveloper(ID: cloud_dev) ,專注於乾貨分享,號內有大量書籍和視訊資源,後臺回覆 「1024」 即可領取,歡迎大家關注,二維碼文末可以掃。
這是 Linux 效能分析系列的第五篇,前四篇在這裡:
在上篇網路篇中,我們已經介紹了幾個 Linux 網路方向的效能分析工具,本文再補充幾個。總結下來,餘下的工具包括但不限於以下幾個:
- sar:統計資訊歷史
- traceroute:測試網路路由
- dtrace:TCP/IP 棧跟蹤
- iperf / netperf / netserver:網路效能測試工具
- perf 效能分析神器
由於篇幅有限,本文會先介紹前面兩個,其他工具留作後面介紹,大家可以持續關注。
sar
sar 是一個系統歷史資料統計工具。統計的資訊非常全,包括 CPU、記憶體、磁碟 I/O、網路、程序、系統呼叫等等資訊,是一個集大成的工具,非常強大。在 Linux 系統上 sar --help
一下,可以看到它的完整用法。
- -A:所有報告的總和
- -u:輸出 CPU 使用情況的統計資訊
- -v:輸出 inode、檔案和其他核心表的統計資訊
- -d:輸出每一個塊裝置的活動資訊
- -r:輸出記憶體和交換空間的統計資訊
- -b:顯示 I/O和傳送速率的統計資訊
- -a:檔案讀寫情況
- -c:輸出程序統計資訊,每秒建立的程序數
- -R:輸出記憶體頁面的統計資訊
- -y:終端裝置活動情況
- -w:輸出系統交換活動資訊
- -n:輸出網路裝置統計資訊
在平時使用中,我們常常用來分析網路狀況,其他幾項的通常有更好的工具來分析。所以,本文會重點介紹 sar 在網路方面的分析手法。
Linux 系統用以下幾個選項提供網路統計資訊:
- -n DEV:網路介面統計資訊。
- -n EDEV:網路介面錯誤。
- -n IP:IP 資料報統計資訊。
- -n EIP:IP 錯誤統計資訊。
- -n TCP:TCP 統計資訊。
- -n ETCP:TCP 錯誤統計資訊。
- -n SOCK:套接字使用。
我們來看幾個示例:
(1)每秒列印 TCP 的統計資訊。
sar -n TCP 1
幾個引數瞭解一下:
- active/s:新的 TCP 主動連線(也就是 socket 中的 connect() 事件),單位是:連線數/s。
- passive/s:新的 TCP 被動連線(也就是 socket 中的 listen() 事件)。
- iseg/s:接收的段(傳輸層以段為傳輸單位),單位是:段/s
- oseg/s:傳送的段。
通過這幾個引數,我們基本可以知道當前系統 TCP 連線的負載情況。
(2)每秒列印感興趣的網絡卡的統計資訊
sar -n DEV 1 | awk 'NR == 3 || $3 == "eth0"'
幾個引數瞭解一下:
- rxpck/s / txpck/s:網絡卡接收/傳送的資料包,單位是:資料包/s。
- rxkB/s / txkB/s:網絡卡接收/傳送的千位元組,單位是:千位元組/s。
- rxcmp/s / txcmp/s:網絡卡每秒接受/傳送的壓縮資料包,單位是:資料包/s。
- rxmcst/s:每秒接收的多播資料包,單位是:資料包/s。
- %ifutil:網路介面的利用率。
這幾個引數對於分析網絡卡接收和傳送的網路吞吐量很有幫助。
(3)錯誤包和丟包情況分析
sar -n EDEV 1
幾個引數瞭解一下:
- rxerr/s / txerr/s:每秒鐘接收/傳送的壞資料包
- coll/s:每秒衝突數
- rxdrop/s:因為緩衝充滿,每秒鐘丟棄的已接收資料包數
- txdrop/s:因為緩衝充滿,每秒鐘丟棄的已傳送資料包數
- txcarr/s:傳送資料包時,每秒載波錯誤數
- rxfram/s:每秒接收資料包的幀對齊錯誤數
- rxfifo/s / txfifo/s:接收/傳送的資料包每秒 FIFO 過速的錯誤數
當發現介面傳輸資料包有問題時,檢視以上引數能夠讓我們快速判斷具體是出的什麼問題。
OK,這個工具就介紹到這裡,以上只是拋磚引玉,更多技巧還需要大家動手去探索,只有動手,才能融會貫通。
traceroute
traceroute 也是一個排查網路問題的好工具,它能顯示資料包到達目標主機所經過的路徑(路由器或閘道器的 IP 地址)。如果發現網路不通,我們可以通過這個命令來進一步判斷是主機的問題還是閘道器的問題。
它通過向源主機和目標主機之間的裝置傳送一系列的探測資料包(UDP 或者 ICMP)來發現裝置的存在,實現上利用了遞增每一個包的 TTL 時間,來探測最終的目標主機。比如開始 TTL = 1,當到達第一個閘道器裝置的時候,TTL - 1,TTL = 0 導致閘道器響應一個 ICMP 超時報文,這樣,如果沒有防火牆攔截的話,源主機就知道閘道器裝置的地址。以此類推,逐步增加 TTL 時間,就可以探測到目標主機之間所經過的路徑。
為了防止傳送和響應過程出現問題導致丟包,traceroute 預設會發送 3 個探測包,我們可以用 -q x 來改變探測的數量。如果中間裝置設定了防火牆限制,會導致源主機收不到響應包,就會顯示 * 號。如下是 traceroute baidu
的結果:
每一行預設會顯示裝置名稱(IP 地址)和對應的響應時間。傳送多少個探測包,就顯示多少個。如果只想顯示 IP 地址可以用 -n 引數,這個引數可以避免 DNS 域名解析,加快響應時間。
和這個工具類似的還有一個工具叫 pathchar ,但平時用的不多,我就不介紹了。
以上就是兩個工具的簡單介紹,工具雖然簡單,但只要能解決問題,就是好工具。當然, 效能分析不僅僅依靠工具就能解決的,更多需要我們多思考、多動手、多總結,逐步培養自己的系統能力,才能融會貫通 。
參考:
我的公眾號 CloudDeveloper(ID: cloud_dev) ,號內有大量書籍和視訊資源,後臺回覆 「1024」 即可領取,分享的內容包括但不限於雲端計算虛擬化、容器、OpenStack、K8S、霧計算、網路、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++程式設計技術等內容,歡迎大家關注。