文章内容为学习整理笔记,绝大部分来源于 倪朋飞 老师的 Linux性能优化实战

一、Linux 网络性能指标

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

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

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

二、网络配置

ifconfig 或者 ip 命令,通常是用来查看网络接口的配置和状态。
以网络接口 eth0 为例,运行下面的两个命令,查看它的配置和状态:

[root@cp-3 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.0.0.14  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::f816:3eff:fedf:4c47  prefixlen 64  scopeid 0x20<link>
        ether fa:16:3e:df:4c:47  txqueuelen 1000  (Ethernet)
        RX packets 1182511  bytes 1170595408 (1.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1228469  bytes 240313471 (229.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@cp-3 ~]# ip -s a show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:df:4c:47 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.14/24 brd 10.0.0.255 scope global dynamic eth0
       valid_lft 56381sec preferred_lft 56381sec
    inet6 fe80::f816:3eff:fedf:4c47/64 scope link 
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast   
    1170595974 1182518  0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    240314609  1228474  0       0       0       0    

  你可以看到,ifconfig 和 ip 命令输出的指标基本相同,只是显示格式略微不同。比如,它们都包括了网络接口的状态标志、MTU 大小、IP、子网、MAC 地址以及网络包收发的统计信息。
 v这些具体指标的含义,在帮助文档中都有详细的说明,不过,这里有几个跟网络性能密切相关的指标,需要特别关注一下。
  第一,网络接口的状态标志。ifconfig 输出中的 RUNNING ,或 ip 输出中的 LOWER_UP ,都表示物理网络是连通的,即网卡已经连接到了交换机或者路由器中。如果你看不到它们,通常表示网线被拔掉了。
  第二,MTU 的大小。MTU 默认大小是 1500,根据网络架构的不同(比如是否使用了 VXLAN 等叠加网络),你可能需要调大或者调小 MTU 的数值。
  第三,网络接口的 IP 地址、子网以及 MAC 地址。这些都是保障网络功能正常工作所必需的,你需要确保配置正确。
  第四,网络收发的字节数、包数、错误数以及丢包情况,特别是 TX(发送,transport) 和 RX(接收,receive) 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示出现了网络 I/O 问题。其中:

• errors:表示发生错误的数据包数,比如校验错误、帧同步错误等;
• dropped:表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包;
• overruns:表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;
• carrier:表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;
• collisions:表示碰撞数据包数。

三、套接字

  netstat 或者 ss ,通常用来查看套接字、网络栈、网络接口以及路由表的信息。netstat 和 ss 分别属于软件包 net-tools 和 iproute。

[root@cp-3 ~]# netstat -ntlp | head -4
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 10.0.0.14:8300          0.0.0.0:*               LISTEN      3112/consul         
tcp        0      0 10.0.0.14:8301          0.0.0.0:*               LISTEN      3112/consul   

[root@cp-3 ~]# ss -ntlp | head -4
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128    10.0.0.14:8300                     *:*                   users:(("consul",pid=3112,fd=6))
LISTEN     0      128    10.0.0.14:8301                     *:*                   users:(("consul",pid=3112,fd=12))
LISTEN     0      128    10.0.0.14:8302                     *:*                   users:(("consul",pid=3112,fd=8))

以上两个命令使用选项含义一致:
-n: 表示不做名字解析,显示数字地址和端口而不是名字
-t: 表示只显示 TCP 套接字
-l:表示只显示监听套接字
-p: 表示显示进程信息

  netstat 和 ss 的输出也是类似的,都展示了套接字的状态、接收队列、发送队列、本地地址、远端地址、进程 PID 和进程名称等。
  其中,接收队列(Recv-Q)和发送队列(Send-Q)需要特别关注,它们通常应该是 0。当你发现它们不是 0 时,说明有网络包的堆积发生。当然还要注意,在不同套接字状态下,它们的含义不同。
  当套接字处于连接状态(Established)时:

• Recv-Q:接收队列长度,表示收到的数据在套接字缓冲中还没有被应用程序取走。
• Send-Q:发送队列长度,表示对方没有收到的数据或者说还没有被远端主机确认,还在本地缓冲区中。

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

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

  如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。这两个值通常应该为0,如果不为0可能是有问题的。
  所谓全连接,是指服务器收到了客户端的 ACK,完成了 TCP 三次握手,然后就会把这个连接挪到全连接队列中。这些全连接中的套接字,还需要被 accept() 系统调用取走,服务器才可以开始真正处理客户端的请求。
  与全连接队列相对应的,还有一个半连接队列。所谓半连接是指还没有完成 TCP 三次握手的连接,连接只进行了一半。服务器收到了客户端的 SYN 包后,就会把这个连接放到半连接队列中,然后再向客户端发送 SYN+ACK 包。

四、网络协议栈

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

[root@cp-3 ~]# netstat -s
......
Tcp:
    317542 active connections openings
    17 passive connection openings
    214221 failed connection attempts
    0 connection resets received
    7 connections established
    3183710 segments received
    3297690 segments send out
    13 segments retransmited
    0 bad segments received.
    128552 resets sent
......

[root@cp-3 ~]# ss -s
Total: 313 (kernel 396)
TCP:   21 (estab 7, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total     IP        IPv6
*     396       -         -        
RAW   0         0         0        
UDP   11        7         4        
TCP   21        15        6        
INET      32        22        10       
FRAG      0         0         0        

  ss 只显示已经连接、关闭、孤儿套接字等简要统计,而 netstat 则提供的是更详细的网络协议栈信息。
  比如,上面 netstat 的输出示例,就展示了 TCP 协议的主动连接、被动连接、失败重试、发送和接收的分段数量等各种信息。

五、网络吞吐和PPS

  查看系统当前的网络吞吐量和 PPS, 一般用sar。给 sar 增加 -n 参数就可以查看网络的统计信息,比如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP 等等。sar 需要 sysstat 软件包

[root@cp-3 ~]# sar -n DEV 1 1
Linux 3.10.0-957.21.3.el7.x86_64 (cp)   08/11/2021  _x86_64_    (1 CPU)

03:07:02 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
03:07:03 PM      eth0     21.00     17.00      1.46     12.54      0.00      0.00      0.00      0.00
03:07:03 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:         eth0     21.00     17.00      1.46     12.54      0.00      0.00      0.00      0.00
Average:           lo      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 ,表示比特而不是字节。我们通常提到的千兆网卡、万兆网卡等,单位也都是比特。但是查询的网卡需要支持这种方式,虚拟机一般都不行。
  如下,这是一个万兆网卡。

[root@controller ~]# ethtool eth0 | grep -i speed
    Speed: 10000Mb/s

发表评论

验证码: 6 + 4 =