操作系统-网络--性能指标-性能指标测量工具-ip-ss-sar

参考来源:
极客时间专栏:Linux性能优化实战

常用的网络性能指标

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

带宽,表示链路的最大传输速率,单位通常为 b/s (比特 / 秒)。

吞吐量,表示单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽限制,而吞吐量 / 带宽,也就是该网络的使用率

延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP握手延时),或一个数据包往返所需的时间(比如 RTT)。

PPS,是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响。

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

网络问题分析思路

第一步:查看网卡的配置和状态

分析网络问题的第一步,通常是查看网络接口的配置和状态。
使用 ifconfig 或者 ip命令,来查看网络的配置。我个人更推荐使用 ip 工具,因为它提供了更丰富的功能和更易
用的接口。
在这里插入图片描述
在这里插入图片描述
你可以看到,ifconfig 和 ip 命令输出的指标基本相同,只是显示格式略微不同。比如,它
们都包括了网络接口的状态标志、MTU 大小、IP、子网、MAC 地址以及网络包收发的统
计信息。

第一,网络接口的状态标志。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 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;
carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;
collisions 表示碰撞数据包数。

第二步:查询网络的连接信息

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

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

查看套接字信息

# head -n 3 表示只显示前面 3 行
# -l 表示只显示监听套接字
# -n 表示显示数字地址和端口 (而不是名字)
# -p 表示显示进程信息
$ netstat -nlp | head -n 3
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      743/rpcbind 

来自man netstat的节选

-l, --listening
       Show only listening sockets.  (These are omitted by default.)

 -a, --all
       **Show both listening and non-listening sockets.**  With the --interfaces option, show interfaces that are not up
OUTPUT       
 Recv-Q
       Established:  The count of bytes not copied by the user program connected to this socket.  Listening: Since Ker‐
       nel 2.6.18 this column contains the current syn backlog.

 Send-Q
       Established: The count of bytes not acknowledged by the remote host.  Listening: Since Kernel 2.6.18 this column
       contains the maximum size of the syn backlog.

# -l 表示只显示监听套接字
# -t 表示只显示 TCP 套接字
# -n 表示显示数字地址和端口 (而不是名字)
# -p 表示显示进程信息
$ ss -ltnp | head -n 3
State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port                                                                                    
LISTEN   0         128                 0.0.0.0:111              0.0.0.0:*        users:(("rpcbind",pid=743,fd=8))                                               
LISTEN   0         128           127.0.0.53%lo:53               0.0.0.0:*        users:(("systemd-resolve",pid=742,fd=13))

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

当套接字处于连接状态(Established)时,
Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)。
而 Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)。

当套接字处于监听状态(Listening)时,
Recv-Q 表示 syn backlog 的当前值。
而 Send-Q 表示最大的 syn backlog 值。
而 syn backlog 是 TCP 协议栈中的半连接队列长度,相应的也有一个全连接队列(accept
queue),它们都是维护 TCP 状态的重要机制。

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

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

查看协议栈统计信息

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

$ netstat -s
.
.
.
Tcp:
    21 active connection openings
    2 passive connection openings
    2 failed connection attempts
    0 connection resets received
    2 connections established
    5815 segments received
    4457 segments sent out
    0 segments retransmitted
    0 bad segments received
    8 resets sent
.
.
.
$ ss -s
Total: 736 (kernel 5967)
TCP:   16 (estab 2, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total     IP        IPv6
*	  5967      -         -        
RAW	  2         1         1        
UDP	  10        6         4        
TCP	  16        10        6        
INET	  28        17        11       
FRAG	  0         0         0   

这些协议栈的统计信息都很直观。ss 只显示已经连接、关闭、孤儿套接字等简要统计,而
netstat 则提供的是更详细的网络协议栈信息。

比如,上面 netstat 的输出示例,就展示了 TCP 协议的主动连接、被动连接、失败重试、发送和接收的分段数量等各种信息。

查看路由信息

root@ub1804:/home/xiaoyue# netstat -r
内核 IP 路由表
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         _gateway        0.0.0.0         UG        0 0          0 ens33
link-local      0.0.0.0         255.255.0.0     U         0 0          0 ens33
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
192.168.255.0   0.0.0.0         255.255.255.0   U         0 0          0 ens33

root@ub1804:/home/xiaoyue# ip route
default via 192.168.255.2 dev ens33 proto static metric 100 
169.254.0.0/16 dev ens33 scope link metric 1000 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
192.168.255.0/24 dev ens33 proto kernel scope link src 192.168.255.132 metric 100 

第三步:网络吞吐和 PPS

接下来,我们再来看看,如何查看系统当前的网络吞吐量和 PPS。在这里,我推荐使用我
们的老朋友 sar

给 sar 增加 -n 参数就可以查看网络的统计信息,比如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP 等等。执行下面的命令,你就可以得到网络接口统计信息:

# 数字 1 表示每隔 1 秒输出一组数据
$ sar -n DEV 1
root@ub1804:/home/xiaoyue# sar -n DEV 1
Linux 5.4.0-152-generic (ub1804) 	2024年05月23日 	_x86_64_	(4 CPU)
12时26分41秒     ens33      1.00      1.00      0.06      0.53      0.00      0.00      0.00      0.05
12时26分41秒   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12时26分41秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

12时26分41秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
12时26分42秒     ens33      1.00      2.00      0.06      0.63      0.00      0.00      0.00      0.06
12时26分42秒   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12时26分42秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
rxpck/s
                     Total number of packets received per second.

 txpck/s
                     Total number of packets transmitted per second.

 rxkB/s
                     Total number of kilobytes received per second.

txkB/s
                     Total number of kilobytes transmitted per second.

rxcmp/s
                     Number  of compressed packets received per second (for cslip
                     etc.).

txcmp/s
                     Number of compressed packets transmitted per second.

rxmcst/s
                     Number of multicast packets received per second.

 %ifutil
                     Utilization  percentage  of  the  network   interface.   For
                     half-duplex  interfaces, utilization is calculated using the
                     sum of rxkB/s and txkB/s as a percentage  of  the  interface
                     speed.  For  full-duplex,  this  is the greater of rxkB/S or
                     txkB/s.

这儿输出的指标比较多,我来简单解释下它们的含义。
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 ,表示比特(bit)而不是字节(Byte)。我们通常提到的千兆网卡、万兆网卡等,单位也都是比特。如下你可以看到,我的 eth0 网卡就是一个十兆网卡(vmware上的虚拟机网卡):

root@ub1804:/home/xiaoyue# ethtool ens33 | grep Speed
	Speed: 10Mb/s

最后: 连通性和延时

最后,我们通常使用 ping ,来测试远程主机的连通性和延时,而这基于 ICMP 协议。

# -c3 表示发送三次 ICMP 包后停止
$ ping -c3 114.114.114.114
root@ub1804:/home/xiaoyue# 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=128 time=20.8 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=128 time=20.8 ms
64 bytes from 114.114.114.114: icmp_seq=3 ttl=128 time=21.1 ms

--- 114.114.114.114 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2005ms
rtt min/avg/max/mdev = 20.847/20.958/21.129/0.170 ms

ping 的输出,可以分为两部分。
第一部分,是每个 ICMP 请求的信息,包括 ICMP 序列号(icmp_seq)、TTL(生存时间,或者跳数)以及往返延时。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值