网络性能指标
- 带宽,链路的最大传输速率,单位通常为 b/s
- 吞吐量,单位时间内成功传输的数据量,单位通常为 b/s,或 B/s。吞吐量受带宽限制,吞吐量/带宽=网络的使用率
- 延时,从网络请求发出后,一直收到远端响应,所需的时间延迟
- PPS,Packet Per Second(包/秒),以网络包为单位的传输速率,通常用来评估网络的转发能力
此外,网络的可用性、并发连接数(TCP 连接数量)、丢包率、重传率等也是常用的性能指标。
网络配置
$ ifconfig enp0s8
enp0s8 Link encap:Ethernet HWaddr 08:00:27:40:31:81
inet addr:192.168.57.3 Bcast:192.168.57.255 Mask:255.255.255.0
inet6 addr: fe80::6f67:8e57:5e6b:d276/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:68 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1559 (1.5 KB) TX bytes:8118 (8.1 KB)
- 网络接口的状态标志。RUNNING 表示物理网络是连通的。
- MTU 大小。默认是 1500。
- 网络接口的 IP 地址、子网及 MAC 地址。这些是保证网络功能正常工作的必需。
- 网络收发的字节数、包数、错误数及丢包情况,特别是 TX 和 RX 部分的 errors、dropped、overrunns、carrier 及
collisions 等指标不为 0 时,通常表示出现了网络 I/O 问题,其中: - errors 表示发生错误的数据包数,如校验错误、帧同步错误等;
- dropped 表示丢弃的数据包数,及数据包已经收到了 Ring Buffer,但因内存不足等原因丢包;
- overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理处理(队列满)而导致的丢包。
- carrier 表示发生 carrirer 错误的数据包数,如双工模式不匹配、物理电缆出现问题等;
- collisions 表示碰撞数据包数。
套接字信息
ss 比 netstat 速度更快。
# head -n 3 表示只显示前面 3 行
# -l 表示只显示监听套接字
# -t 表示只显示 TCP 套接字
# -n 表示显示数字地址和端口 (而不是名字)
# -p 表示显示进程信息
$ ss -ltnp | head -n 3
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=840,fd=13))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1459,fd=3))
会显示套接字的状态、接收队列、发送队列、本地地址、远端地址、进程 PID 和进程名称等。
接收队列(Recv-Q)和发送队列(Send-Q)通常应该是 0,不是 0 时说明有网络包的堆积。需注意,在不同套接字状态下,它们的含义不同。
当套接字处于连接状态(Established):
- Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数。
- Send-Q 表示还没有被远端主机确认的字节数。
当套接字处于监听状态时(Listening):
- Recv-Q 表示 syn backlog 当前的值。
- Send-Q 表示最大的 syn backlog 值。
协议栈统计信息
netstat -s
...
Tcp:
3244906 active connection openings
23143 passive connection openings
115732 failed connection attempts
2964 connection resets received
1 connections established
13025010 segments received
17606946 segments sent out
44438 segments retransmitted
42 bad segments received
5315 resets sent
InCsumErrors: 42
...
$ ss -s
Total: 186 (kernel 1446)
TCP: 4 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 1446 - -
RAW 2 1 1
UDP 2 2 0
TCP 4 3 1
...
ss 只显示已经连接、关闭、孤儿套接字等简要统计,而 netstat 还展示了 TCP 协议的主动连接、被动连接、失败重试、发送和接收的分段数量等各种信息。
网络吞吐和 PPS
# 数字 1 表示每隔 1 秒输出一组数据
$ sar -n DEV 1
Linux 4.15.0-1035-azure (ubuntu) 01/06/19 _x86_64_ (2 CPU)
13:21:40 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
13:21:41 eth0 18.00 20.00 5.79 4.25 0.00 0.00 0.00 0.00
13:21:41 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
13:21:41 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- rxpck/s 和 txpsk/s 为接收和发送的 PPS,包/秒
- rxkB/s 和 txkB/s 为接收和发送的吞吐量,KB/秒
- rxcmp/s 和 txcmp/s 为接收和发送的压缩数据包数,包/秒
- %ifutil 为网络接口的使用率,即半双工模式下为 (rxkB/s + txkB/s) / Bandwith,而全双工模式下为 max(rxkB/s, txkB/s) / Bandwidth,Bandwith 可用 ethtool 查询
$ ethtool eth0 | grep Speed
Speed: 1000Mb/s
为千兆网卡
连通性和延时
# -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 2001ms
rtt min/avg/max/mdev = 244.023/244.070/244.105/0.034 ms
- 第一部分是每个 ICMP 请求的信息
- 第二部分是三次 ICMP 请求的汇总
参考
倪朋飞. Linux 性能优化实战.