Linux 網(wǎng)絡(luò)協(xié)議棧是根據(jù) TCP/IP 模型來(lái)實(shí)現(xiàn)的,,TCP/IP 模型由應(yīng)用層,、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層,,共四層組成,,每一層都有各自的職責(zé)。 應(yīng)用程序要發(fā)送數(shù)據(jù)包時(shí),,通常是通過(guò) socket 接口,,于是就會(huì)發(fā)生系統(tǒng)調(diào)用,把應(yīng)用層的數(shù)據(jù)拷貝到內(nèi)核里的 socket 層,,接著由網(wǎng)絡(luò)協(xié)議棧從上到下逐層處理后,,最后才會(huì)送到網(wǎng)卡發(fā)送出去。 而對(duì)于接收網(wǎng)絡(luò)包時(shí),,同樣也要經(jīng)過(guò)網(wǎng)絡(luò)協(xié)議逐層處理,,不過(guò)處理的方向與發(fā)送數(shù)據(jù)時(shí)是相反的,也就是從下到上的逐層處理,,最后才送到應(yīng)用程序,。 網(wǎng)絡(luò)的速度往往跟用戶(hù)體驗(yàn)是掛鉤的,那我們又該用什么指標(biāo)來(lái)衡量 Linux 的網(wǎng)絡(luò)性能呢,?以及如何分析網(wǎng)絡(luò)問(wèn)題呢,? 性能指標(biāo)有哪些,?通常是以 4 個(gè)指標(biāo)來(lái)衡量網(wǎng)絡(luò)的性能,分別是帶寬,、延時(shí),、吞吐率、PPS(Packet Per Second),,它們表示的意義如下:
當(dāng)然,,除了以上這四種基本的指標(biāo),,還有一些其他常用的性能指標(biāo),比如:
你可能會(huì)問(wèn)了,,如何觀測(cè)這些性能指標(biāo)呢?不急,,繼續(xù)往下看,。 網(wǎng)絡(luò)配置如何看?要想知道網(wǎng)絡(luò)的配置和狀態(tài),,我們可以使用 ifconfig 或者 ip 命令來(lái)查看,。 這兩個(gè)命令功能都差不多,不過(guò)它們屬于不同的軟件包,,ifconfig 屬于 net-tools 軟件包,,ip 屬于 iproute2 軟件包,我的印象中 net-tools 軟件包沒(méi)有人繼續(xù)維護(hù)了,,而 iproute2 軟件包是有開(kāi)發(fā)者依然在維護(hù),,所以更推薦你使用 ip 工具。 學(xué)以致用,,那就來(lái)使用這兩個(gè)命令,,來(lái)查看網(wǎng)口 eth0 的配置等信息: 雖然這兩個(gè)命令輸出的格式不盡相同,但是輸出的內(nèi)容基本相同,,比如都包含了 IP 地址,、子網(wǎng)掩碼、MAC 地址,、網(wǎng)關(guān)地址,、MTU 大小、網(wǎng)口的狀態(tài)以及網(wǎng)絡(luò)包收發(fā)的統(tǒng)計(jì)信息,,下面就來(lái)說(shuō)說(shuō)這些信息,,它們都與網(wǎng)絡(luò)性能有一定的關(guān)系。 第一,,網(wǎng)口的連接狀態(tài)標(biāo)志,。其實(shí)也就是表示對(duì)應(yīng)的網(wǎng)口是否連接到交換機(jī)或路由器等設(shè)備,如果 ifconfig 輸出中看到有 RUNNING,,或者 ip 輸出中有 LOWER_UP,,則說(shuō)明物理網(wǎng)絡(luò)是連通的,如果看不到,,則表示網(wǎng)口沒(méi)有接網(wǎng)線(xiàn),。 第二,MTU 大小,。默認(rèn)值是 1500 字節(jié),,其作用主要是限制網(wǎng)絡(luò)包的大小,如果 IP 層有一個(gè)數(shù)據(jù)報(bào)要傳,而且網(wǎng)絡(luò)包的長(zhǎng)度比鏈路層的 MTU 還大,,那么 IP 層就需要進(jìn)行分片,,即把數(shù)據(jù)報(bào)分成若干片,這樣每一片就都小于 MTU,。事實(shí)上,,每個(gè)網(wǎng)絡(luò)的鏈路層 MTU 可能會(huì)不一樣,所以你可能需要調(diào)大或者調(diào)小 MTU 的數(shù)值,。 第三,,網(wǎng)口的 IP 地址、子網(wǎng)掩碼,、MAC 地址,、網(wǎng)關(guān)地址。這些信息必須要配置正確,,網(wǎng)絡(luò)功能才能正常工作,。 第四,網(wǎng)絡(luò)包收發(fā)的統(tǒng)計(jì)信息,。通常有網(wǎng)絡(luò)收發(fā)的字節(jié)數(shù),、包數(shù)、錯(cuò)誤數(shù)以及丟包情況的信息,,如果 TX(發(fā)送) 和 RX(接收) 部分中 errors、dropped,、overruns,、carrier 以及 collisions 等指標(biāo)不為 0 時(shí),則說(shuō)明網(wǎng)絡(luò)發(fā)送或者接收出問(wèn)題了,,這些出錯(cuò)統(tǒng)計(jì)信息的指標(biāo)意義如下:
ifconfig 和 ip 命令只顯示的是網(wǎng)口的配置以及收發(fā)數(shù)據(jù)包的統(tǒng)計(jì)信息,,而看不到協(xié)議棧里的信息,,那接下來(lái)就來(lái)看看如何查看協(xié)議棧里的信息。 socket 信息如何查看,?我們可以使用 netstat 或者 ss,,這兩個(gè)命令查看 socket、網(wǎng)絡(luò)協(xié)議棧,、網(wǎng)口以及路由表的信息,。 雖然 netstat 與 ss 命令查看的信息都差不多,但是如果在生產(chǎn)環(huán)境中要查看這類(lèi)信息的時(shí)候,,盡量不要使用 netstat 命令,,因?yàn)樗男阅懿缓茫谙到y(tǒng)比較繁忙的情況下,,如果頻繁使用 netstat 命令則會(huì)對(duì)性能的開(kāi)銷(xiāo)雪上加霜,,所以更推薦你使用性能更好的 ss 命令。 從下面這張圖,,你可以看到這兩個(gè)命令的輸出內(nèi)容: 可以發(fā)現(xiàn),,輸出的內(nèi)容都差不多, 比如都包含了 socket 的狀態(tài)(State),、接收隊(duì)列(Recv-Q),、發(fā)送隊(duì)列(Send-Q)、本地地址(Local Address),、遠(yuǎn)端地址(Foreign Address),、進(jìn)程 PID 和進(jìn)程名稱(chēng)(PID/Program name)等。 接收隊(duì)列(Recv-Q)和發(fā)送隊(duì)列(Send-Q)比較特殊,,在不同的 socket 狀態(tài),。它們表示的含義是不同的。 當(dāng) socket 狀態(tài)處于 Established時(shí):
而當(dāng) socket 狀態(tài)處于 Listen 時(shí):
在 TCP 三次握手過(guò)程中,,當(dāng)服務(wù)器收到客戶(hù)端的 SYN 包后,內(nèi)核會(huì)把該連接存儲(chǔ)到半連接隊(duì)列,,然后再向客戶(hù)端發(fā)送 SYN+ACK 包,,接著客戶(hù)端會(huì)返回 ACK,,服務(wù)端收到第三次握手的 ACK 后,內(nèi)核會(huì)把連接從半連接隊(duì)列移除,,然后創(chuàng)建新的完全的連接,,并將其增加到全連接隊(duì)列 ,等待進(jìn)程調(diào)用 accept() 函數(shù)時(shí)把連接取出來(lái),。 也就說(shuō),,全連接隊(duì)列指的是服務(wù)器與客戶(hù)端完了 TCP 三次握手后,還沒(méi)有被 accept() 系統(tǒng)調(diào)用取走連接的隊(duì)列,。 那對(duì)于協(xié)議棧的統(tǒng)計(jì)信息,,依然還是使用 netstat 或 ss,它們查看統(tǒng)計(jì)信息的命令如下: ss 命令輸出的統(tǒng)計(jì)信息相比 netsat 比較少,,ss 只顯示已經(jīng)連接(estab),、關(guān)閉(closed)、孤兒(orphaned) socket 等簡(jiǎn)要統(tǒng)計(jì),。 而 netstat 則有更詳細(xì)的網(wǎng)絡(luò)協(xié)議棧信息,,比如上面顯示了 TCP 協(xié)議的主動(dòng)連接(active connections openings)、被動(dòng)連接(passive connection openings),、失敗重試(failed connection attempts),、發(fā)送(segments send out)和接收(segments received)的分段數(shù)量等各種信息。 網(wǎng)絡(luò)吞吐率和 PPS 如何查看,?可以使用 sar 命令當(dāng)前網(wǎng)絡(luò)的吞吐率和 PPS,,用法是給 sar 增加 -n 參數(shù)就可以查看網(wǎng)絡(luò)的統(tǒng)計(jì)信息,比如
比如,,我通過(guò) sar 命令獲取了網(wǎng)口的統(tǒng)計(jì)信息: 它們的含義:
對(duì)于帶寬,,我們可以使用 ethtool 命令來(lái)查詢(xún),它的單位通常是 Gb/s 或者 Mb/s,,不過(guò)注意這里小寫(xiě)字母 b ,,表示比特而不是字節(jié),。我們通常提到的千兆網(wǎng)卡、萬(wàn)兆網(wǎng)卡等,,單位也都是比特(bit),。如下你可以看到, eth0 網(wǎng)卡就是一個(gè)千兆網(wǎng)卡: $ ethtool eth0 | grep Speed Speed: 1000Mb/s 連通性和延時(shí)如何查看,?要測(cè)試本機(jī)與遠(yuǎn)程主機(jī)的連通性和延時(shí),,通常是使用 ping 命令,它是基于 ICMP 協(xié)議的,,工作在網(wǎng)絡(luò)層,。 比如,如果要測(cè)試本機(jī)到 192.168.12.20 IP 地址的連通性和延時(shí): 顯示的內(nèi)容主要包含 icmp_seq(ICMP 序列號(hào)),、TTL(生存時(shí)間,,或者跳數(shù))以及 time (往返延時(shí)),而且最后會(huì)匯總本次測(cè)試的情況,,如果網(wǎng)絡(luò)沒(méi)有丟包,,packet loss 的百分比就是 0。 不過(guò),,需要注意的是,,ping 不通服務(wù)器并不代表 HTTP 請(qǐng)求也不通,因?yàn)橛械姆?wù)器的防火墻是會(huì)禁用 ICMP 協(xié)議的,。 工具總結(jié)
|
|
來(lái)自: 好漢勃士 > 《待分類(lèi)》