日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

34丨关于Linux网络,你必须知道这些(下)

發布時間:2024/9/3 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 34丨关于Linux网络,你必须知道这些(下) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一節,學習了 Linux 網絡的基礎原理。簡單回顧一下,Linux 網絡根據 TCP/IP 模型,構建其網絡協議棧。TCP/IP 模型由應用層、傳輸層、網絡層、網絡接口層等四層組成,這也是 Linux 網絡棧最核心的構成部分。 應用程序通過套接字接口發送數據包時,先要在網絡協議棧中從上到下逐層處理,然后才最終送到網卡發送出去;而接收數據包時,也要先經過網絡棧從下到上的逐層處理,最后送到應用程序。 了解 Linux 網絡的基本原理和收發流程后,你肯定迫不及待想知道,如何去觀察網絡的性能情況。具體而言,哪些指標可以用來衡量 Linux 的網絡性能呢?

性能指標

實際上,我們通常用帶寬、吞吐量、延時、PPS(Packet Per Second)等指標衡量網絡的性能。
  • 帶寬,表示鏈路的最大傳輸速率,單位通常為 b/s (比特 / 秒)。
  • 吞吐量,表示單位時間內成功傳輸的數據量,單位通常為 b/s(比特 / 秒)或者 B/s(字節 / 秒)。吞吐量受帶寬限制,而吞吐量 / 帶寬,也就是該網絡的使用率。
  • 延時,表示從網絡請求發出后,一直到收到遠端響應,所需要的時間延遲。在不同場景中,這一指標可能會有不同含義。比如,它可以表示,建立連接需要的時間(比如 TCP 握手延時),或一個數據包往返所需的時間(比如 RTT)。
  • PPS,是 Packet Per Second(包 / 秒)的縮寫,表示以網絡包為單位的傳輸速率。PPS 通常用來評估網絡的轉發能力,比如硬件交換機,通常可以達到線性轉發(即 PPS 可以達到或者接近理論最大值)。而基于 Linux 服務器的轉發,則容易受網絡包大小的影響。
除了這些指標,網絡的可用性(網絡能否正常通信)、并發連接數(TCP 連接數量)、丟包率(丟包百分比)、重傳率(重新傳輸的網絡包比例)等也是常用的性能指標。 接下來,請你打開一個終端,SSH 登錄到服務器上,然后跟我一起來探索、觀測這些性能指標。

網絡配置

分析網絡問題的第一步,通常是查看網絡接口的配置和狀態。你可以使用 ifconfig 或者 ip 命令,來查看網絡的配置。我個人更推薦使用 ip 工具,因為它提供了更豐富的功能和更易用的接口。 ifconfig 和 ip 分別屬于軟件包 net-tools 和 iproute2,iproute2 是 net-tools 的下一代。通常情況下它們會在發行版中默認安裝。但如果你找不到 ifconfig 或者 ip 命令,可以安裝這兩個軟件包。 以網絡接口 eth0 為例,你可以運行下面的兩個命令,查看它的配置和狀態: $ ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.240.0.30 netmask 255.240.0.0 broadcast 10.255.255.255inet6 fe80::20d:3aff:fe07:cf2a prefixlen 64 scopeid 0x20<link>ether 78:0d:3a:07:cf:3a txqueuelen 1000 (Ethernet)RX packets 40809142 bytes 9542369803 (9.5 GB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 32637401 bytes 4815573306 (4.8 GB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 $ ip -s addr show dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 78:0d:3a:07:cf:3a brd ff:ff:ff:ff:ff:ffinet 10.240.0.30/12 brd 10.255.255.255 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::20d:3aff:fe07:cf2a/64 scope linkvalid_lft forever preferred_lft foreverRX: bytes packets errors dropped overrun mcast9542432350 40809397 0 0 0 193TX: bytes packets errors dropped carrier collsns4815625265 32637658 0 0 0 0 你可以看到,ifconfig 和 ip 命令輸出的指標基本相同,只是顯示格式略微不同。比如,它們都包括了網絡接口的狀態標志、MTU 大小、IP、子網、MAC 地址以及網絡包收發的統計信息。 這些具體指標的含義,在文檔中都有詳細的說明,不過,這里有幾個跟網絡性能密切相關的指標,需要你特別關注一下。 第一,網絡接口的狀態標志。ifconfig 輸出中的 RUNNING ,或 ip 輸出中的 LOWER_UP ,都表示物理網絡是連通的,即網卡已經連接到了交換機或者路由器中。如果你看不到它們,通常表示網線被拔掉了。 第二,MTU 的大小。MTU 默認大小是 1500,根據網絡架構的不同(比如是否使用了 VXLAN 等疊加網絡),你可能需要調大或者調小 MTU 的數值。 第三,網絡接口的 IP 地址、子網以及 MAC 地址。這些都是保障網絡功能正常工作所必需的,你需要確保配置正確。 第四,網絡收發的字節數、包數、錯誤數以及丟包情況,特別是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指標不為 0 時,通常表示出現了網絡 I/O 問題。其中:
  • errors 表示發生錯誤的數據包數,比如校驗錯誤、幀同步錯誤等;
  • dropped 表示丟棄的數據包數,即數據包已經收到了 Ring Buffer,但因為內存不足等原因丟包;
  • overruns 表示超限數據包數,即網絡 I/O 速度過快,導致 Ring Buffer 中的數據包來不及處理(隊列滿)而導致的丟包;
  • carrier 表示發生 carrirer 錯誤的數據包數,比如雙工模式不匹配、物理電纜出現問題等;
  • collisions 表示碰撞數據包數。

套接字信息

ifconfig 和 ip 只顯示了網絡接口收發數據包的統計信息,但在實際的性能問題中,網絡協議棧中的統計信息,我們也必須關注。你可以用 netstat 或者 ss ,來查看套接字、網絡棧、網絡接口以及路由表的信息。 我個人更推薦,使用 ss 來查詢網絡的連接信息,因為它比 netstat 提供了更好的性能(速度更快)。 比如,你可以執行下面的命令,查詢套接字信息: # head -n 3 表示只顯示前面 3 行 # -l 表示只顯示監聽套接字 # -n 表示顯示數字地址和端口 (而不是名字) # -p 表示顯示進程信息 $ netstat -nlp | head -n 3 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 840/systemd-resolve# -l 表示只顯示監聽套接字 # -t 表示只顯示 TCP 套接字 # -n 表示顯示數字地址和端口 (而不是名字) # -p 表示顯示進程信息 $ ss -ltnp | head -n 3 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=840,fd=13)) LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1459,fd=3)) netstat 和 ss 的輸出也是類似的,都展示了套接字的狀態、接收隊列、發送隊列、本地地址、遠端地址、進程 PID 和進程名稱等。 其中,接收隊列(Recv-Q)和發送隊列(Send-Q)需要你特別關注,它們通常應該是 0。當你發現它們不是 0 時,說明有網絡包的堆積發生。當然還要注意,在不同套接字狀態下,它們的含義不同。 當套接字處于連接狀態(Established)時,
  • Recv-Q 表示套接字緩沖還沒有被應用程序取走的字節數(即接收隊列長度)。
  • 而 Send-Q 表示還沒有被遠端主機確認的字節數(即發送隊列長度)。
當套接字處于監聽狀態(Listening)時,
  • Recv-Q 表示 syn backlog 的當前值。
  • 而 Send-Q 表示最大的 syn backlog 值。
而 syn backlog 是 TCP 協議棧中的半連接隊列長度,相應的也有一個全連接隊列(accept queue),它們都是維護 TCP 狀態的重要機制。 顧名思義,所謂半連接,就是還沒有完成 TCP 三次握手的連接,連接只進行了一半,而服務器收到了客戶端的 SYN 包后,就會把這個連接放到半連接隊列中,然后再向客戶端發送 SYN+ACK 包。 而全連接,則是指服務器收到了客戶端的 ACK,完成了 TCP 三次握手,然后就會把這個連接挪到全連接隊列中。這些全連接中的套接字,還需要再被 accept() 系統調用取走,這樣,服務器就可以開始真正處理客戶端的請求了。

協議棧統計信息

類似的,使用 netstat 或 ss ,也可以查看協議棧的信息: $ netstat -s ... Tcp:3244906 active connection openings23143 passive connection openings115732 failed connection attempts2964 connection resets received1 connections established13025010 segments received17606946 segments sent out44438 segments retransmitted42 bad segments received5315 resets sentInCsumErrors: 42 ...$ ss -s Total: 186 (kernel 1446) TCP: 4 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0Transport Total IP IPv6 * 1446 - - RAW 2 1 1 UDP 2 2 0 TCP 4 3 1 ... 這些協議棧的統計信息都很直觀。ss 只顯示已經連接、關閉、孤兒套接字等簡要統計,而 netstat 則提供的是更詳細的網絡協議棧信息。 比如,上面 netstat 的輸出示例,就展示了 TCP 協議的主動連接、被動連接、失敗重試、發送和接收的分段數量等各種信息。

網絡吞吐和 PPS

接下來,我們再來看看,如何查看系統當前的網絡吞吐量和 PPS。在這里,我推薦使用我們的老朋友 sar,在前面的 CPU、內存和 I/O 模塊中,我們已經多次用到它。 給 sar 增加 -n 參數就可以查看網絡的統計信息,比如網絡接口(DEV)、網絡接口錯誤(EDEV)、TCP、UDP、ICMP 等等。執行下面的命令,你就可以得到網絡接口統計信息: # 數字 1 表示每隔 1 秒輸出一組數據 $ sar -n DEV 1 Linux 4.15.0-1035-azure (ubuntu) 01/06/19 _x86_64_ (2 CPU)13:21:40 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 13:21:41 eth0 18.00 20.00 5.79 4.25 0.00 0.00 0.00 0.00 13:21:41 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 13:21:41 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 這兒輸出的指標比較多,我來簡單解釋下它們的含義。
  • rxpck/s 和 txpck/s 分別是接收和發送的 PPS,單位為包 / 秒。
  • rxkB/s 和 txkB/s 分別是接收和發送的吞吐量,單位是 KB/ 秒。
  • rxcmp/s 和 txcmp/s 分別是接收和發送的壓縮數據包數,單位是包 / 秒。
  • %ifutil 是網絡接口的使用率,即半雙工模式下為 (rxkB/s+txkB/s)/Bandwidth,而全雙工模式下為 max(rxkB/s, txkB/s)/Bandwidth。
其中,Bandwidth 可以用 ethtool 來查詢,它的單位通常是 Gb/s 或者 Mb/s,不過注意這里小寫字母 b ,表示比特而不是字節。我們通常提到的千兆網卡、萬兆網卡等,單位也都是比特。如下你可以看到,我的 eth0 網卡就是一個千兆網卡: $ ethtool eth0 | grep SpeedSpeed: 1000Mb/s

連通性和延時

最后,我們通常使用 ping ,來測試遠程主機的連通性和延時,而這基于 ICMP 協議。比如,執行下面的命令,你就可以測試本機到 114.114.114.114 這個 IP 地址的連通性和延時: # -c3 表示發送三次 ICMP 包后停止 $ ping -c3 114.114.114.114 PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data. 64 bytes from 114.114.114.114: icmp_seq=1 ttl=54 time=244 ms 64 bytes from 114.114.114.114: icmp_seq=2 ttl=47 time=244 ms 64 bytes from 114.114.114.114: icmp_seq=3 ttl=67 time=244 ms--- 114.114.114.114 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2001ms rtt min/avg/max/mdev = 244.023/244.070/244.105/0.034 ms ping 的輸出,可以分為兩部分。
  • 第一部分,是每個 ICMP 請求的信息,包括 ICMP 序列號(icmp_seq)、TTL(生存時間,或者跳數)以及往返延時。
  • 第二部分,則是三次 ICMP 請求的匯總。
比如上面的示例顯示,發送了 3 個網絡包,并且接收到 3 個響應,沒有丟包發生,這說明測試主機到 114.114.114.114 是連通的;平均往返延時(RTT)是 244ms,也就是從發送 ICMP 開始,到接收到 114.114.114.114 回復的確認,總共經歷 244ms。

小結

我們通常使用帶寬、吞吐量、延時等指標,來衡量網絡的性能;相應的,你可以用 ifconfig、netstat、ss、sar、ping 等工具,來查看這些網絡的性能指標。 在下一節中,我將以經典的 C10K 和 C100K 問題,帶你進一步深入 Linux 網絡的工作原理。 思考 最后,我想請你來聊聊,你理解的 Linux 網絡性能。你常用什么指標來衡量網絡的性能?又用什么思路分析相應性能問題呢?你可以結合今天學到的知識,提出自己的觀點。 歡迎在留言區和我討論,也歡迎你把這篇文章分享給你的同事、朋友。我們一起在實戰中演練,在交流中進步。

總結

以上是生活随笔為你收集整理的34丨关于Linux网络,你必须知道这些(下)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。