1. 一文讀懂如何查看網路的性能指標
Linux網路協議棧是根據TCP/IP模型來實現的,TCP/IP模型由應用層、傳輸層、網路層和網路介面層,共四層組成,每一層都有各自的職責。
應用程序要發送數據包時,通常是通過socket介面,於是就會發生系統調用,把應用層的數據拷貝到內核里的socket層,接著由網路協議棧從上到下逐層處理後,最後才會送到網卡發送出去。
而對於接收網路包時,同樣也要經過網路協議逐層處理,不過處理的方向與發送數據時是相反的,也就是從下到上的逐層處理,最後才送到應用程序。
網路的速度往往跟用戶體驗是掛鉤的,那我們又該用什麼指標來衡量Linux的網路性能呢?以及如何分析網路問題呢?
性能指標有哪些?
通常是以4個指標來衡量網路的性能,分別是帶寬、延時、吞吐率、PPS(PacketPerSecond),它們表示的意義如下:
帶寬,表示鏈路的最大傳輸速率,單位是b/s(比特/秒),帶寬越大,其傳輸能力就越強。延時,表示請求數據包發送後,收到對端響應,所需要的時間延遲。不同的場景有著不同的含義,比如可以表示建立TCP連接所需的時間延遲,或一個數據包往返所需的時間延遲。吞吐率,表示單位時間內成功傳輸的數據量,單位是b/s(比特/秒)或者B/s(位元組/秒),吞吐受帶寬限制,帶寬越大,吞吐率的上限才可能越高。PPS,全稱是PacketPerSecond(包/秒),表示以網路包為單位的傳輸速率,一般用來評估系統對於網路的轉發能力。
當然,除了以上這四種基本的指標,還有一些其他常用的性能指標,比如:
網路的可用性,表示網路能否正常通信;並發連接數,表示TCP連接數量;丟包率,表示所丟失數據包數量占所發送數據組的比率;重傳率,表示重傳網路包的比例;
你可能會問了,如何觀測這些性能指標呢?不急,繼續往下看。
網路配置如何看?
要想知道網路的配置和狀態,我們可以使用ifconfig或者ip命令來查看。
這兩個命令功能都差不多,不過它們屬於不同的軟體包,ifconfig屬於net-tools軟體包,ip屬於iproute2軟體包,我的印象中net-tools軟體包沒有人繼續維護了,而iproute2軟體包是有開發者依然在維護,所以更推薦你使用ip工具。
學以致用,那就來使用這兩個命令,來查看網口eth0的配置等信息:
雖然這兩個命令輸出的格式不盡相同,但是輸出的內容基本相同,比如都包含了IP地址、子網掩碼、MAC地址、地址、MTU大小、網口的狀態以及網路包收發的統計信息,下面就來說說這些信息,它們都與網路性能有一定的關系。
第一,網口的連接狀態標志。其實也就是表示對應的網口是否連接到交換機或路由器等設備,如果ifconfig輸出中看到有RUNNING,或者ip輸出中有LOWER_UP,則說明物理網路是連通的,如果看不到,則表示網口沒有接網線。
第二,MTU大小。默認值是1500位元組,其作用主要是限制網路包的大小,如果IP層有一個數據報要傳,而且網路包的長度比鏈路層的MTU還大,那麼IP層就需要進行分片,即把數據報分成若乾片,這樣每一片就都小於MTU。事實上,每個網路的鏈路層MTU可能會不一樣,所以你可能需要調大或者調小MTU的數值。
第三,網口的IP地址、子網掩碼、MAC地址、地址。這些信息必須要配置正確,網路功能才能正常工作。
第四,網路包收發的統計信息。通常有網路收發的位元組數、包數、錯誤數以及丟包情況的信息,如果TX(發送)和RX(接收)部分中errors、dropped、overruns、carrier以及collisions等指標不為0時,則說明網路發送或者接收出問題了,這些出錯統計信息的指標意義如下:
errors表示發生錯誤的數據包數,比如校驗錯誤、幀同步錯誤等;dropped表示丟棄的數據包數,即數據包已經收到了RingBuffer(這個緩沖區是在內核內存中,更具體一點是在網卡驅動程序里),但因為系統內存不足等原因而發生的丟包;overruns表示超限數據包數,即網路接收/發送速度過快,導致RingBuffer中的數據包來不及處理,而導致的丟包,因為過多的數據包擠壓在RingBuffer,這樣RingBuffer很容易就溢出了;carrier表示發生carrirer錯誤的數據包數,比如雙工模式不匹配、物理電纜出現問題等;collisions表示沖突、碰撞數據包數;
ifconfig和ip命令只顯示的是網口的配置以及收發數據包的統計信息,而看不到協議棧里的信息,那接下來就來看看如何查看協議棧里的信息。
socket信息如何查看?
我們可以使用netstat或者ss,這兩個命令查看socket、網路協議棧、網口以及路由表的信息。
雖然netstat與ss命令查看的信息都差不多,但是如果在生產環境中要查看這類信息的時候,盡量不要使用netstat命令,因為它的性能不好,在系統比較繁忙的情況下,如果頻繁使用netstat命令則會對性能的開銷雪上加霜,所以更推薦你使用性能更好的ss命令。
從下面這張圖,你可以看到這兩個命令的輸出內容:
可以發現,輸出的內容都差不多,比如都包含了socket的狀態(State)、接收隊列(Recv-Q)、發送隊列(Send-Q)、本地地址(LocalAddress)、遠端地址(ForeignAddress)、進程PID和進程名稱(PID/Programname)等。
接收隊列(Recv-Q)和發送隊列(Send-Q)比較特殊,在不同的socket狀態。它們表示的含義是不同的。
當socket狀態處於Established時:
Recv-Q表示socket緩沖區中還沒有被應用程序讀取的位元組數;Send-Q表示socket緩沖區中還沒有被遠端主機確認的位元組數;
而當socket狀態處於Listen時:
Recv-Q表示全連接隊列的長度;Send-Q表示全連接隊列的最大長度;
在TCP三次握手過程中,當伺服器收到客戶端的SYN包後,內核會把該連接存儲到半連接隊列,然後再向客戶端發送SYNACK包,接著客戶端會返回ACK,服務端收到第三次握手的ACK後,內核會把連接從半連接隊列移除,然後創建新的完全的連接,並將其增加到全連接隊列,等待進程調用accept()函數時把連接取出來。
也就說,全連接隊列指的是伺服器與客戶端完了TCP三次握手後,還沒有被accept()系統調用取走連接的隊列。
那對於協議棧的統計信息,依然還是使用netstat或ss,它們查看統計信息的命令如下:
ss命令輸出的統計信息相比netsat比較少,ss只顯示已經連接(estab)、關閉(closed)、孤兒(orphaned)socket等簡要統計。
而netstat則有更詳細的網路協議棧信息,比如上面顯示了TCP協議的主動連接(activeconnectionsopenings)、被動連接(passiveconnectionopenings)、失敗重試(failedconnectionattempts)、發送(segmentssendout)和接收(segmentsreceived)的分段數量等各種信息。
網路吞吐率和PPS如何查看?
可以使用sar命令當前網路的吞吐率和PPS,用法是給sar增加-n參數就可以查看網路的統計信息,比如
sar-nDEV,顯示網口的統計數據;sar-nEDEV,顯示關於網路錯誤的統計數據;sar-nTCP,顯示TCP的統計數據
比如,我通過sar命令獲取了網口的統計信息:
它們的含義:
rxpck/s和txpck/s分別是接收和發送的PPS,單位為包/秒。rxkB/s和txkB/s分別是接收和發送的吞吐率,單位是KB/秒。rxcmp/s和txcmp/s分別是接收和發送的壓縮數據包數,單位是包/秒。
對於帶寬,我們可以使用ethtool命令來查詢,它的單位通常是Gb/s或者Mb/s,不過注意這里小寫字母b,表示比特而不是位元組。我們通常提到的千兆網卡、萬兆網卡等,單位也都是比特(bit)。如下你可以看到,eth0網卡就是一個千兆網卡:
$ethtooleth0|grepSpeedSpeed:1000Mb/s連通性和延時如何查看?要測試本機與遠程主機的連通性和延時,通常是使用ping命令,它是基於ICMP協議的,工作在網路層。
比如,如果要測試本機到192.168.12.20IP地址的連通性和延時:
顯示的內容主要包含icmp_seq(ICMP序列號)、TTL(生存時間,或者跳數)以及time(往返延時),而且最後會匯總本次測試的情況,如果網路沒有丟包,packetloss的百分比就是0。
不過,需要注意的是,ping不通伺服器並不代表HTTP請求也不通,因為有的伺服器的防火牆是會禁用ICMP協議的。
工具總結
性能指標
工具
說明
吞吐量(BPS)
sarnethogsiftop
分別可以查看網路介面、進程以及IP地址的網路吞吐量
PPS
sar/proc/net/dev
查看網路介面的PPS
連接數
netstatss
查看網路連接數
延遲
pinghping3
通過ICMP、TCP等測試網路延遲
連接跟蹤數
conntrack
查看和管理連接跟蹤狀況
路由
mtrroutetraceroute
查看路由並測試鏈路信息
DNS
dignslookup
排查DNS解析問題
防火牆和NAT
iptables
配置和管理防火牆及NAT規則
網卡功能
ethtool
查看和配置網路介面的功能
抓包
tcpmpwireshark
ngrep
抓包分析網路流量
內核協議棧跟蹤
bccsystemtap
動態跟蹤內核協議棧的行為
2. 網路性能指標
網路性能指標是用於衡量和評估計算機網路運行效率和性能的標准。以下是網路性能指標:
1、帶寬(Bandwidth):
帶寬是網路連接中可用的最大數據傳輸速率,通常以每秒比特(bps)為單位衡量。較高的帶寬表示網路可以傳輸更多數據,通常用於描述互聯網連接速度。
2、延遲(Latency):
延遲是數據從源到目的地所需的時間。它包括傳輸延遲(數據在網路中傳輸的時間)和處理延遲(數據在設備上處理的時間)。低延遲對於實時通信和在線游戲等應用非常重要。
網路發展的主要階段和重要事件:
1、第一代計算機網路(20世紀40年代-50年代):
在第二次世界大戰期間,美國軍方開發了第一台計算機ENIAC,同時建立了早期的計算機網路,如軍方的SAGE系統和美國國防部的ARPANET。這些網路主要用於軍事和科學研究。
2、ARPANET和互聯網的誕生(1960年代-1970年代):
ARPANET是互聯網的前身,於1969年建成。它使用分組交換技術,允許多個計算機之間共享信息。1970年代末,TCP/IP協議奠定了互聯網的基礎,使各種網路能夠互相連接,從而形成了互聯網。
3、商業化互聯網(1990年代):
1990年代初,互聯網開始商業化,出現了第一個Web瀏覽器(如Netscape Navigator)和搜索引擎(如Yahoo!)。這一時期互聯網用戶數量迅速增長,出現了許多互聯網初創公司,如Amazon、eBay和Google。
4、寬頻互聯網(2000年代):
2000年代初,寬頻互聯網成為主流,取代了撥號上網。寬頻連接提供更快的數據傳輸速度,促進了在線媒體流媒體和雲計算的發展。
5、移動互聯網(2000年代至今):
隨著智能手機的普及,移動互聯網得以迅速發展。3G、4G和5G技術的推出使移動設備可以更快速地訪問互聯網,並支持各種應用和服務,如社交媒體、移動應用和物聯網(IoT)設備。
3. 計算機網路性能指標有哪些
計算機網路性能指標主要包括:帶寬、吞吐量、時延、時延抖動、丟包率和網路可用性。
首先,帶寬,它表示在單位時間內從網路中的某一點到另一點所能通過的“最高數據率”。我們可以將其理解為道路的寬度,寬度越大,同時通過的車輛就越多,數據傳輸也就越快。例如,當我們說一個網路的帶寬為100Mbps時,就意味著每秒可以傳輸100兆比特的數據。
其次,吞吐量,它表示在單位時間內通過某個網路(或信道、介面)的數據量。與帶寬不同,吞吐量更側重於實際傳輸的數據量,而非最高傳輸能力。這就像一條道路在一天內實際通過的車輛數,它不僅取決於道路的寬度(帶寬),還受到交通狀況、紅綠燈等多種因素的影響。
再次,時延,它是指數據(一個報文或分組,甚至比特)從網路(或鏈路)的一端傳送到另一端所需的時間。時延包括發送時延、傳播時延、處理時延和排隊時延。這就像我們寄出一封信後,需要等待一段時間對方才能收到,這個時間就是時延。
此外,時延抖動是指分組時延的變化量,也就是說,如果每個分組的時延都相同,那麼時延抖動就為0。但在實際網路中,由於各種因素的影響,每個分組的時延可能會有所不同,這時就會產生時延抖動。
丟包率是指在一定的時間范圍內,傳輸過程中丟失的數據包占總數據包的比率。丟包率過高會影響網路的傳輸質量,可能導致數據傳輸不完整或失敗。
最後,網路可用性是指在某個考察時間,系統能夠正常運行的概率或時間佔有率期望值。它是衡量網路性能的重要指標之一,一個高可用性的網路應該能夠在各種情況下都能提供穩定、可靠的服務。
這些性能指標共同決定了計算機網路的整體性能和使用體驗。在設計和優化網路時,我們需要根據實際需求和網路環境來選擇合適的性能指標進行重點優化。