在完成了对 CPU 性能的分析后,网络是另一个常见的系统性能瓶颈。无论是应用程序响应缓慢,还是文件传输速度不达标,都可能与网络 I/O 有关。本章将详细介绍衡量网络性能的核心指标,并深入每一个您提到的命令行工具,确保覆盖所有细节,助您全面监控、分析和排查网络问题。
在深入工具之前,我们首先需要理解衡量网络性能的几个核心指标。
吞吐量 / 带宽
的结果就是网络的利用率。此外,并发连接数、丢包率、重传率 等也是评估网络性能和健康度的常用指标。
要排查网络问题,第一步通常是检查网络接口(网卡)的配置和状态。
ifconfig
或 ip
查看网络信息你可以使用传统的 ifconfig
或更现代的 ip
命令来查看网络配置。 在查看输出时,需要重点关注以下几点:
ifconfig
输出中的 RUNNING
或 ip
输出中的 LOWER_UP
都表示物理链路是连通的(即网卡已连接到交换机或路由器)。 如果看不到这些标志,通常意味着网线被拔掉或物理连接存在问题。errors
: 表示发生了错误的数据包数,例如 CRC 校验错误、帧同步错误等。dropped
: 表示被丢弃的数据包数。这通常指数据包已经到达网卡的 Ring Buffer,但由于系统内存不足等原因被丢弃。overruns
: 表示超限数据包数。这通常是因为网络 I/O 速度过快,导致 Ring Buffer 已满,系统来不及处理而导致的丢包。carrier
: 表示发生了载波错误的数据包数,例如双工模式不匹配、物理电缆故障等。collisions
: 表示碰撞的数据包数,这在半双工网络中比较常见。ip
命令详解ip
是现代 Linux 系统中用于替代 ifconfig
、route
等传统命令的强大工具。
ip [OPTIONS] OBJECT {COMMAND | help}
link
(网络接口), addr
(IP 地址), route
(路由表), neigh
(ARP 缓存)。add
(添加), del
(删除), show
(显示), flush
(清空)。-s
(统计信息)-4
(仅 IPv4)-6
(仅 IPv6)-j
(JSON 格式输出)ip link show # 查看所有网卡
ip -s link show eth0 # 查看 eth0 的统计信息(流量、错误等)
ip link set eth0 up # 启用网卡 eth0
ip link set eth0 down # 禁用网卡 eth0
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
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 的路由路径
ip neigh show # 查看 ARP 表(类似 `arp -a`)
ip neigh flush dev eth0 # 清空 eth0 的 ARP 缓存
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)ss
是 netstat
的高效替代品,它直接从内核读取信息,查询速度极快,特别适用于高并发服务器。
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 = :端口 |
按 目标端口 过滤 |
ss
输出中的 Recv-Q
和 Send-Q
这两列的含义取决于套接字的状态:
当套接字处于连接状态 (Established):
Recv-Q
: 表示套接字缓冲还没有被应用程序取走的字节数 (即接收队列长度)。Send-Q
: 表示还没有被远端主机确认的字节数 (即发送队列长度)。当套接-字处于监听状态 (Listen):
Recv-Q
: 表示当前的全连接队列的长度。Send-Q
: 表示全连接队列的最大长度。
半连接与全连接队列: 所谓全连接,是指完成了 TCP 三次握手,然后把这个连接挪到全连接队列中,之后还需要被
accept()
系统调用取走。而半连接队列,是指三次握手还没完成,服务器收到了客户端的 SYN 后,就会把这个连接放到半连接队列中,然后再向客户端发送 SYN+ACK 包。
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 *:*
ss -tuln # 显示所有 TCP/UDP 监听端口(数字格式)
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))
ss -t state established # 仅显示已建立的 TCP 连接
ss -t state time-wait # 仅显示 TIME-WAIT 状态的连接
支持的 TCP 状态:established
、syn-sent
、syn-recv
、fin-wait-1
、fin-wait-2
、time-wait
、closed
、close-wait
、last-ack
、listening
、closed
。
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 )' # 组合条件
ss -s # 显示连接数统计
输出示例:
Total: 256 (kernel 0)
TCP: 45 (estab 10, closed 20, orphaned 0, timewait 15)
UDP: 8
RAW: 1
FRAG: 0
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 |
指定结束时间 |
sar -u 1 5 # 每隔 1 秒刷新一次,共 5 次
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/s
和 txpck/s
: 分别是接收和发送的 PPS,单位为包/秒。rxkB/s
和 txkB/s
: 分别是接收和发送的吞吐量,单位是 KB/秒。rxcmp/s
和 txcmp/s
: 分别是接收和发送的压缩数据包数,单位是包/秒。%ifutil
: 是网络接1口的使用率。半双工模式为 (rxkB/s + txkB/s) / Bandwidth
,全双工为 max(rxkB/s, txkB/s) / Bandwidth
。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 |
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
终止测试。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) |
# 验证服务器端口有没有开
nc -vw ip port
# 扫描 22, 80, 443 端口
nc -zv 192.168.1.1 22 80 443
接收文件(服务端):
nc -lvnp 1234 > received_file.txt
发送文件(客户端):
nc 目标IP 1234 < send_file.txt
# A 机器 (接收端)
nc -l 9999 > /dev/null
# B 机器 (发送端)
nc <A机器IP> 9999 < /dev/zero
# 在 A 机器上用 sar 监控网络
sar -n DEV 1
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)可以分析网络请求的来源、频率和状态码,是排查应用层网络问题的利器。