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