ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

网络中的性能指标

2021-10-03 09:02:50  阅读:274  来源: 互联网

标签:0.0 0.00 网络 接字 数据包 114.114 性能指标


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

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

网络配置
可以使用 ifconfig 或者 ip 命令,来查看网络的配置。
ifconfig 和 ip 分别属于软件包 net-tools 和 iproute2,iproute2 是 net-tools 的下一代。通常情况下它们会在发行版中默认安装。但如果你找不到 ifconfig 或者 ip 命令,可以安装这两个软件包。
以网络接口 eth0 为例,你可以运行下面的两个命令,查看它的配置和状态:

[root@iZ2zeinb1j2xz9m1rtf1eoZ ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.xxx.xxx  netmask 255.255.240.0  broadcast 172.19.xxx.xxx
        inet6 fe80::216:3eff:fe30:9f35  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:30:9f:35  txqueuelen 1000  (Ethernet)
        RX packets 9495415  bytes 5098993127 (4.7 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7903901  bytes 2255348850 (2.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@iZ2zeinb1j2xz9m1rtf1eoZ ~]# ip -s addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:16:3e:30:9f:35 brd ff:ff:ff:ff:ff:ff
    inet 172.19.xxx.xxx/20 brd 172.19.xxx.xxx scope global dynamic noprefixroute eth0
       valid_lft 306996512sec preferred_lft 306996512sec
    inet6 fe80::216:3eff:fe30:9f35/64 scope link 
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast   
    5099008045 9495510  0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    2255361816 7903968  0       0       0       0     

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 表示碰撞数据包数。

套接字信息
ifconfig 和 ip 只显示了网络接口收发数据包的统计信息,但在实际的性能问题中,网络协议栈中的统计信息,我们也必须关注。可以用 netstat 或者 ss ,来查看套接字、网络栈、网络接口以及路由表的信息。

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

# -l 表示只显示监听套接字
# -t 表示只显示 TCP 套接字
# -n 表示显示数字地址和端口(而不是名字)
# -p 表示显示进程信息
[root@iZ2zeinb1j2xz9m1rtf1eoZ ~]# ss -lnpt | head -n 3
State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port                                                                                    
LISTEN   0         128                 0.0.0.0:3306             0.0.0.0:*        users:(("docker-proxy",pid=11262,fd=4))                                        
LISTEN   0         128                 0.0.0.0:5355             0.0.0.0:*        users:(("systemd-resolve",pid=926,fd=13))    

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

当套接字处于监听状态(Listening)时,
Recv-Q 表示全连接队列的长度。
Send-Q 表示全连接队列的最大长度。

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

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

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

[root@iZ2zeinb1j2xz9m1rtf1eoZ ~]# netstat -s
...
Tcp:
    205104 active connection openings
    15716 passive connection openings
    52721 failed connection attempts
    1279 connection resets received
    3 connections established
    4733799 segments received
    4813886 segments sent out
    6259 segments retransmitted
    83 bad segments received
    1615656 resets sent
    InCsumErrors: 69
Udp:
    438278 packets received
    954 packets to unknown port received
    0 packet receive errors
    493796 packets sent
    0 receive buffer errors
    0 send buffer errors
...
[root@iZ2zeinb1j2xz9m1rtf1eoZ ~]# ss -s
Total: 223
TCP:   11 (estab 3, closed 3, orphaned 0, timewait 1)

Transport Total     IP        IPv6
RAW	  0         0         0        
UDP	  6         4         2        
TCP	  8         6         2        
INET  14        10        4        
FRAG  0         0         0    

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

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

# 数字1表示每隔1秒输出一组数据
[root@iZ2zeinb1j2xz9m1rtf1eoZ ~]# sar -n DEV 1
Linux 4.18.0-147.5.1.el8_1.x86_64 (iZ2zeinb1j2xz9m1rtf1eoZ) 	10/02/2021 	_x86_64_	(1 CPU)

04:47:54 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
04:47:55 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:47:55 PM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:47:55 PM      eth0      4.00      4.00      0.24      4.11      0.00      0.00      0.00      0.00
04:47:55 PM veth9ca5e63      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

04:47:55 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
04:47:56 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:47:56 PM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:47:56 PM      eth0      1.00      1.00      0.06      0.77      0.00      0.00      0.00      0.00
04:47:56 PM veth9ca5e63      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 ,表示比特而不是字节。我们通常提到的千兆网卡、万兆网卡等,单位也都是比特。如下你可以看到,我的 eth0 网卡就是一个千兆网卡:

$ ethtool eth0 | grep Speed 
Speed: 1000Mb/s

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

# -c3表示发送三次ICMP包后停止
$ 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=54 time=244 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=47 time=244 ms
64 bytes from 114.114.114.114: icmp_seq=3 ttl=67 time=244 ms
--- 114.114.114.114 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001msrtt min/avg/max/mdev = 244.023/244.070/244.105/0.034 ms

ping 的输出,可以分为两部分。
第一部分,是每个 ICMP 请求的信息,包括 ICMP 序列号(icmp_seq)、TTL(生存时间,或者跳数)以及往返延时。第二部分,则是三次 ICMP 请求的汇总。
比如上面的示例显示,发送了 3 个网络包,并且接收到 3 个响应,没有丢包发生,这说明测试主机到 114.114.114.114 是连通的;平均往返延时(RTT)是 244ms,也就是从发送 ICMP 开始,到接收到 114.114.114.114 回复的确认,总共经历 244ms。
小结:
用 ifconfig、netstat、ss、sar、ping 等工具,来查看这些网络的性能指标。

文章仅用于记录学习使用,如有侵权,告知删除。

标签:0.0,0.00,网络,接字,数据包,114.114,性能指标
来源: https://blog.csdn.net/m0_57133702/article/details/120586634

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有