undefined

一、网络的性能指标

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

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

二、查看网络信息

1. 查看网络配置

ifconfig 和 ip 分别属于软件包 net-tools 和 iproute2,iproute2 是 net-tools 的下一代。查看网络接口 eth1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
➜  [/root] ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 9.134.239.95 netmask 255.255.248.0 broadcast 9.134.239.255
ether 52:54:00:d2:e6:38 txqueuelen 1000 (Ethernet)
RX packets 2747150293 bytes 263319743292 (245.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14095335974 bytes 19311936023826 (17.5 TiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

➜ [/root] ip -s addr show dev eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:d2:e6:38 brd ff:ff:ff:ff:ff:ff
inet 9.134.239.95/21 brd 9.134.239.255 scope global eth1
valid_lft forever preferred_lft forever
RX: bytes packets errors dropped overrun mcast
263320219499 2747156071 0 0 0 0
TX: bytes packets errors dropped carrier collsns
19311984474690 14095370649 0 0 0 0
  • 网络接口的状态标志。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 表示超限数据包数,即网络 IO 速度过快,导致的 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包
    • carrier 表示发生 carrier 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等
    • collisions 表示碰撞数据包数

2. 查看套接字信息

使用 ss 来查询网络的连接信息,因为它比 netstat 提供了更好的性能(速度更快)

1
2
3
4
5
6
7
8
9
10
11
# -l 只显示监听套接字 -n 显示数字地址和端口 -p 显示进程信息
➜ [/root] 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:36000 0.0.0.0:* LISTEN 1005/sshd

# -l 只显示监听套接字 -t 只显示 TCP 套接字 -n 显示数字地址和端口 -p 显示进程信息
➜ [/root] ss -ltnp | head -n 3
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:36000 *:* users:(("sshd",pid=1005,fd=3))
LISTEN 0 128 127.0.0.1:57068 *:* users:(("node",pid=21011,fd=19))

接收队列(Recv-Q)和发送队列(Send-Q)通常应该是 0。当不是 0 时,说明网络包有堆积。在不同套接字状态下,他们的含义不同:
当套接字出于连接状态(Established)时:

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

当套接字出于监听(Listening)时:

  • Recv-Q 表示全连接队列的长度
  • Send-Q 表示全连接队列的最大长度

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

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

3. 查看网络吞吐和 PPS

使用 sar 增加 -n 参数就可以查看网络的统计信息,比如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP 等等

1
2
3
4
5
6
7
8
9
10
11
# 数字 1 表示每隔一秒输出一组数据
➜ [/root] sar -n DEV 1
Linux 3.10.107-1-tlinux2_kvm_guest-0054 (9-134-239-95) 06/05/2022 _x86_64_ (8 CPU)

07:46:43 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
07:46:44 PM br-339aed557726 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:46:44 PM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:46:44 PM eth1 243.00 1084.00 21.04 1418.80 0.00 0.00 0.00 0.00
07:46:44 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:46:44 PM br-374a7621fc52 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:46:44 PM br-1e80adb52cbe 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 是比特。我们常说的千兆网卡、万兆网卡单位也都是比特。

    1
    ethtool eth1 | grep Speed 

4. 连通性和延时

使用 ping 来测试主机的连通性和延时,基于 ICMP 协议。

1
2
3
4
5
6
7
8
9
➜  [/root] ping -c3 9.135.14.255
PING 9.135.14.255 (9.135.14.255) 56(84) bytes of data.
64 bytes from 9.135.14.255: icmp_seq=1 ttl=64 time=0.647 ms
64 bytes from 9.135.14.255: icmp_seq=2 ttl=64 time=0.548 ms
64 bytes from 9.135.14.255: icmp_seq=3 ttl=64 time=0.626 ms

--- 9.135.14.255 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.548/0.607/0.647/0.042 ms
  • 第一部分,是每个 ICMP 请求的信息,包括 ICMP 序列号(icmp_seq)、TTL(生存时间,或者跳数)以及往返延时
  • 第二部分,则是三次 ICMP 请求的汇总