Linux 网络性能监控与故障排查终极宝典

Linux 网络性能监控与故障排查终极宝典

在完成了对 CPU 性能的分析后,网络是另一个常见的系统性能瓶颈。无论是应用程序响应缓慢,还是文件传输速度不达标,都可能与网络 I/O 有关。本章将详细介绍衡量网络性能的核心指标,并深入每一个您提到的命令行工具,确保覆盖所有细节,助您全面监控、分析和排查网络问题。

第一部分:网络性能核心指标

在深入工具之前,我们首先需要理解衡量网络性能的几个核心指标。

  • 带宽 (Bandwidth):表示网络链路的最大传输速率,是物理上的一个极限值,单位通常是 b/s (比特每秒) 或 bps。
  • 吞吐量 (Throughput):指单位时间内成功传输的数据量,单位通常是 b/s 或 B/s (字节每秒)。吞吐量会受到带宽的限制,吞吐量 / 带宽 的结果就是网络的利用率。
  • 延时 (Latency):指从网络请求发出后,一直到收到远端响应所需要的时间延迟。这是衡量网络响应速度的关键。
  • PPS (Packets Per Second):指以网络包为单位的传输速率。PPS 主要用来评估网络的转发能力,尤其是对于交换机、路由器等网络设备。
    • 硬件交换机通常可以达到线性转发(即 PPS 接近理论最大值)。
    • 而基于 Linux 服务器的软件转发,其 PPS 容易受到网络包大小的影响。

此外,并发连接数丢包率重传率 等也是评估网络性能和健康度的常用指标。


第二部分:网络接口配置与状态

要排查网络问题,第一步通常是检查网络接口(网卡)的配置和状态。

使用 ifconfigip 查看网络信息

你可以使用传统的 ifconfig 或更现代的 ip 命令来查看网络配置。 在查看输出时,需要重点关注以下几点:

  1. 网络接口的状态标志ifconfig 输出中的 RUNNINGip 输出中的 LOWER_UP 都表示物理链路是连通的(即网卡已连接到交换机或路由器)。 如果看不到这些标志,通常意味着网线被拔掉或物理连接存在问题。
  2. MTU (最大传输单元):默认为 1500 字节。
  3. IP 地址、子网掩码、MAC 地址:这些是保障网络功能正常的基础,需要确保配置正确。
  4. 网络收发统计信息:检查接收(RX)和发送(TX)的字节数、包数、错误数和丢包情况。 当以下指标不为 0 时,通常表示出现了网络 I/O 问题:
    • errors: 表示发生了错误的数据包数,例如 CRC 校验错误、帧同步错误等。
    • dropped: 表示被丢弃的数据包数。这通常指数据包已经到达网卡的 Ring Buffer,但由于系统内存不足等原因被丢弃。
    • overruns: 表示超限数据包数。这通常是因为网络 I/O 速度过快,导致 Ring Buffer 已满,系统来不及处理而导致的丢包。
    • carrier: 表示发生了载波错误的数据包数,例如双工模式不匹配、物理电缆故障等。
    • collisions: 表示碰撞的数据包数,这在半双工网络中比较常见。

ip 命令详解

ip 是现代 Linux 系统中用于替代 ifconfigroute 等传统命令的强大工具。

基本语法
ip [OPTIONS] OBJECT {COMMAND | help}
  • OBJECT: 你要操作的对象,如 link (网络接口), addr (IP 地址), route (路由表), neigh (ARP 缓存)。
  • COMMAND: 要执行的动作,如 add (添加), del (删除), show (显示), flush (清空)。
  • OPTIONS:
    • -s (统计信息)
    • -4 (仅 IPv4)
    • -6 (仅 IPv6)
    • -j (JSON 格式输出)
1. 查看网络接口(网卡)
ip link show          # 查看所有网卡
ip -s link show eth0  # 查看 eth0 的统计信息(流量、错误等)
ip link set eth0 up   # 启用网卡 eth0
ip link set eth0 down # 禁用网卡 eth0
2. 查看和管理 IP 地址
ip addr show                         # 查看所有 IP 地址
ip addr add 192.168.1.100/24 dev eth0 # 给 eth0 添加 IP
ip addr del 192.168.1.100/24 dev eth0 # 删除 eth0 的 IP
3. 查看和管理路由表
ip route show                                    # 查看路由表
ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0 # 添加路由
ip route del 192.168.2.0/24                        # 删除路由
ip route get 8.8.8.8                               # 查看访问 8.8.8.8 的路由路径
4. 查看和管理 ARP 缓存(IP ↔ MAC 映射)
ip neigh show           # 查看 ARP 表(类似 `arp -a`)
ip neigh flush dev eth0 # 清空 eth0 的 ARP 缓存
5. 其他常用操作
ip -s -j addr show  # 以 JSON 格式显示 IP 信息(带统计)
ip -4 addr show     # 仅显示 IPv4 地址
ip -6 addr show     # 仅显示 IPv6 地址
总结
功能 命令
查看网卡 ip link show
管理 IP ip addr add/del/show
管理路由 ip route add/del/show
管理 ARP ip neigh show/flush

推荐使用 ip 替代 ifconfig/route/arp,它是现代 Linux 网络管理的标准工具!


第三部分:套接字与连接分析

网络接口没问题后,就需要进一步分析网络连接和套接字的状态。可以使用 netstat 或者 ss 来查看套接字信息,ss 命令的查询速度通常比 netstat 更快

ss 命令详解 (Socket Statistics)

ssnetstat 的高效替代品,它直接从内核读取信息,查询速度极快,特别适用于高并发服务器。

基本语法
ss [选项] [过滤条件]
常用选项
选项 说明
-t 显示 TCP 套接字
-u 显示 UDP 套接字
-l 仅显示 监听(LISTEN) 的套接字
-a 显示 所有(监听+非监听)套接字
-n 数字形式 显示 IP/端口(不解析域名)
-p 显示 进程信息(需 root 权限)
-s 显示 统计摘要(如连接数)
-4 仅显示 IPv4
-6 仅显示 IPv6
-o 显示 TCP 计时器信息(如超时时间)
常用过滤条件
过滤条件 说明
state <状态> 按连接状态过滤(如 established
src 源地址 过滤
dst 目标地址 过滤
sport = :端口 源端口 过滤
dport = :端口 目标端口 过滤
Recv-Q 和 Send-Q 的含义

ss 输出中的 Recv-QSend-Q 这两列的含义取决于套接字的状态:

  • 当套接字处于连接状态 (Established):

    • Recv-Q: 表示套接字缓冲还没有被应用程序取走的字节数 (即接收队列长度)。
    • Send-Q: 表示还没有被远端主机确认的字节数 (即发送队列长度)。
  • 当套接-字处于监听状态 (Listen):

    • Recv-Q: 表示当前的全连接队列的长度。
  • Send-Q: 表示全连接队列的最大长度。

半连接与全连接队列: 所谓全连接,是指完成了 TCP 三次握手,然后把这个连接挪到全连接队列中,之后还需要被 accept() 系统调用取走。而半连接队列,是指三次握手还没完成,服务器收到了客户端的 SYN 后,就会把这个连接放到半连接队列中,然后再向客户端发送 SYN+ACK 包。

常见用法示例
(1) 查看所有 TCP 连接
ss -t -a      # 显示所有 TCP 套接字(监听+活跃)

输出示例

State      Recv-Q Send-Q Local Address:Port  Peer Address:Port
ESTAB      0      0      192.168.1.2:22      10.0.0.3:45678
LISTEN     0      128    *:80                *:*
(2) 查看所有监听中的端口
ss -tuln      # 显示所有 TCP/UDP 监听端口(数字格式)
(3) 查看进程占用端口
sudo ss -tulnp  # 显示监听端口及进程名/PID

输出示例

tcp  LISTEN 0 128 *:22  *:* users:(("sshd",pid=1234,fd=3))
tcp  LISTEN 0 100 *:80  *:* users:(("nginx",pid=5678,fd=6))
(4) 按状态过滤连接
ss -t state established  # 仅显示已建立的 TCP 连接
ss -t state time-wait    # 仅显示 TIME-WAIT 状态的连接

支持的 TCP 状态establishedsyn-sentsyn-recvfin-wait-1fin-wait-2time-waitclosedclose-waitlast-acklisteningclosed

(5) 按 IP 或端口过滤
ss -t src 192.168.1.1                    # 显示来自 192.168.1.1 的连接
ss -t dst 8.8.8.8                        # 显示目标为 8.8.8.8 的连接
ss -t sport = :80                        # 显示源端口为 80 的连接
ss -t dport = :443                       # 显示目标端口为 443 的连接
ss -t '( dport = :80 or dport = :443 )' # 组合条件
(6) 查看网络统计摘要
ss -s       # 显示连接数统计

输出示例

Total: 256 (kernel 0)
TCP:   45 (estab 10, closed 20, orphaned 0, timewait 15)
UDP:   8
RAW:   1
FRAG:  0
(7) 查看 UNIX 域套接字(进程间通信)
ss -x       # 显示所有 UNIX 域套接字
ss -xp      # 显示 UNIX 域套接字及进程

第四部分:网络活动与流量监控

sar 命令详解

sar (System Activity Reporter) 不仅能监控 CPU,还能出色地监控网络流量,特别适用于长期性能分析和故障排查。通过 -n 参数可以查看网络统计信息,比如网络接口(DEV), 网络接口错误(EDEV), TCP, UDP 等。

基本语法
sar [选项] [间隔时间] [次数]
常用选项
选项 说明
-A 显示所有统计信息
-u 显示 CPU 使用率
-r 显示内存使用情况
-b 显示 I/O 和传输速率
-d 显示磁盘活动
-n 显示网络统计(如 -n DEV 查看网卡流量)
-q 显示系统负载和任务队列
-P 显示指定 CPU 核心的统计(如 -P ALL
-s 指定开始时间(格式:HH:MM:SS)
-e 指定结束时间
常见用法示例
(1) 实时监控 CPU 使用率
sar -u 1 5    # 每隔 1 秒刷新一次,共 5 次
(2) 查看网络流量

sar -n DEV 1 可以得到网络接口的实时统计信息。

sar -n DEV 1 2    # 监控网卡流量(每秒刷新,共 2 次)

输出示例

10:30:01 AM  IFACE  rxpck/s  txpck/s  rxkB/s  txKB/s  rxcmp/s  txcmp/s  %ifutil
10:30:02 AM  eth0   125.67   98.23    15.12   10.45   0.00     0.00     0.01

输出指标含义:

  • rxpck/stxpck/s: 分别是接收和发送的 PPS,单位为包/秒。
  • rxkB/stxkB/s: 分别是接收和发送的吞吐量,单位是 KB/秒。
  • rxcmp/stxcmp/s: 分别是接收和发送的压缩数据包数,单位是包/秒。
  • %ifutil: 是网络接1口的使用率。半双工模式为 (rxkB/s + txkB/s) / Bandwidth,全双工为 max(rxkB/s, txkB/s) / Bandwidth
(3) 查看历史数据

sar 默认会保存历史数据(通常位于 /var/log/sa/),可通过 -f 指定日志文件:

sar -u -f /var/log/sa/sa15    # 查看 15 号的历史 CPU 数据

第五部分:网络诊断与测试工具

ping 命令详解

ping 是网络诊断中最基础、最常用的工具,用于 测试主机之间的网络连通性。它通过发送 ICMP 回显请求并等待回显应答来工作。

基本语法
ping [选项] 目标主机或IP
常用选项
选项 说明
-c <次数> 指定发送的 ICMP 请求次数(默认无限)
-i <秒> 设置发送间隔时间(默认 1 秒)
-s <字节> 设置数据包大小(默认 56 字节)
-t 设置数据包的生存时间(TTL)
-W <秒> 设置等待响应的超时时间
-q 只显示最终统计结果(安静模式)
-v 显示更详细的输出
-4 / -6 强制使用 IPv4 / IPv6
常见用法示例
(1) 基本连通性测试
ping google.com

输出示例

PING google.com (142.250.190.46) 56(84) bytes of data.
64 bytes from 142.250.190.46: icmp_seq=1 ttl=117 time=12.3 ms
64 bytes from 142.250.190.46: icmp_seq=2 ttl=117 time=11.8 ms
...
--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 11.8/12.5/13.5/0.7 ms
  • time: 往返延迟 (RTT)。 按 Ctrl + C 终止测试。
(2) 指定发送次数
ping -c 4 baidu.com    # 发送 4 次 ICMP 请求

nc (Netcat) 命令详解

nc 被称为 “网络瑞士军刀”,可用于端口扫描、数据传输、网络调试等。

基本语法
nc [选项] [主机] [端口]
常用选项
选项 说明
-l 监听模式(服务端)
-v 显示详细输出(-vv 更详细)
-n 直接使用 IP,不解析 DNS
-u 使用 UDP(默认 TCP)
-p 指定本地端口
-z 端口扫描模式(不发送数据)
-w 设置超时时间(秒)
-e 执行命令(危险,常用于反向 Shell)
常见用法示例
(1) 端口扫描
# 验证服务器端口有没有开
nc -vw ip port

# 扫描 22, 80, 443 端口
nc -zv 192.168.1.1 22 80 443
(2) 文件传输

接收文件(服务端)

nc -lvnp 1234 > received_file.txt

发送文件(客户端)

nc 目标IP 1234 < send_file.txt
(3) 测试网络吞吐量
# A 机器 (接收端)
nc -l 9999 > /dev/null

# B 机器 (发送端)
nc <A机器IP> 9999 < /dev/zero

# 在 A 机器上用 sar 监控网络
sar -n DEV 1
(4) 启动监听端口
nc -l 9999      # 开启本地 9999 的 TCP 端口,由客户端主动发起连接
nc -ul 9999     # 开启一个本地 9999 的 UDP 协议端口

第六部分:其他实用工具

  • tcpdump: 强大的命令行抓包工具,通常将抓包结果保存为 .pcap 文件,然后使用 Wireshark 进行图形化分析。
  • nload : 基于终端的 实时网络流量监控工具,可以直观地显示 网卡的上传/下载速度,适合快速查看网络带宽使用情况。
  • lsof: 列出系统打开的文件。使用 lsof -i:9999 可以查看是哪个进程占用了 9999 端口。
  • iptraf-ng: 一个功能强大的、基于 Ncurses 的实时网络监控工具。
  • glances: 一款美观且信息全面的跨平台系统监控工具,其界面也包含了网络 I/O 的信息。
  • tail: 通过监控应用日志(如 Nginx access log)可以分析网络请求的来源、频率和状态码,是排查应用层网络问题的利器。

你可能感兴趣的:(linux,linux,网络,运维,服务器)