一文掌握 Linux 性能分析之網(wǎng)絡(luò)篇
比較寬泛地講,網(wǎng)絡(luò)方向的性能分析既包括主機測的網(wǎng)絡(luò)配置查看、監(jiān)控,又包括網(wǎng)絡(luò)鏈路上的包轉(zhuǎn)發(fā)時延、吞吐量、帶寬等指標分析。包括但不限于以下分析工具:
- ping:測試網(wǎng)絡(luò)連通性
- ifconfig:接口配置
- ip:網(wǎng)絡(luò)接口統(tǒng)計信息
- netsat:多種網(wǎng)絡(luò)棧和接口統(tǒng)計信息
- ifstat:接口網(wǎng)絡(luò)流量監(jiān)控工具
- netcat:快速構(gòu)建網(wǎng)絡(luò)連接
- tcpdump:抓包工具
- sar:統(tǒng)計信息歷史
- traceroute:測試網(wǎng)絡(luò)路由
- pathchar:確定網(wǎng)絡(luò)路徑特征
- dtrace:TCP/IP 棧跟蹤
- iperf / netperf / netserver:網(wǎng)絡(luò)性能測試工具
- perf 性能分析神器
本文先來看前面 7 個。
ping
ping 發(fā)送 ICMP echo 數(shù)據(jù)包來探測網(wǎng)絡(luò)的連通性,除了能直觀地看出網(wǎng)絡(luò)的連通狀況外,還能獲得本次連接的往返時間(RTT 時間),丟包情況,以及訪問的域名所對應(yīng)的 IP 地址(使用 DNS 域名解析),比如:
我們 ping baidu.com,-c 參數(shù)指定發(fā)包數(shù)??梢钥吹?,解析到了 baidu 的一臺服務(wù)器 IP 地址為 220.181.112.244。RTT 時間的平均和算術(shù)平均差分別是 40.732ms、40.762ms、40.791ms 和 0.248。
ifconfig
ifconfig 命令被用于配置和顯示 Linux 內(nèi)核中網(wǎng)絡(luò)接口的統(tǒng)計信息。通過這些統(tǒng)計信息,我們也能夠進行一定的網(wǎng)絡(luò)性能調(diào)優(yōu)。
1)ifconfig 顯示網(wǎng)絡(luò)接口配置信息
其中,RX/TX packets 是對接收/發(fā)送數(shù)據(jù)包的情況統(tǒng)計,包括錯誤的包,丟掉多少包等。RX/TX bytes 是接收/發(fā)送數(shù)據(jù)字節(jié)數(shù)統(tǒng)計。其余還有很多參數(shù),就不一一述說了,性能調(diào)優(yōu)時可以重點關(guān)注 MTU 和 txqueuelen(發(fā)送隊列長度),比如可以用下面的命令來對這兩個參數(shù)進行微調(diào):
- ifconfig eth0 txqueuelen 2000
- ifconfig eth0 mtu 1500
2)網(wǎng)絡(luò)接口地址配置
ifconfig 還常用來配置網(wǎng)口的地址,比如:
為網(wǎng)卡配置和刪除IPv6地址:
- ifconfig eth0 add 33ffe:3240:800:1005::2/64 #為網(wǎng)卡eth0配置IPv6地址
- ifconfig eth0 del 33ffe:3240:800:1005::2/64 #為網(wǎng)卡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 命令用來顯示或設(shè)置 Linux 主機的網(wǎng)絡(luò)接口、路由、網(wǎng)絡(luò)設(shè)備、策略路由和隧道等信息,是 Linux 下功能強大的網(wǎng)絡(luò)配置工具,旨在替代 ifconfig 命令,如下顯示 IP 命令的強大之處,功能涵蓋到 ifconfig、netstat、route 三個命令。
netstat
netstat 可以查看整個 Linux 系統(tǒng)關(guān)于網(wǎng)絡(luò)的情況,是一個集多鐘網(wǎng)絡(luò)工具于一身的組合工具。
常用的選項包括以下幾個:
- 默認:列出連接的套接字
- -a:列出所有套接字的信息
- -s:各種網(wǎng)絡(luò)協(xié)議棧統(tǒng)計信息
- -i:網(wǎng)絡(luò)接口信息
- -r:列出路由表
- -l:僅列出有在 Listen 的服務(wù)狀態(tài)
- -p:顯示 PID 和進程名稱
各參數(shù)組合使用實例如下:
- netstat -at 列出所有 TCP 端口
- netstat -au 列出所有 UDP 端口
- netstat -lt 列出所有監(jiān)聽 TCP 端口的 socket
- netstat -lu 列出所有監(jiān)聽 UDP 端口的 socket
- netstat -lx 列出所有監(jiān)聽 UNIX 端口的 socket
- netstat -ap | grep ssh 找出程序運行的端口
- netstat -an | grep ':80' 找出運行在指定端口的進程
1)netstat 默認顯示連接的套接字數(shù)據(jù)
整體上來看,輸出結(jié)果包括兩個部分:
- Active Internet connections :有源 TCP 連接,其中 Recv-Q 和 Send-Q 指的是接收隊列和發(fā)送隊列,這些數(shù)字一般都是 0,如果不是,說明請求包和回包正在隊列中堆積。
- Active UNIX domain sockets:有源 UNIX 域套接口,其中 proto 顯示連接使用的協(xié)議,RefCnt 表示連接到本套接口上的進程號,Types 是套接口的類型,State 是套接口當前的狀態(tài),Path 是連接到套接口的進程使用的路徑名。
2)netstat -i 顯示網(wǎng)絡(luò)接口信息
接口信息包括網(wǎng)絡(luò)接口名稱(Iface)、MTU,以及一系列接收(RX-)和傳輸(TX-)的指標。其中 OK 表示傳輸成功的包,ERR 是錯誤包,DRP 是丟包,OVR 是超限包。
這些參數(shù)有助于我們對網(wǎng)絡(luò)收包情況進行分析,從而判斷瓶頸所在。
3)netstat -s 顯示所有網(wǎng)絡(luò)協(xié)議棧的信息
可以看到,這條命令能夠顯示每個協(xié)議詳細的信息,這有助于我們針對協(xié)議棧進行更細粒度的分析。
4)netstat -r 顯示路由表信息
這條命令能夠看到主機路由表的一個情況。當然查路由我們也可以用 ip route 和 route 命令,這個命令顯示的信息會更詳細一些。
ifstat
ifstat 主要用來監(jiān)測主機網(wǎng)口的網(wǎng)絡(luò)流量,常用的選項包括:
- -a:監(jiān)測主機所有網(wǎng)口
- -i:指定要監(jiān)測的網(wǎng)口
- -t:在每行輸出信息前加上時間戳
- -b:以 Kbit/s 顯示流量數(shù)據(jù),而不是默認的 KB/s
- -delay:采樣間隔(單位是 s),即每隔 delay 的時間輸出一次統(tǒng)計信息
- -count:采樣次數(shù),即共輸出 count 次統(tǒng)計信息
比如,通過以下命令統(tǒng)計主機所有網(wǎng)口某一段時間內(nèi)的流量數(shù)據(jù):
可以看出,分別統(tǒng)計了三個網(wǎng)口的流量數(shù)據(jù),前面輸出的時間戳,有助于我們統(tǒng)計一段時間內(nèi)各網(wǎng)口總的輸入、輸出流量。
netcat
netcat,簡稱 nc,命令簡單,但功能強大,在排查網(wǎng)絡(luò)故障時非常有用。
它主要被用來構(gòu)建網(wǎng)絡(luò)連接。可以以客戶端和服務(wù)端的方式運行,當以服務(wù)端方式運行時,它負責(zé)監(jiān)聽某個端口并接受客戶端的連接,因此可以用它來調(diào)試客戶端程序;當以客戶端方式運行時,它負責(zé)向服務(wù)端發(fā)起連接并收發(fā)數(shù)據(jù),因此也可以用它來調(diào)試服務(wù)端程序,此時它有點像 Telnet 程序。
常用的選項包括以下幾種:
- -l:以服務(wù)端的方式運行,監(jiān)聽指定的端口。默認是以客戶端的方式運行。
- -k:重復(fù)接受并處理某個端口上的所有連接,必須與 -l 一起使用。
- -n:使用 IP 地址表示主機,而不是主機名,使用數(shù)字表示端口號,而不是服務(wù)名稱。
- -p:當以客戶端運行時,指定端口號。
- -s:設(shè)置本地主機發(fā)出的數(shù)據(jù)包的 IP 地址。
- -C:將 CR 和 LF 兩個字符作為結(jié)束符。
- -U:使用 UNIX 本地域套接字通信。
- -u:使用 UDP 協(xié)議通信,默認使用的是 TCP 協(xié)議。
- -w:如果 nc 客戶端在指定的時間內(nèi)未檢測到任何輸入,則退出。
- -X:當 nc 客戶端與代理服務(wù)器通信時,該選項指定它們之間的通信協(xié)議,目前支持的代理協(xié)議包括 “4”(SOCKS v.4),“5”(SOCKS v.5)和 “connect” (HTTPs Proxy),默認使用 SOCKS v.5。
- -x:指定目標代理服務(wù)器的 IP 地址和端口號。
下面舉一個簡單的例子,使用 nc 命令發(fā)送消息:
首先,啟動服務(wù)端,用 nc -l 0.0.0.0 12345 監(jiān)聽端口 12345 上的所有連接。
然后,啟動客戶端,用 nc -p 1234 127.0.0.1 12345 使用 1234 端口連接服務(wù)器 127.0.0.1::12345。
接著就可以在兩端互發(fā)數(shù)據(jù)了。這里只是拋磚引玉,更多例子大家可以多實踐。
tcpdump
tcpdump是一個強大的網(wǎng)絡(luò)抓包工具。雖然有 wireshark 這樣更易使用的圖形化抓包工具,但 tcpdump 仍然是網(wǎng)絡(luò)排錯的必備利器。
tcpdump 選項很多,我就不一一列舉了,大家可以看文章末尾的引用來進一步了解。這里列舉幾種 tcpdump 常用的用法。
1)捕獲某主機的數(shù)據(jù)包
比如想要捕獲主機 200.200.200.100 上所有收到和發(fā)出的所有數(shù)據(jù)包,使用:
- tcpdump host 200.200.200.100
2)捕獲多個主機的數(shù)據(jù)包
比如要捕獲主機 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)捕獲某主機接收或發(fā)出的某種協(xié)議類型的包
比如要捕獲主機 200.200.200.1 接收或發(fā)出的 Telnet 包,使用:
- tcpdump tcp port 23 host 200.200.200.1
4)捕獲某端口相關(guān)的數(shù)據(jù)包
比如捕獲在端口 6666 上通過的包,使用:
- tcpdump port 6666
5)捕獲某網(wǎng)口的數(shù)據(jù)包
比如捕獲在網(wǎng)口 eth0 上通過的包,使用:
- tcpdump -i eth0
下面還是舉個例子,抓取 TCP 三次握手的包:(具體抓包的過程請移步到我的公眾號進一步了解,那里閱讀體驗好一點,謝謝。)
總結(jié):
本文總結(jié)了幾種初級的網(wǎng)絡(luò)工具,基本的網(wǎng)絡(luò)性能分析,通過組合以上幾種工具,基本都能應(yīng)付,但對于復(fù)雜的問題,以上工具可能就無能為力了。更多高階的工具將在下文送上,敬請期待。