美文网首页Network
网络常用概念和性能测试

网络常用概念和性能测试

作者: 明翼 | 来源:发表于2021-12-26 14:39 被阅读0次

    一 网络概念:

    1.带宽: 标识网卡的最大传输速率,单位为b/s,比如1Gbps,10Gbps,相当于马路多宽
    2.吞吐量: 单位时间内传输数据量大小单位为b/s或B/s ,吞吐量/带宽,就是网络的使用率,相当于单位时间内马路上路过有多少人吧(包括车里的等)
    3.延时: 发送网络请求,到收到远端响应,需要的时间延迟,比如TCP握手延迟,或者数据包往返时间,相当于一去一回时间。
    4.PPS : 每秒转发包数量,如果吞吐量是以字节为单位,pps是以包为单位,可以理解成路上车的数量,以车位单位。
    5.并发连接数: TCP连接数量
    6.丢包率: 丢包的百分比
    7.重传率: 重传的包的比例。

    二 网卡有用命令

    2.1 监控是否丢包 watch

    watch -d ifconfig ens33
    

    errors 表示发生错误的数据包数,比如校验错误、帧同步错误等;
    dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包,主要应用层或系统内核处理慢;
    overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包(网卡收包队列已满);
    carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;collisions 表示碰撞数据包数。
    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         0    
    

    2.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
    
    • rxpck/s 和 txpck/s 每秒接收的数据包数量和每秒发送数据包的数量。
    • rxkB/s 和 txkB/s 每秒接收的字节数和发送的吞吐量。
    • rxcmp/s 和 txcmp/s 每秒钟接收和发送的压缩数据包。
    • rxmcst/s 每秒收到多播的数量。

    2.4 带宽查看

    [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
    
    
    1. 第一部分的 Params 是测试选项;
    2. 第二部分的 Current 是测试进度,其中, packts so far(pkts-sofar)表示已经发送了 100 万个包,也就表明测试已完成。
    3. 第三部分的 Result 是测试结果,包含测试所用时间、网络包数量和分片、PPS、吞吐量以及错误数。
      结果每秒发送19万个包,吞吐量为102Mb/s.

    3.2 TCP/UDP性能测试

    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                  receiver
    
    

    3.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] received

    3.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
    
    
    1. 每秒发送请求数:18574.38
    2. 吞吐量为:5.46MB/s
    3. 平均时延:22.42ms

    相关文章

      网友评论

        本文标题:网络常用概念和性能测试

        本文链接:https://www.haomeiwen.com/subject/wvrsqrtx.html