Linux性能優化實戰學習筆記:第三十四講

1、上節回顧

上一節,我帶你學習了 Linux 網絡的基礎原理。簡單回顧一下,Linux 網絡根據 TCP/IP模型,構建其網絡協議棧。TCP/IP 模型由應用層、傳輸層、網絡層、網絡接口層等四層組
成,這也是 Linux 網絡棧最核心的構成部分。docker

應用程序經過套接字接口發送數據包時,先要在網絡協議棧中從上到下逐層處理,而後才最終送到網卡發送出去;而接收數據包時,也要先通過網絡棧從下到上的逐層處理,最後送到應用程序。bash

瞭解 Linux 網絡的基本原理和收發流程後,你確定火燒眉毛想知道,如何去觀察網絡的性能狀況。具體而言,哪些指標能夠用來衡量 Linux 的網絡性能呢?服務器

2、性能指標

實際上,咱們一般用帶寬、吞吐量、延時、PPS(Packet Per Second)等指標衡量網絡的性能。網絡

帶寬:表示鏈路的最大傳輸速率,單位一般爲 b/s (比特 / 秒)。架構

吞吐量:表示單位時間內成功傳輸的數據量,單位一般爲 b/s(比特 / 秒)或者B/s(字節 / 秒)。吞吐量受帶寬限制,而吞吐量 / 帶寬,也就是該網絡的使用率。併發

延時:表示從網絡請求發出後,一直到收到遠端響應,所須要的時間延遲。在不一樣場景中,這一指標可能會有不一樣含義。好比,它能夠表示,創建鏈接須要的時間(好比 TCP
   握手延時),或一個數據包往返所需的時間(好比 RTT)。ssh

PPS:是 Packet Per Second(包 / 秒)的縮寫,表示以網絡包爲單位的傳輸速率。PPS 一般用來評估網絡的轉發能力,好比硬件交換機,一般能夠達到線性轉發(即 PPS
      能夠達到或者接近理論最大值)。而基於 Linux 服務器的轉發,則容易受網絡包大小的影響。

socket

除了這些指標,網絡的可用性(網絡可否正常通訊)、併發鏈接數(TCP 鏈接數量)、丟包率(丟包百分比)、重傳率(從新傳輸的網絡包比例)等也是經常使用的性能指標。

接下來,請你打開一個終端,SSH 登陸到服務器上,而後跟我一塊兒來探索、觀測這些性能指標。tcp

3、網絡配置

分析網絡問題的第一步,一般是查看網絡接口的配置和狀態。你可使用 ifconfig 或者 ip命令,來查看網絡的配置。我我的更推薦使用 ip 工具,由於它提供了更豐富的功能和更易
用的接口。工具

以網絡接口 eth0 爲例,你能夠運行下面的兩個命令,查看它的配置和狀態:

root@luoahong:~# ifconfig ens34
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.118.74  netmask 255.255.255.0  broadcast 192.168.118.255
        inet6 fe80::20c:29ff:fe03:d3a7  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:03:d3:a7  txqueuelen 1000  (Ethernet)
        RX packets 460768  bytes 587423814 (587.4 MB)
        RX errors 0  dropped 100  overruns 0  frame 0
        TX packets 122590  bytes 29027840 (29.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@luoahong:~# ip -s addr show dev ens34
2: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:03:d3:a7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.118.74/24 brd 192.168.118.255 scope global dynamic ens34
       valid_lft 66745sec preferred_lft 66745sec
    inet6 fe80::20c:29ff:fe03:d3a7/64 scope link
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast
    587440742  460987   0       100     0       0
    TX: bytes  packets  errors  dropped carrier collsns
    29036492   122677   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 表示碰撞數據包數。

4、套接字信息

ifconfig 和 ip 只顯示了網絡接口收發數據包的統計信息,但在實際的性能問題中,網絡協議棧中的統計信息,咱們也必須關注。你能夠用 netstat 或者 ss ,來查看套接字、網絡
棧、網絡接口以及路由表的信息。

我我的更推薦,使用 ss 來查詢網絡的鏈接信息,由於它比 netstat 提供了更好的性能(速度更快)。好比,你能夠執行下面的命令,查詢套接字信息:

root@luoahong:~# netstat -nlp|head -n 3
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Programname
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      840/systemd-resolve
root@luoahong:~# 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=1215,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() 系統調用取走,這
樣,服務器就能夠開始真正處理客戶端的請求了。

5、協議棧統計信息

相似的,使用 netstat 或 ss ,也能夠查看協議棧的信息:

root@luoahong:~# netstat -s
Ip:
    Forwarding: 1
    207047 total packets received
    2 with invalid addresses
    216 forwarded
    0 incoming packets discarded
    206829 incoming packets delivered
    119198 requests sent out
    20 outgoing packets dropped
Icmp:
    43 ICMP messages received
    0 input ICMP message failed
    ICMP input histogram:
        destination unreachable: 40
        echo requests: 1
        echo replies: 2
    117 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
        destination unreachable: 114
        echo requests: 2
        echo replies: 1
IcmpMsg:
        InType0: 2
        InType3: 40
        InType8: 1
        OutType0: 1
        OutType3: 114
        OutType8: 2
Tcp:
    415 active connection openings
    3 passive connection openings
    0 failed connection attempts
    7 connection resets received
    1 connections established
    196251 segments received
    124187 segments sent out
    52 segments retransmitted
    0 bad segments received
    226 resets sent
Udp:
    1042 packets received
    139 packets to unknown port received
    0 packet receive errors
    1084 packets sent
    0 receive buffer errors
    0 send buffer errors
    IgnoredMulti: 9264
UdpLite:
TcpExt:
    5 TCP sockets finished time wait in fast timer
    149 delayed acks sent
    9 delayed acks further delayed because of locked socket
    Quick ack mode was activated 3 times
    161413 packet headers predicted
    12736 acknowledgments not containing data payload received
    2975 predicted acknowledgments
    TCPTimeouts: 10
    TCPLossProbes: 13
    TCPLossProbeRecovery: 2
    TCPDSACKOldSent: 3
    TCPDSACKRecv: 9
    6 connections reset due to unexpected data
    7 connections reset due to early user close
    TCPDSACKIgnoredNoUndo: 2
    TCPRcvCoalesce: 91930
    TCPOFOQueue: 10697
    TCPAutoCorking: 1357
    TCPSynRetrans: 40
    TCPOrigDataSent: 27150
    TCPHystartTrainDetect: 1
    TCPHystartTrainCwnd: 16
    TCPKeepAlive: 4
IpExt:
    InBcastPkts: 9264
    InOctets: 580667049
    OutOctets: 23375191
    InBcastOctets: 1053751
    InNoECTPkts: 424052
root@luoahong:~# ss -s
Total: 556 (kernel 2442)
TCP:   4 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total     IP        IPv6
*	  2442      -         -
RAW	  1         0         1
UDP	  2         2         0
TCP	  4         3         1
INET	  7         5         2
FRAG	  0         0         0

這些協議棧的統計信息都很直觀。ss 只顯示已經鏈接、關閉、孤兒套接字等簡要統計,而netstat 則提供的是更詳細的網絡協議棧信息。

好比,上面 netstat 的輸出示例,就展現了 TCP 協議的主動鏈接、被動鏈接、失敗重試、發送和接收的分段數量等各類信息。

6、網絡吞吐和 PPS

接下來,咱們再來看看,如何查看系統當前的網絡吞吐量和 PPS。在這裏,我推薦使用咱們的老朋友 sar,在前面的 CPU、內存和 I/O 模塊中,咱們已經屢次用到它。

給 sar 增長 -n 參數就能夠查看網絡的統計信息,好比網絡接口(DEV)、網絡接口錯誤(EDEV)、TCP、UDP、ICMP 等等。執行下面的命令,你就能夠獲得網絡接口統計信息:

root@luoahong:~# sar -n DEV 1
Linux 4.15.0-48-generic (luoahong) 	09/03/2019 	_x86_64_	(2 CPU)
04:51:51 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
04:51:52 PM     ens34      4.95      0.99      0.52      0.80      0.00      0.00      0.00      0.00
04:51:52 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:51:52 PM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

04:51:52 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
04:51:53 PM     ens34      3.00      1.00      0.18      0.81      0.00      0.00      0.00      0.00
04:51:53 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:51:53 PM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
^C


Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:        ens34      3.66      1.26      0.31      0.79      0.00      0.00      0.00      0.00
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:      docker0      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 網卡就是一個千兆網卡:

root@luoahong:~#ethtool eth0 | grep Speed
	Speed: 1000Mb/s

7、連通性和延時

最後,咱們一般使用 ping ,來測試遠程主機的連通性和延時,而這基於 ICMP 協議。好比,執行下面的命令,你就能夠測試本機到 114.114.114.114 這個 IP 地址的連通性和延時:

root@luoahong:~# 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=70 time=22.7 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=76 time=25.1 ms
64 bytes from 114.114.114.114: icmp_seq=3 ttl=89 time=23.2 ms

--- 114.114.114.114 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2005ms
rtt min/avg/max/mdev = 22.724/23.722/25.186/1.057 ms

ping 的輸出,能夠分爲兩部分。

第一部分,是每一個 ICMP 請求的信息,包括 ICMP 序列號(icmp_seq)、TTL(生存時間,或者跳數)以及往返延時。

第二部分,則是三次 ICMP 請求的彙總。

好比上面的示例顯示,發送了 3 個網絡包,而且接收到 3 個響應,沒有丟包發生,這說明測試主機到 114.114.114.114 是連通的;平均往返延時(RTT)是 22.7ms,也就是從發送 ICMP 開始,到接收到 114.114.114.114 回覆的確認,總共經歷 22.7ms。

相關文章
相關標籤/搜索