文章目录
- 性能指标
- 查看网络配置:ifconfig 和 ip
- 查看套接字信息:netstat 和 ss
- 查看协议栈的统计信息:netstat
- 网络吞吐量和PPS
- 连通性和延时
- 参考文献
性能指标
实际上,我们通常用带宽、吞吐量、延时、PPS等指标衡量网络的性能:
- 带宽:表示链路最大的传输速率,单位(b/s)
- 吞吐量:表示单位时间成功传输的数据量,单位(b/s)。一般来说,吞吐量/带宽,也就是该网络的使用率
- 延时:表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟
- PPS:packet per sencond(包/秒)的缩写,表示以网络包为单位的传输速率。
这些指标只是基本的,除了这些指标之外:网络可用性、并发连接数、丢包率、重传率也是常用的性能指标。
查看网络配置:ifconfig 和 ip
分析网络性能的第一步是查看网络接口的配置和状态。我们可用使用ifconfig
或者ip
命令来查看网络配置。
现在我们演示一下ip命令查看eth0端口的信息:
ubuntu@VM-0-2-ubuntu:~/libco/libco$ ip -s addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:88:37:58 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/20 brd 172.17.15.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe88:3758/64 scope link
valid_lft forever preferred_lft forever
RX: bytes packets errors dropped overrun mcast
2830321820 23061948 0 0 0 0
TX: bytes packets errors dropped carrier collsns
3649280587 21806912 0 0 0 0
在这里面有几个比较重要的指标需要我们关注一下:
- 网络接口的状态标志:在第一行,ip命令显示当前的状态是
LOWER_UP
,其表示当前状态是联通的;如果不是这个值,通常都是网络被拔掉了 - MTU的大小:还是在第一行,有一个
mtu 1500
,表示当前mtu的大小 - 网络接口的IP地址:在第三行和第五行分别显示了当前机器的IPv4地址:
172.17.0.2/20
和IPv6地址:fe80::5054:ff:fe88:3758/64
- 网络收发的字节数、包数、错误数以及丢包情况:在第七行和第九行,特别是TX和RX部分
4.1 errors:表示发生错误的数据包数
4.2 dropped:表示丢弃的数据包数
4.3 overrun:表示超限数据包数
4.4 carrier:表示发生carrier错误的数据包数
4.5 collisions:表示发生碰撞的数据包数
查看套接字信息:netstat 和 ss
除了ifconfig和ip显示的网络接口收发数据包的统计信息外,网络协议栈中的统计信息也非常值得我们关注。
我们可用使用netstat
或者 ss
来查看套接字、网络栈、网络接口以及路由表信息。
以下是使用ss来查询网络连接信息的例子:
# -l表示只显示监听套接字
# -t表示只显示TCP套接字
# -n表示只显示数字地址和端口
# -p表示显示进程信息
ubuntu@VM-0-2-ubuntu:~/libco/libco$ ss -ltnp | head -n 3
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:43719 0.0.0.0:* users:(("node",pid=29762,fd=18))
LISTEN 0 128 127.0.0.1:6379 0.0.0.0:*
- State:套接字当前状态
- Recv-Q:接受队列
- Send-Q:发送队列
- Local Address:Port:本机地址
- Peer Address:Port:远端地址
其中我们需要特别关注Recv-Q
和 Send-Q
这两个队列,它们通常是0。如果它们不是0时,说明有网络包的堆积发生。当然,还要注意,在不同套接字状态下,它们的含义不同:
- 当套接字处于连接状态 established:
1.1 Recv-Q表示套接字缓冲还没被应用程序取走的字节数,即接受队列长度
1.2 Send-Q表示还没有被远端主机确认的字节数,即发送队列长度 - 当套接字处于监听状态 listen:
2.1 Recv-Q表示全连接队列的长度
2.2 Send-Q表示全连接队列的最大长度
博主说:
全连接队列也是就TCP三次握手中,服务端在收到客户端最后一个ACK报文后,保存这个连接的队列。
查看协议栈的统计信息:netstat
类似,使用netstat可用查看协议栈的统计信息。这里使用的是netstat,因为比较详细:
# -s表示查看协议栈信息
ubuntu@VM-0-2-ubuntu:~/libco/libco$ netstat -s
# 篇幅较长,就显示部分
Ip:
Forwarding: 1
39262312 total packets received
2 with invalid addresses
0 forwarded
9 with unknown protocol
0 incoming packets discarded
39262300 incoming packets delivered
38464838 requests sent out
2 reassemblies required
1 packets reassembled ok
Icmp:
1400109 ICMP messages received
743 input ICMP message failed
InCsumErrors: 1
ICMP input histogram:
destination unreachable: 1934
timeout in transit: 64
echo requests: 1398094
echo replies: 10
timestamp request: 6
1421145 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 23045
echo replies: 1398094
timestamp replies: 6
......
网络吞吐量和PPS
对于网络吞吐量和PPS,我们可用使用sar
命令来查看网络统计信息:
# -n 参数表示查看网络信息
# DEV 表示网络接口
# 1 表示每隔一秒输出一组数据
ubuntu@VM-0-2-ubuntu:~/libco/libco$ sar -n DEV 1
Linux 4.15.0-140-generic (VM-0-2-ubuntu) 05/25/2021 _x86_64_ (2 CPU)
01:44:58 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
01:44:59 PM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:44:59 PM lo 18.00 18.00 1.21 1.21 0.00 0.00 0.00 0.00
01:44:59 PM eth0 30.00 79.00 2.13 96.15 0.00 0.00 0.00 0.00
这里有几个指标值得我们重点关注一下:
- rxpck/s:接受的PPS,单位(包/秒)
- txpck/s:发送的PPS,单位(包/秒)
- rxkB/s:接受的吞吐量,单位(KB/s)
- txkB/s:发送的吞吐量,单位(KB/s)
- rxcmp/s:接受的压缩数据包数,单位(包/秒)
- txcmp/s:发送的压缩数据包数,单位(包/秒)
- %ifutil:网络接口的使用率
连通性和延时
一般来说,我们都会使用ping
命令查看我们是否能和网络远程主机连通,这通常基于ICMP协议。
那么,你们是否知道,ping的各部分显示的含义呢?
# -c3 表示发送三次ICMP包后停止
ubuntu@VM-0-2-ubuntu:~/libco/libco$ ping -c3 www.baidu.com
PING www.a.shifen.com (180.101.49.11) 56(84) bytes of data.
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=1 ttl=49 time=9.55 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=2 ttl=49 time=9.44 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=3 ttl=49 time=9.45 ms
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 9.442/9.484/9.559/0.095 ms
ping的输出,一般来说可以分为两个部分:
- 第一部分,是每个ICMP请求的信息,包括序列号icmp_seq,TTL生存时间以及往返延时
- 第二部分,则是三次ICMP请求的汇总
参考文献
[1] 倪朋飞.Linux性能优化实战.极客时间