34-基础篇:关于Linux网络,你必须知道这些(下)





网络性能指标

实际上通常用带宽、吞吐量、延时、PPS(Packet Per Second)等指标衡量网络的性能

  1. 带宽,表示链路的最大传输速率,单位通常为b/s(比特/秒)
  2. 吞吐量,表示单位时间内成功传输的数据量,单位通常为b/s(比特/秒)或者B/s(字节/秒)
    吞吐量受带宽限制,而吞吐量/带宽,也就是该网络的使用率
  3. 延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟
    在不同场景中,这一指标可能会有不同含义
    比如它可以表示,建立连接需要的时间(比如TCP握手延时),或一个数据包往返所需的时间(比如RTT)
  4. PPS,是Packet Per Second(包/秒)的缩写,表示以网络包为单位的传输速率
    PPS通常用来评估网络的转发能力
    比如硬件交换机,通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)
    而基于Linux服务器的转发,则容易受网络包大小的影响

除了这些指标,网络的可用性(网络能否正常通信)、并发连接数(TCP连接数量)
丢包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标




网络配置

分析网络问题的第一步,通常是查看网络接口的配置和状态
可以使用ifconfig或者ip命令,来查看网络的配置
推荐使用ip工具,因为它提供了更丰富的功能和更易用的接口

ifconfig和ip分别属于软件包net-tools和iproute2,iproute2是nettools 的下一代
通常情况下它们会在发行版中默认安装
但如果找不到ifconfig或者ip命令,可以安装这两个软件包


以网络接口 eth0 为例,运行下面的两个命令,查看它的配置和状态

[root@local_sa_192-168-1-6 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.6  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::5054:ff:fea7:5941  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:a7:59:41  txqueuelen 1000  (Ethernet)
        RX packets 597129  bytes 1533960778 (1.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 302452  bytes 87630664 (83.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


[root@local_sa_192-168-1-6 ~]# ip -s addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:a7:59:41 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.6/24 brd 192.168.1.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fea7:5941/64 scope link
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast
    1533966320 597196   0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    87635166   302485   0       0       0       0

  1. 网络接口的状态标志
    ifconfig输出中的RUNNING,或ip输出中的LOWER_UP,都表示物理网络是连通的
    即网卡已经连接到了交换机或者路由器中
    如果看不到它们,通常表示网线被拔掉了
  2. MTU的大小
    MTU默认大小是1500,根据网络架构的不同(比如是否使用了VXLAN等叠加网络)
    可能需要调大或者调小MTU的数值
  3. 网络接口的IP地址、子网以及MAC地址
    这些都是保障网络功能正常工作所必需的,需要确保配置正确
  4. 网络收发的字节数、包数、错误数以及丢包情况
    特别是TX和RX部分的 errors、dropped、overruns、carrier以及collisions等指标不为0时
    通常表示出现了网络I/O问题
    1. errors表示发生错误的数据包数,比如校验错误、帧同步错误等
    2. dropped表示丢弃的数据包数,即数据包已经收到了Ring Buffer,但因为内存不足等原因丢包
    3. overruns表示超限数据包数,即网络I/O速度过快
      导致Ring Buffer中的数据包来不及处理(队列满)而导致的丢包
    4. carrier表示发生carrirer错误的数据包数,比如双工模式不匹配、物理电缆出现问题等
    5. collisions表示碰撞数据包数



套接字信息

ifconfig和ip只显示了网络接口收发数据包的统计信息
但在实际的性能问题中,网络协议栈中的统计信息也必须关注
可以用netstat或者ss ,来查看套接字、网络栈、网络接口以及路由表的信息
推荐使用ss来查询网络的连接信息,因为它比netstat提供了更好的性能(速度更快)

查询套接字信息

# head -n 3表示只显示前面3行
# -l 表示只显示监听套接字
# -n 表示显示数字地址和端口 (而不是名字)
# -p 表示显示进程信息
[root@local_sa_192-168-1-6 ~]# 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 0.0.0.0:3600            0.0.0.0:*               LISTEN      940/sshd

# -l 表示只显示监听套接字
# -t 表示只显示TCP套接字
# -n 表示显示数字地址和端口 (而不是名字)
# -p 表示显示进程信息
[root@local_sa_192-168-1-6 ~]# ss -lntp|head -n 3
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     0      65500        *:10000                    *:*                   users:(("docker-proxy",pid=24388,fd=4))
LISTEN     0      128          *:3600                     *:*                   users:(("sshd",pid=940,fd=3))

netstat和ss的输出类似,展示套接字的状态、接收队列、发送队列、本地地址、远端地址、进程PID和进程名称等

其中接收队列(Recv-Q)和发送队列(Send-Q)需要特别关注,它们通常应该是0
当发现它们不是0时,说明有网络包的堆积发生
当然还要注意,在不同套接字状态下,它们的含义不同

当套接字处于连接状态(Established)时

  1. Recv-Q表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)
  2. Send-Q表示还没有被远端主机确认的字节数(即发送队列长度)

当套接字处于监听状态(Listening)时

  1. Recv-Q表示syn backlog的当前值
  2. Send-Q表示最大的syn backlog值

而syn backlog是TCP协议栈中的半连接队列长度
相应的也有一个全连接队列 (accept queue),它们都是维护TCP状态的重要机制

半连接就是还没有完成TCP三次握手的连接,连接只进行了一半
而服务器收到了客户端的SYN包后,就会把这个连接放到半连接队列中,然后再向客户端发送SYN+ACK包

全连接是指服务器收到了客户端的ACK,完成了TCP三次握手,然后就会把这个连接挪到全连接队列中
这些全连接中的套接字,还需要再被accept()系统调用取走,这样,服务器就可以开始真正处理客户端的请求了




协议栈统计信息

使用netstat或ss ,可以查看协议栈的信息

[root@local_sa_192-168-1-6 ~]# netstat -s
Ip:
    321851 total packets received
    11 with invalid addresses
    113189 forwarded
    0 incoming packets discarded
    204632 incoming packets delivered
    355306 requests sent out
    8 dropped because of missing route
Icmp:
    68 ICMP messages received
    0 input ICMP message failed.
    ICMP input histogram:
        destination unreachable: 68
    925 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
        destination unreachable: 925
IcmpMsg:
        InType3: 68
        OutType3: 925
Tcp:
    412 active connections openings
    108 passive connection openings
    3 failed connection attempts
    104 connection resets received
    1 connections established
    191423 segments received
    248259 segments send out
    57 segments retransmited
    0 bad segments received.
    34 resets sent
Udp:
    2514 packets received
    4201 packets to unknown port received.
    0 packet receive errors
    2721 packets sent
    0 receive buffer errors
    0 send buffer errors
    IgnoredMulti: 6426
UdpLite:
Problem while parsing /proc/net/netstat


[root@local_sa_192-168-1-6 ~]# ss -s
Total: 192 (kernel 380)
TCP:   11 (estab 1, closed 4, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total     IP        IPv6
*	  380       -         -
RAW	  0         0         0
UDP	  2         1         1
TCP	  7         4         3
INET	  9         5         4
FRAG	  0         0         0
##
ss只显示已经连接、关闭、孤儿套接字等简要统计
netstat则提供的是更详细的网络协议栈信息
##
上面netstat的输出示例,就展示了TCP协议的主动连接、被动连接、失败重试、发送和接收的分段数量等各种信息




网络吞吐和PPS

如何查看系统当前的网络吞吐量和PPS?
推荐使用sar
给sar增加-n参数就可以查看网络的统计信息
比如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP等等
执行下面的命令可以得到网络接口统计信息

[root@local_sa_192-168-1-6 ~]# sar -n DEV 1
Linux 5.15.7-1.el7.elrepo.x86_64 (local_sa_192-168-1-6) 	2021年12月24日 	_x86_64_	(2 CPU)

17时05分36秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
17时05分37秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
17时05分37秒      eth0      1.00      0.00      0.06      0.00      0.00      0.00      0.00
17时05分37秒   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
17时05分37秒 vethff3fe2f      0.00      0.00      0.00      0.00      0.00      0.00      0.00

各个指标含义

  1. rxpck/s和txpck/s分别是接收和发送的PPS,单位为包/秒
  2. rxkB/s和txkB/s分别是接收和发送的吞吐量,单位是KB/秒
  3. rxcmp/s和txcmp/s分别是接收和发送的压缩数据包数,单位是包/秒
  4. %ifutil是网络接口的使用率,即半双工模式下为 (rxkB/s+txkB/s)/Bandwidth
    而全双工模式下为max(rxkB/s, txkB/s)/Bandwidth

其中,Bandwidth可以用ethtool来查询,它的单位通常是Gb/s或者Mb/s
不过注意这里小写字母b ,表示比特而不是字节
通常提到的千兆网卡、万兆网卡等,单位也都是比特

[root@local_sa_192-168-1-6 ~]# ethtool eth0 | grep Speed
 Speed: 1000Mb/s



连通性和延时

通常使用ping,来测试远程主机的连通性和延时,而这基于 CMP协议
比如执行下面的命令,就可以测试本机到114.114.114.114 这个IP地址的连通性和延时

[root@local_sa_192-168-1-6 ~]# 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=76 time=27.4 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=83 time=27.2 ms
64 bytes from 114.114.114.114: icmp_seq=3 ttl=78 time=27.2 ms

--- 114.114.114.114 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 27.227/27.319/27.443/0.091 ms

ping的输出,可以分为两部分

  1. 第一部分,是每个ICMP请求的信息
    包括ICMP序列号(icmp_seq)、TTL(生存时间,或者跳数)以及往返延时
  2. 第二部分,则是三次ICMP请求的汇总

比如上面的示例显示,发送了3个网络包,并且接收到3个响应,没有丢包发生
这说明测试主机到114.114.114.114 是连通的
平均往返延时(RTT)是27.319ms,
也就是从发送ICMP开始,到接收到114.114.114.114回复的确认,总共经历27.319ms




小结

通常使用带宽、吞吐量、延时等指标,来衡量网络的性能
可以用ifconfig、netstat、ss、sar、ping等工具,来查看这些网络的性能指标


上一篇:python-unionAll导致*


下一篇:mysql入门到精通完整学习教程,基础入门-数据库实战