文章目录

  • 性能指标
  • 查看网络配置:ifconfig 和 ip
  • 查看套接字信息:netstat 和 ss
  • 查看协议栈的统计信息:netstat
  • 网络吞吐量和PPS
  • 连通性和延时
  • 参考文献


性能指标

实际上,我们通常用带宽、吞吐量、延时、PPS等指标衡量网络的性能:

  • 带宽:表示链路最大的传输速率,单位(b/s)
  • 吞吐量:表示单位时间成功传输的数据量,单位(b/s)。一般来说,吞吐量/带宽,也就是该网络的使用率
  • 延时:表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟
  • PPS:packet per sencond(包/秒)的缩写,表示以网络包为单位的传输速率。

这些指标只是基本的,除了这些指标之外:网络可用性、并发连接数、丢包率、重传率也是常用的性能指标。

查看网络配置:ifconfig 和 ip

分析网络性能的第一步是查看网络接口的配置和状态。我们可用使用ifconfig或者ip命令来查看网络配置。

现在我们演示一下ip命令查看eth0端口的信息:

ubuntu@VM-0-2-ubuntu:~/libco/libco$ ip -s addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:00:88:37:58 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/20 brd 172.17.15.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe88:3758/64 scope link 
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast   
    2830321820 23061948 0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    3649280587 21806912 0       0       0       0

在这里面有几个比较重要的指标需要我们关注一下:

  1. 网络接口的状态标志:在第一行,ip命令显示当前的状态是LOWER_UP,其表示当前状态是联通的;如果不是这个值,通常都是网络被拔掉了
  2. MTU的大小:还是在第一行,有一个mtu 1500,表示当前mtu的大小
  3. 网络接口的IP地址:在第三行和第五行分别显示了当前机器的IPv4地址:172.17.0.2/20和IPv6地址:fe80::5054:ff:fe88:3758/64
  4. 网络收发的字节数、包数、错误数以及丢包情况:在第七行和第九行,特别是TX和RX部分
    4.1 errors:表示发生错误的数据包数
    4.2 dropped:表示丢弃的数据包数
    4.3 overrun:表示超限数据包数
    4.4 carrier:表示发生carrier错误的数据包数
    4.5 collisions:表示发生碰撞的数据包数

查看套接字信息:netstat 和 ss

除了ifconfig和ip显示的网络接口收发数据包的统计信息外,网络协议栈中的统计信息也非常值得我们关注。

我们可用使用netstat 或者 ss来查看套接字、网络栈、网络接口以及路由表信息。

以下是使用ss来查询网络连接信息的例子:

# -l表示只显示监听套接字
# -t表示只显示TCP套接字
# -n表示只显示数字地址和端口
# -p表示显示进程信息
ubuntu@VM-0-2-ubuntu:~/libco/libco$ ss -ltnp | head -n 3
State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port                                                                                    
LISTEN   0         128               127.0.0.1:43719            0.0.0.0:*        users:(("node",pid=29762,fd=18))                                               
LISTEN   0         128               127.0.0.1:6379             0.0.0.0:*
  • State:套接字当前状态
  • Recv-Q:接受队列
  • Send-Q:发送队列
  • Local Address:Port:本机地址
  • Peer Address:Port:远端地址

其中我们需要特别关注Recv-QSend-Q这两个队列,它们通常是0。如果它们不是0时,说明有网络包的堆积发生。当然,还要注意,在不同套接字状态下,它们的含义不同:

  1. 当套接字处于连接状态 established:
    1.1 Recv-Q表示套接字缓冲还没被应用程序取走的字节数,即接受队列长度
    1.2 Send-Q表示还没有被远端主机确认的字节数,即发送队列长度
  2. 当套接字处于监听状态 listen:
    2.1 Recv-Q表示全连接队列的长度
    2.2 Send-Q表示全连接队列的最大长度

博主说
全连接队列也是就TCP三次握手中,服务端在收到客户端最后一个ACK报文后,保存这个连接的队列。

查看协议栈的统计信息:netstat

类似,使用netstat可用查看协议栈的统计信息。这里使用的是netstat,因为比较详细:

# -s表示查看协议栈信息
ubuntu@VM-0-2-ubuntu:~/libco/libco$ netstat -s
# 篇幅较长,就显示部分
Ip:
    Forwarding: 1
    39262312 total packets received
    2 with invalid addresses
    0 forwarded
    9 with unknown protocol
    0 incoming packets discarded
    39262300 incoming packets delivered
    38464838 requests sent out
    2 reassemblies required
    1 packets reassembled ok
Icmp:
    1400109 ICMP messages received
    743 input ICMP message failed
    InCsumErrors: 1
    ICMP input histogram:
        destination unreachable: 1934
        timeout in transit: 64
        echo requests: 1398094
        echo replies: 10
        timestamp request: 6
    1421145 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
        destination unreachable: 23045
        echo replies: 1398094
        timestamp replies: 6
......

网络吞吐量和PPS

对于网络吞吐量和PPS,我们可用使用sar命令来查看网络统计信息:

# -n 参数表示查看网络信息
# DEV 表示网络接口
# 1 表示每隔一秒输出一组数据
ubuntu@VM-0-2-ubuntu:~/libco/libco$ sar -n DEV 1
Linux 4.15.0-140-generic (VM-0-2-ubuntu)        05/25/2021      _x86_64_        (2 CPU)

01:44:58 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
01:44:59 PM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
01:44:59 PM        lo     18.00     18.00      1.21      1.21      0.00      0.00      0.00      0.00
01:44:59 PM      eth0     30.00     79.00      2.13     96.15      0.00      0.00      0.00      0.00

这里有几个指标值得我们重点关注一下:

  • rxpck/s:接受的PPS,单位(包/秒)
  • txpck/s:发送的PPS,单位(包/秒)
  • rxkB/s:接受的吞吐量,单位(KB/s)
  • txkB/s:发送的吞吐量,单位(KB/s)
  • rxcmp/s:接受的压缩数据包数,单位(包/秒)
  • txcmp/s:发送的压缩数据包数,单位(包/秒)
  • %ifutil:网络接口的使用率

连通性和延时

一般来说,我们都会使用ping命令查看我们是否能和网络远程主机连通,这通常基于ICMP协议。

那么,你们是否知道,ping的各部分显示的含义呢?

# -c3 表示发送三次ICMP包后停止
ubuntu@VM-0-2-ubuntu:~/libco/libco$ ping -c3 www.baidu.com
PING www.a.shifen.com (180.101.49.11) 56(84) bytes of data.
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=1 ttl=49 time=9.55 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=2 ttl=49 time=9.44 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=3 ttl=49 time=9.45 ms

--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 9.442/9.484/9.559/0.095 ms

ping的输出,一般来说可以分为两个部分:

  • 第一部分,是每个ICMP请求的信息,包括序列号icmp_seqTTL生存时间以及往返延时
  • 第二部分,则是三次ICMP请求的汇总

参考文献

[1] 倪朋飞.Linux性能优化实战.极客时间