1.帶寬: 标識網卡的最大傳輸速率,單位為 b/s,比如 1Gbps,10Gbps,相當于馬路多寬
2.吞吐量: 單位時間内傳輸數據量大小單位為 b/s 或 B/s ,吞吐量/帶寬,就是網絡的使用率,相當于單位時間内馬路上路過有多少人吧(包括車裡的等)
3.延時: 發送網絡請求,到收到遠端響應,需要的時間延遲,比如 TCP 握手延遲,或者數據包往返時間,相當于一去一回時間。
4.PPS : 每秒轉發包數量,如果吞吐量是以字節為單位,pps 是以包為單位,可以理解成路上車的數量,以車位單位。
5.并發連接數: TCP 連接數量。 6.丢包率: 丢包的百分比。 7.重傳率: 重傳的包的比例。
二 網卡有用命令2.1 監控是否丢包 watchwatch -d ifconfig ens33
errors 表示發生錯誤的數據包數,比如校驗錯誤、幀同步錯誤等;
dropped 表示丢棄的數據包數,即數據包已經收到了 Ring Buffer,但因為内存不足等原因丢包,主要應用層或系統内核處理慢;
overruns 表示超限數據包數,即網絡 I/O 速度過快,導緻 Ring Buffer 中的數據包來不及處理(隊列滿)而導緻的丢包(網卡收包隊列已滿);
carrier 表示發生 carrirer 錯誤的數據包數,比如雙工模式不匹配、物理電纜出現問題等;
collisions 表示碰撞數據包數。
2.2 查看系統中連接信息netstat -lnp
其中: -l 表示隻顯示監聽套接字 ;
-n 表示顯示數字地址和端口(而不是名字)
-p 表示顯示進程信息
[root@iZbp10p2g1civrw4ggigvfZ ~]# netstat -lnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 1444/master tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 20330/nginx: master tcp 0 0 0.0.0.0:2332 0.0.0.0:* LISTEN 1712/nginx: master tcp 0 0 0.0.0.0:5278 0.0.0.0:* LISTEN 27975/java tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1840/php-fpm: maste tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1937/mysqld tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1684/redis-server 0 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 20330/nginx: master tcp 0 0 0.0.0.0:2353 0.0.0.0:* LISTEN 24490/sshd: /usr/sb tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 1/systemd tcp6 0 0 :::25 :::* LISTEN 1444/master tcp6 0 0 :::33060 :::* LISTEN 1937/mysqld tcp6 0 0 :::2353 :::* LISTEN 24490/sshd: /usr/sb udp 0 0 0.0.0.0:68 0.0.0.0:* 1026/dhclient udp 0 0 127.0.0.1:323 0.0.0.0:* 749/chronyd udp6 0 0 ::1:323 :::* 749/chronyd Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node PID/Program name Path ....
ss -ltnp
-l 表示隻顯示監聽套接字
-t 表示隻顯示 TCP 套接字
-n 表示顯示數字地址和端口(而不是名字) -p 表示顯示進程信息
注意:下面是 ss 命令下的解釋:
Established 狀态時,Recv-Q 表示套接字緩沖還沒有被應用程序取走的字節數( ,而 Send-Q 表示還沒有被遠端主機确認的字節數 LISTEN 狀态時候 Recv-Q 表示使用的全連接隊列的長度 Send-Q 表示全連接隊列的最大長度。
ss 隻顯示已經連接、關閉、孤兒套接字等簡要統計,而 netstat 則提供的是更詳細的網絡協議棧信息。
netstat -s root@iZbp10p2g1civrw4ggigvfZ ~]# netstat -s Ip: 368894134 total packets received 0 forwarded 0 incoming packets discarded 368894127 incoming packets delivered 204418238 requests sent out 133 dropped because of missing route 7 reassemblies required 1 packets reassembled ok Icmp: 91913511 ICMP messages received 90910972 input ICMP message failed. InCsumErrors: 2 ICMP input histogram: destination unreachable: 4391 ....
netstat 在排查 tcp 連接時候還是非常有用的,比如我們可以通過:
netstat -s | egrep "listen" 79019 times the listen queue of a socket overflowed
多次觀察是否會增加,如果會增加,說明有監聽隊列滿了,導緻的連接拒絕問題。 如果隊列滿了,可以通過查看:
cat /proc/sys/net/ipv4/tcp_abort_on_overflow
值為 0 表示連接隊列如果滿了,系統會直接扔掉客戶端的 ack 報文,将這個值改成 1,會在隊列滿的情況下直接發 reset 包給客戶端。
ss -s命令統計信息:
[root@iZbp10p2g1civrw4ggigvfZ ~]# ss -s Total: 210 (kernel 276) TCP: 22 (estab 7, closed 2, orphaned 0, synrecv 0, timewait 1/0), ports 0 Transport Total IP IPv6 * 276 - - RAW 0 0 0 UDP 3 2 1 TCP 20 17 3 INET 23 19 4 FRAG 0 0 02.3 網絡統計指标統計信息
sar -n DEV 1 [root@iZbp10p2g1civrw4ggigvfZ ~]# sar -n DEV 1 Linux 3.10.0-1062.4.3.el7.x86_64 (iZbp10p2g1civrw4ggigvfZ) 12/25/2021 _x86_64_ (2 CPU) 02:16:52 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 02:16:53 PM eth0 0.99 0.99 0.06 0.09 0.00 0.00 0.00 02:16:53 PM lo 11.88 11.88 1.95 1.95 0.00 0.00 0.00 02:16:53 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 02:16:54 PM eth0 0.99 0.99 0.06 0.17 0.00 0.00 0.00 02:16:54 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
[root@localhost ~]# ethtool ens33 | grep Speed Speed: 1000Mb/s
以上為千兆網卡
2.5 連通性測試和延時查看這個比較簡單,我們一般通過 ping 進行測試,如下:
[root@localhost ~]# ping -c10 www.baidu.com PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data. 64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=55 time=36.2 ms 64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=55 time=36.1 ms 64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=55 time=35.8 ms ...
time=35.8 ms 标識往返時延。 設置 ping 包大小,可以測試網絡中 mtu 大概範圍:
[root@localhost ~]# ping -c 4 -s 1420 www.baidu.com PING www.a.shifen.com (14.215.177.38) 1420(1448) bytes of data. 1428 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=55 time=36.4 ms 1428 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=55 time=35.2 ms 1428 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=55 time=36.5 ms三 網絡層性能測試3.1 網路層可以通過 pktgen 來測試網絡性能
# 加載發包工具 $ modprobe pktgen
定義發包腳本:
# 定義一個工具函數,方便後面配置各種測試選項 function pgset() { local result echo $1 > $PGDEV result=`cat $PGDEV | fgrep "Result: OK:"` if [ "$result" = "" ]; then cat $PGDEV | fgrep Result: fi } # 為0号線程綁定ens33網卡 PGDEV=/proc/net/pktgen/kpktgend_0 pgset "rem_device_all" # 清空網卡綁定 pgset "add_device eth0" # 添加eth0網卡 # 配置ens33網卡的測試選項 PGDEV=/proc/net/pktgen/ens33 pgset "count 1000000" # 總發包數量 pgset "delay 5000" # 不同包之間的發送延遲(單位納秒) pgset "clone_skb 0" # SKB包複制 pgset "pkt_size 64" # 網絡包大小 pgset "dst 192.168.1.30" # 目的IP pgset "dst_mac 11:11:11:11:11:11" # 目的MAC # 啟動測試 PGDEV=/proc/net/pktgen/pgctrl pgset "start"
查看測試結果:
[root@localhost pktgen]# cat /proc/net/pktgen/em1 Params: count 1000000 min_pkt_size: 64 max_pkt_size: 64 frags: 0 delay: 5000 clone_skb: 0 ifname: em1 flows: 0 flowlen: 0 queue_map_min: 0 queue_map_max: 0 dst_min: 192.168.1.29 dst_max: src_min: src_max: src_mac: f8:bc:12:4c:65:00 dst_mac: 11:11:11:11:11:11 udp_src_min: 9 udp_src_max: 9 udp_dst_min: 9 udp_dst_max: 9 src_mac_count: 0 dst_mac_count: 0 Flags: Current: pkts-sofar: 1000000 errors: 0 started: 335193101003us stopped: 335198101130us idle: 4529619us seq_num: 1000001 cur_dst_mac_offset: 0 cur_src_mac_offset: 0 cur_saddr: 192.168.1.29 cur_daddr: 192.168.1.30 cur_udp_dst: 9 cur_udp_src: 9 cur_queue_map: 0 flows: 0 Result: OK: 5000126(c470506+d4529619) usec, 1000000 (64byte,0frags) 199994pps 102Mb/sec (102396928bps) errors: 0
iperf 和 netperf 是用來測試 tcp、udp 的吞吐量的常用工具。
# 安裝 yum install iperf3 # 測試 # -s 啟動服務器端 -i 彙報間隔 -p 端口啟動1234 $iperf3 -s -i 1 -p 1234 # -c表示啟動客戶端,127.0.0.1為目标服務器的IP # -b表示目标帶寬(單位是bits/s) # -t表示測試時間 # -P表示并發數,-p表示目标服務器監聽端口 $iperf3 -c 127.0.0.1 -b 10G -t 15 -P 2 -p 1234
報告查看,本機測試 20Gbps 還是可以達到的。
[ ID] Interval Transfer Bitrate Retr [ 5] 0.00-15.00 sec 17.5 GBytes 10.0 Gbits/sec 6 sender [ 5] 0.00-15.03 sec 17.5 GBytes 9.98 Gbits/sec receiver [ 7] 0.00-15.00 sec 17.5 GBytes 10.0 Gbits/sec 2 sender [ 7] 0.00-15.03 sec 17.5 GBytes 9.98 Gbits/sec receiver [SUM] 0.00-15.00 sec 34.9 GBytes 20.0 Gbits/sec 8 sender [SUM] 0.00-15.03 sec 34.9 GBytes 20.0 Gbits/sec receiver3.3 HTTP 性能測試
http 性能測試可以選擇的不少,常用的有 ab(Apache 自帶的 HTTP 壓測工具),webbench。
# ab工具安裝 yum install -y httpd-tools
運行下 http 服務器:
[root@localhost ~]# podman run -p 80:80 -itd nginx b924819bbd3c3eadcd14e2c6b2088f838fa88399fd8404dfbd9863d04570f900 [root@localhost ~]# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b924819bbd3c docker.io/feisky/nginx:latest nginx -g daemon o... 9 seconds ago Up 8 seconds ago 0.0.0.0:80->80/tcp beautiful_tereshkov
測試:
# -c表示并發請求數為1000,-n表示總的請求數為10000 [root@localhost ~]# ab -c 1000 -n 10000 http://192.168.31.50/ This is ApacheBench, Version 2.3 <$Revision: 1843412 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.31.50 (be patient) apr_socket_recv: Connection reset by peer (104) Total of 223 requests completed [root@localhost ~]#
直接報錯,尴尬了,難道是隊列不夠設置下:
vim /etc/sysctl.conf net.ipv4.tcp_syncookies = 0 net.ipv4.tcp_max_syn_backlog =1024 # 生效:sysctl -p # 注意net.ipv4.tcp_syncookies設置為1的話,半連接隊列沒有用的
SYN Cookie 是對 TCP 服務器端的三次握手協議作一些修改,專門用來防範 SYN Flood 攻擊的一種手段。它的原理是,在 TCP 服務器收到 TCP SYN 包并返回 TCP SYN+ACK 包時,不分配一個專門的數據區,而是根據這個 SYN 包計算出一個 cookie 值。在收到 TCP ACK 包時,TCP 服務器在根據那個 cookie 值檢查這個 TCP ACK 包的合法性。如果合法,再分配專門的數據區進行處理未來的 TCP 連接。
結果還不行,抓包看下,都是直接對 80 端口發送 RST 報文,有點尴尬,沒看到連接報文,後來查了下,可能是在接手 tcp_syncookies 報錯,所以把報錯繼續發送選項打開,即加個-r 選項 如下:
[root@localhost ~]# ab -r -c 1000 -n 10000 http://192.168.31.50/ This is ApacheBench, Version 2.3 <$Revision: 1843412 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.31.50 (be patient) Completed 1000 requests Completed 2000 requests Completed 3000 requests Completed 4000 requests Completed 5000 requests Completed 6000 requests Completed 7000 requests Completed 8000 requests Completed 9000 requests Completed 10000 requests Finished 10000 requests Server Software: nginx/1.15.4 Server Hostname: 192.168.31.50 Server Port: 80 Document Path: / Document Length: 153 bytes Concurrency Level: 1000 Time taken for tests: 0.994 seconds Complete requests: 10000 Failed requests: 0 Non-2xx responses: 10000 Total transferred: 3030000 bytes HTML transferred: 1530000 bytes Requests per second: 10061.44 [#/sec] (mean) Time per request: 99.389 [ms] (mean) Time per request: 0.099 [ms] (mean, across all concurrent requests) Transfer rate: 2977.16 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 5 6.7 2 39 Processing: 1 32 101.8 11 851 Waiting: 1 31 101.8 10 851 Total: 3 37 104.4 13 870 Percentage of the requests served within a certain time (ms) 50% 13 66% 16 75% 19 80% 21 90% 44 95% 84 98% 453 99% 858 100% 870 (longest request)
關鍵輸出信息:
1. 每秒平均發送請求:Requests per second: 10061.44 [#/sec](mean) 2. 平均請求時延 Time per request: 99.389 [ms](mean) 3. 吞吐量: Transfer rate: 2977.16 [Kbytes/sec] received3.4 應用層測試性能
wrk、TCPCopy、Jmeter 或者 LoadRunner 等工具可以測試實際負載的。 以 wrk 為例測試:
wget https://github.com.cnpmjs.org/wg/wrk tar xvf wrk* cd wrk* make cp wrk /usr/local/bin
測試:
# 測試 -t12 開始12個線程 -c400 保持400個http連接 -d30s 持續時間30s [root@localhost wrk-master]# wrk -t12 -c400 -d30s http://192.168.31.50/ Running 30s test @ http://192.168.31.50/ 12 threads and 400 connections Thread Stats Avg Stdev Max +/- Stdev Latency 22.42ms 17.12ms 564.75ms 97.18% Req/Sec 1.56k 261.57 3.13k 70.10% 558047 requests in 30.04s, 163.89MB read Non-2xx or 3xx responses: 558047 Requests/sec: 18574.38 Transfer/sec: 5.46MB
有話要說...