实际上通常用带宽、吞吐量、延时、PPS(Packet Per Second)等指标衡量网络的性能
除了这些指标,网络的可用性(网络能否正常通信)、并发连接数(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
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)时
当套接字处于监听状态(Listening)时
而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?
推荐使用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
各个指标含义
其中,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的输出,可以分为两部分
比如上面的示例显示,发送了3个网络包,并且接收到3个响应,没有丢包发生
这说明测试主机到114.114.114.114 是连通的
平均往返延时(RTT)是27.319ms,
也就是从发送ICMP开始,到接收到114.114.114.114回复的确认,总共经历27.319ms
通常使用带宽、吞吐量、延时等指标,来衡量网络的性能
可以用ifconfig、netstat、ss、sar、ping等工具,来查看这些网络的性能指标