一文掌握 Linux 性能分析之網絡篇

本文首發於個人公衆號 CloudDeveloper(ID: cloud_dev),專一於乾貨分享,號內有大量書籍和視頻資源,後臺回覆 「1024」便可領取,歡迎你們關注,二維碼文末能夠掃。

這是 Linux 性能分析系列的第四篇,前三篇在這裏:html

一文掌握 Linux 性能分析之 CPU 篇linux

一文掌握 Linux 性能分析以內存篇編程

一文掌握 Linux 性能分析之 I/O 篇數組

比較寬泛地講,網絡方向的性能分析既包括主機測的網絡配置查看、監控,又包括網絡鏈路上的包轉發時延、吞吐量、帶寬等指標分析。包括但不限於如下分析工具:服務器

  • ping:測試網絡連通性
  • ifconfig:接口配置
  • ip:網絡接口統計信息
  • netsat:多種網絡棧和接口統計信息
  • ifstat:接口網絡流量監控工具
  • netcat:快速構建網絡鏈接
  • tcpdump:抓包工具
  • sar:統計信息歷史
  • traceroute:測試網絡路由
  • pathchar:肯定網絡路徑特徵
  • dtrace:TCP/IP 棧跟蹤
  • iperf / netperf / netserver:網絡性能測試工具
  • perf 性能分析神器

本文先來看前面 7 個。網絡

ping

ping 發送 ICMP echo 數據包來探測網絡的連通性,除了能直觀地看出網絡的連通情況外,還能得到本次鏈接的往返時間(RTT 時間),丟包狀況,以及訪問的域名所對應的 IP 地址(使用 DNS 域名解析),好比:dom

咱們 ping baidu.com,-c 參數指定發包數。能夠看到,解析到了 baidu 的一臺服務器 IP 地址爲 220.181.112.244。RTT 時間的最小、平均、最大和算術平均差分別是 40.732ms、40.762ms、40.791ms 和 0.248。ssh

ifconfig

ifconfig 命令被用於配置和顯示 Linux 內核中網絡接口的統計信息。經過這些統計信息,咱們也可以進行必定的網絡性能調優。socket

1)ifconfig 顯示網絡接口配置信息

其中,RX/TX packets 是對接收/發送數據包的狀況統計,包括錯誤的包,丟掉多少包等。RX/TX bytes 是接收/發送數據字節數統計。其他還有不少參數,就不一一述說了,性能調優時能夠重點關注 MTU(最大傳輸單元) 和 txqueuelen(發送隊列長度),好比能夠用下面的命令來對這兩個參數進行微調:tcp

ifconfig eth0 txqueuelen 2000
ifconfig eth0 mtu 1500

2)網絡接口地址配置

ifconfig 還經常使用來配置網口的地址,好比:
爲網卡配置和刪除IPv6地址:

ifconfig eth0 add 33ffe:3240:800:1005::2/64    #爲網卡eth0配置IPv6地址
ifconfig eth0 del 33ffe:3240:800:1005::2/64    #爲網卡eth0刪除IPv6地址

修改MAC地址:

ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE

配置IP地址:

ifconfig eth0 192.168.2.10
ifconfig eth0 192.168.2.10 netmask 255.255.255.0
ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255

IP

ip 命令用來顯示或設置 Linux 主機的網絡接口、路由、網絡設備、策略路由和隧道等信息,是 Linux 下功能強大的網絡配置工具,旨在替代 ifconfig 命令,以下顯示 IP 命令的強大之處,功能涵蓋到 ifconfig、netstat、route 三個命令。

netstat

netstat 能夠查看整個 Linux 系統關於網絡的狀況,是一個集多鍾網絡工具於一身的組合工具。
經常使用的選項包括如下幾個:

  • 默認:列出鏈接的套接字
  • -a:列出全部套接字的信息
  • -s:各類網絡協議棧統計信息
  • -i:網絡接口信息
  • -r:列出路由表
  • -l:僅列出有在 Listen 的服務狀態
  • -p:顯示 PID 和進程名稱

各參數組合使用實例以下:

  • netstat -at 列出全部 TCP 端口
  • netstat -au 列出全部 UDP 端口
  • netstat -lt 列出全部監聽 TCP 端口的 socket
  • netstat -lu 列出全部監聽 UDP 端口的 socket
  • netstat -lx 列出全部監聽 UNIX 端口的 socket
  • netstat -ap | grep ssh 找出程序運行的端口
  • netstat -an | grep ':80' 找出運行在指定端口的進程

1)netstat 默認顯示鏈接的套接字數據

總體上來看,輸出結果包括兩個部分:

  • Active Internet connections :有源 TCP 鏈接,其中 Recv-Q 和 Send-Q 指的是接收隊列和發送隊列,這些數字通常都是 0,若是不是,說明請求包和回包正在隊列中堆積。
  • Active UNIX domain sockets:有源 UNIX 域套接口,其中 proto 顯示鏈接使用的協議,RefCnt 表示鏈接到本套接口上的進程號,Types 是套接口的類型,State 是套接口當前的狀態,Path 是鏈接到套接口的進程使用的路徑名。

2)netstat -i 顯示網絡接口信息

接口信息包括網絡接口名稱(Iface)、MTU,以及一系列接收(RX-)和傳輸(TX-)的指標。其中 OK 表示傳輸成功的包,ERR 是錯誤包,DRP 是丟包,OVR 是超限包。

這些參數有助於咱們對網絡收包狀況進行分析,從而判斷瓶頸所在。

3)netstat -s 顯示全部網絡協議棧的信息

能夠看到,這條命令可以顯示每一個協議詳細的信息,這有助於咱們針對協議棧進行更細粒度的分析。

4)netstat -r 顯示路由表信息

這條命令可以看到主機路由表的一個狀況。固然查路由咱們也能夠用 ip route 和 route 命令,這個命令顯示的信息會更詳細一些。

ifstat

ifstat 主要用來監測主機網口的網絡流量,經常使用的選項包括:

  • -a:監測主機全部網口
  • -i:指定要監測的網口
  • -t:在每行輸出信息前加上時間戳
  • -b:以 Kbit/s 顯示流量數據,而不是默認的 KB/s
  • -delay:採樣間隔(單位是 s),即每隔 delay 的時間輸出一次統計信息
  • -count:採樣次數,即共輸出 count 次統計信息

好比,經過如下命令統計主機全部網口某一段時間內的流量數據:

能夠看出,分別統計了三個網口的流量數據,前面輸出的時間戳,有助於咱們統計一段時間內各網口總的輸入、輸出流量。

netcat

netcat,簡稱 nc,命令簡單,但功能強大,在排查網絡故障時很是有用,所以它也在衆多網絡工具中有着「瑞士軍刀」的美譽。

它主要被用來構建網絡鏈接。能夠以客戶端和服務端的方式運行,當以服務端方式運行時,它負責監聽某個端口並接受客戶端的鏈接,所以能夠用它來調試客戶端程序;當以客戶端方式運行時,它負責向服務端發起鏈接並收發數據,所以也能夠用它來調試服務端程序,此時它有點像 Telnet 程序。

經常使用的選項包括如下幾種:

  • -l:以服務端的方式運行,監聽指定的端口。默認是以客戶端的方式運行。
  • -k:重複接受並處理某個端口上的全部鏈接,必須與 -l 一塊兒使用。
  • -n:使用 IP 地址表示主機,而不是主機名,使用數字表示端口號,而不是服務名稱。
  • -p:當以客戶端運行時,指定端口號。
  • -s:設置本地主機發出的數據包的 IP 地址。
  • -C:將 CR 和 LF 兩個字符做爲結束符。
  • -U:使用 UNIX 本地域套接字通訊。
  • -u:使用 UDP 協議通訊,默認使用的是 TCP 協議。
  • -w:若是 nc 客戶端在指定的時間內未檢測到任何輸入,則退出。
  • -X:當 nc 客戶端與代理服務器通訊時,該選項指定它們之間的通訊協議,目前支持的代理協議包括 「4」(SOCKS v.4),「5」(SOCKS v.5)和 「connect」 (HTTPs Proxy),默認使用 SOCKS v.5。
  • -x:指定目標代理服務器的 IP 地址和端口號。

下面舉一個簡單的例子,使用 nc 命令發送消息:

首先,啓動服務端,用 nc -l 0.0.0.0 12345 監聽端口 12345 上的全部鏈接。

而後,啓動客戶端,用 nc -p 1234 127.0.0.1 12345 使用 1234 端口鏈接服務器 127.0.0.1::12345。

接着就能夠在兩端互發數據了。這裏只是拋磚引玉,更多例子你們能夠多實踐。

tcpdump

最後是 tcpdump,強大的網絡抓包工具。雖然有 wireshark 這樣更易使用的圖形化抓包工具,但 tcpdump 仍然是網絡排錯的必備利器。

tcpdump 選項不少,我就不一一列舉了,你們能夠看文章末尾的引用來進一步瞭解。這裏列舉幾種 tcpdump 經常使用的用法。

1)捕獲某主機的數據包

好比想要捕獲主機 200.200.200.100 上全部收到和發出的全部數據包,使用:

tcpdump host 200.200.200.100

2)捕獲多個主機的數據包

好比要捕獲主機 200.200.200.1 和主機 200.200.200.2 或 200.200.200.3 的通訊,使用:

tcpdump host 200.200.200.1 and \(200.200.200.2 or \)

一樣要捕獲主機 200.200.200.1 除了和主機 200.200.200.2 以外全部主機通訊的 IP 包。使用:

tcpdump ip host 200.200.200.1 and ! 200.200.200.2

3)捕獲某主機接收或發出的某種協議類型的包

好比要捕獲主機 200.200.200.1 接收或發出的 Telnet 包,使用:

tcpdump tcp port 23 host 200.200.200.1

4)捕獲某端口相關的數據包

好比捕獲在端口 6666 上經過的包,使用:

tcpdump port 6666

5)捕獲某網口的數據包

好比捕獲在網口 eth0 上經過的包,使用:

tcpdump -i eth0

下面仍是舉個例子,抓取 TCP 三次握手的包:(具體抓包的過程請移步到個人公衆號進一步瞭解,那裏閱讀體驗好一點,謝謝。)

總結:

本文總結了幾種初級的網絡工具,基本的網絡性能分析,經過組合以上幾種工具,基本都能應付,但對於複雜的問題,以上工具可能就無能爲力了。更多高階的工具將在下文送上,敬請期待。

參考:
基礎 http://kuring.me/post/linux_n...

講 ip 和 ifconfig 很強大的一篇文章:

https://blog.csdn.net/freekin...

https://www.alibabacloud.com/...

性能之巔:Linux網絡性能分析工具http://www.infoq.com/cn/artic...
抓包工具tcpdump用法說明 https://www.cnblogs.com/f-ck-...
https://www.shiyanlou.com/cou...

http://linuxtools-rst.readthe...

https://www.shiyanlou.com/cou...


個人公衆號 CloudDeveloper(ID: cloud_dev),號內有大量書籍和視頻資源,後臺回覆 「1024」便可領取,分享的內容包括但不限於雲計算虛擬化、容器、OpenStack、K8S、霧計算、網絡、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++編程技術等內容,歡迎你們關注。

相關文章
相關標籤/搜索