《服务器网络出问题了?到底应该如何观察》- 散开迷雾篇
核心点:如何观察网络性能?哪些指标可以用来衡量 Linux 的网络性能呢?
性能指标
实际上,我们通常用带宽、吞吐量、延时、PPS(Packet Per Second)等指标衡量网络的性能。
-
带宽:最大传输速率,单位通常为 M/s 等
-
吞吐量:单位时间内成功传输的数据量
-
延时:网络请求发出后,一直到收到远端响应,所需要的时间
-
PPS:是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。 除了这些指标,网络的可用性(网络能否正常通信)、并发连接数(TCP 连接数量)、丢包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标。
有了一些基本印象后,接下来知行合一,动手一起观测这些性能指标吧
网络配置
分析网络问题第一步,通常是查看网络接口的配置和状态。可以使用 ifconfig 或者 ip 命令,来查看网络的配置。
以网络接口 eth0 为例,你可以运行下面的两个命令,查看它的配置和状态:
$ ifconfig eth0
$ ip -s addr show dev eth0
这两个命令输出的指标基本相同,都包括了网络接口的状态标志、MTU 大小、IP、子网、MAC 地址以及网络包收发的统计信息。
里面需要特别关注的内容
第一:网络接口的状态标志。ifconfig 输出中的 RUNNING ,或 ip 输出中的 LOWER_UP ,都表示物理网络是连通的,否则表示网线可能被拔掉了
第二:MTU 的大小。MTU 默认大小是 1500, 该值控制了网络包的大小,过大的网络包会切分分片,感兴趣的可以看我的上一篇文章温习一下
第三,网络接口的 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 只显示了网络接口收发数据包的统计信息,但在实际的性能问题中,网络协议(TCP/IP 协议)栈中的统计信息,我们也必须关注。
这儿推荐两个命令 netstat 或者 ss
# head -n 3 表示只显示前面3行
# -l 表示只显示监听套接字
# -n 表示显示数字地址和端口(而不是名字)
# -p 表示显示进程信息
$ netstat -nlp | head -n 3
# 同上
# -t 表示只显示 TCP 套接字
$ ss -ltnp | head -n 3
netstat 和 ss 的输出也是类似的, 都展示了套接字的状态、接收队列、发送队列、本地地址、远端地址、进程 PID 和进程名称等。
不过我更推荐 ss,因为它比 netstat 提供了更好的性能(速度更快)。
需要特别关注接收队列(Recv-Q)和发送队列(Send-Q),套接字不同状态下,它们的含义不同:
当套接字处于连接状态(Established)时:
-
Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)。
-
Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)。
当套接字处于监听状态(Listening)时,
-
Recv-Q 表示全连接队列的长度。
-
而 Send-Q 表示全连接队列的最大长度。
解释一下名词含义,所谓全连接就是所有了完成三次握手的TCP连接。
总结
本文介绍了如何观察Linux系统的网络性能。并列出了一些常用的网络性能指标,如带宽、吞吐量、延时和PPS(每秒传输的包数)。
还提供了对应指标的命令比如 ipconfig、ip、nestat、ss,这样日常工作中也 可以知道观察哪些内容,多应用在平日的实战中,熟能生巧,成为别人口中的大神也是指日可待
关注我,更新更多 linux 相关的知识。
实战、性能优化、线上问题定位,让你无往不胜,