1. iostat的使用场景
首先iostat命令隶属于sysstat软件包。iostat专门用来查看主机上每个磁盘设备的io情况,包括像每秒的读写数据情况,磁盘平均io时间,设备io繁忙情况等等。
1.1 iostat的普通输出解释
首先是主机的架构,主机名,时间日期,cpu的架构和核数。
第二行是cpu的使用分配
字段 | 中文含义 | 单位 | 经验阈值 |
---|---|---|---|
%user |
用户态 CPU | % | — |
%nice |
nice 调度的用户态 CPU | % | — |
%system |
内核态 CPU | % | — |
%iowait |
CPU 空闲且等 I/O | % | >20 % 关注 |
%steal |
虚拟化“偷”走的 CPU | % | >5 % 关注 |
%idle |
真正空闲 | % | — |
第三行是关于磁盘io的简单情况介绍
字段 | 含义 | 单位 |
---|---|---|
Device | 设备(或分区)名称,如 sda、nvme0n1 | — |
tps | 每秒向该设备发起的 I/O 请求次数(合并后) | 次/秒 |
kB_read/s | 每秒从设备读取的数据量 | KB/秒 |
kB_wrtn/s | 每秒向设备写入的数据量 | KB/秒 |
kB_dscd/s | 每秒向设备 丢弃/trim 的数据量 | KB/秒 |
kB_read | 从开机到当前累计读取总量 | KB |
kB_wrtn | 从开机到当前累计写入总量 | KB |
kB_dscd | 从开机到当前累计丢弃总量 | KB |
1.2 iostat的扩展输出解释
查看扩展输出时输入命令 iostat -x,主要用来查看磁盘io的核心指标。
首先指出的是,iostat的数据全部来源于内核数据/proc/diskstats文件
字段 | 中文含义 | 单位 | 正常阈值/建议 | 排查要点 |
---|---|---|---|---|
r/s |
每秒 读 I/O 请求 次数 | 次/s | — | 读密集型业务高值正常 |
w/s |
每秒 写 I/O 请求 次数 | 次/s | — | 写密集型业务高值正常 |
rkB/s |
每秒 读 数据量 | KB/s | — | 观察业务峰谷 |
wkB/s |
每秒 写 数据量 | KB/s | — | 同上 |
rrqm/s(rqm为request merge简称) |
每秒 合并读请求 次数 | 次/s | 越大越好 | 合并率高 → 减少寻道 |
wrqm/s |
每秒 合并写请求 次数 | 次/s | 越大越好 | 同上 |
r_await |
读请求平均等待时间(排队+服务) | ms | <10 ms(SSD)<20 ms(HDD) | 高值 → 磁盘瓶颈 |
w_await |
写请求平均等待时间(排队+服务) | ms | 同上 | 同上 |
aqu-sz |
平均队列长度 | 个 | <1 轻载,>5 重载 | 排队严重需扩容/优化 |
rareq-sz |
读请求 平均块大小 | KB | >64 KB 顺序 I/O | 小块随机需优化 |
wareq-sz |
写请求 平均块大小 | KB | 同上 | 同上 |
svctm |
已废弃! 设备服务时间 | ms | 忽略 | 内核不再提供准确值 |
%util |
设备忙碌百分比 | % | <70 % 安全,>80 % 瓶颈 | 100 % ≠ 饱和需结合队列 |
平均队列长度(aqu-sz
)就是 “采样周期内,设备队列中 等待 + 正在处理 的 I/O 请求数量的平均值”。它直接告诉你 磁盘有多“堵车”。
平均请求块大小req-sz(Average Request Size)
= 在 一次采样周期内 ,所有读/写 I/O 请求的数据量总和 ÷ 请求次数总和
结果通常用 “扇区数” 或 “KB” 表示,直观反映 每次 I/O 请求的平均数据块大小。
平均等待时间await(average wait)
=在一次采样周期内,所有读写io请求的平均处理时间(包括排队等待和io时间)
磁盘繁忙程度util
=在一次采样周期内,有磁盘io的时间/采样周期时间,表示了磁盘的繁忙程度。
iostat 的 “采样时间” 并不是写死在代码里的常量,而是由你 在命令行显式指定 的:
不指定任何时间参数
iostat
→ 只输出 一次 从系统启动到现在的 累计平均值,没有周期性采样 。
指定
interval
iostat [可选参数] <interval> [count]
<interval>
单位为 秒,表示两次采样之间的间隔;[count]
表示一共采多少次;缺省 count 时无限循环 。
事例如下:
iostat -dk 2 5 # 每 2 秒采样一次,共采 5 次
iostat -x 1 # 每 1 秒采样一次,无限循环直到 Ctrl-C
2. netstat的使用
netstat 的核心功能一句话概括:
“把操作系统里所有网络相关的状态、端口、路由、接口和进程信息一次性打印出来”。
2.1 netstat输出字段的意义
列名 | 一句话说明 |
---|---|
Proto | 协议:TCP 还是 UDP。 |
Recv-Q | 本地接收队列里 还没被应用读走 的字节数。 |
Send-Q | 本地发送队列里 还没被对端确认 的字节数。 |
Local Address | 本机 IP:端口。 |
Foreign Address | 远端 IP:端口(监听端口显示为 0.0.0.0:* 或 :::* )。 |
State | 连接状态,TCP 常见:LISTEN(监听)、ESTABLISHED(已连接)、TIME_WAIT(等待关闭)等。 |
还有常用的参数如下表
参数 | 记忆口诀 | 作用 |
---|---|---|
-t |
TCP | 只看 TCP |
-u |
UDP | 只看 UDP |
-n |
Numeric | 不解析域名/端口,直接显示数字 |
-l |
Listen | 只看监听的端口 |
-p |
PID | 显示进程号/进程名 |
-a |
All | 既看监听也看已建立连接 |
-r |
Route | 打印路由表(等同 ip route ) |
-i |
Interface | 显示网口统计(流量/丢包) |
-s |
Statistics | 打印各协议(TCP/UDP/ICMP)累计统计 |
-c |
Continuous | 每秒刷新一次(实时 top 效果) |
2.2 netstat的几个使用场景
1️⃣ 看谁在监听什么端口(排查端口冲突)
netstat -tunlp # Linux
netstat -ano | findstr LISTENING # Windows
-t
只列 TCP;-u
只列 UDP;-n
用数字地址;-l
只列监听;-p
带进程 PID。
为什么pid后面显示为-
你在使用 netstat -tunlp
时看到某些连接的 PID 显示为 -
,这通常是因为当前用户没有足够的权限去查看该 socket 的进程信息。
原因详解:
netstat -p
需要读取/proc/net/tcp
、/proc/net/udp
等内核接口,并进一步通过 inode 去/proc/[pid]/fd/
中查找对应的 socket。如果该 socket 是由另一个用户(尤其是 root)创建的,而你当前不是 root 用户,就无法访问其进程信息,PID 就会显示为
-
。这并不代表端口没有被占用,只是你无权查看是谁占用的。
2️⃣ 查端口被哪个进程占用
lsof -i:3306 || netstat -tunlp | grep 3306
先 lsof
,没有就 netstat
过滤出 PID,再 kill -9
即可
lsof
(List Open Files)是 Linux 下非常强大的排查工具,它不仅可以查看哪些文件被哪些进程打开,还能用来查看端口被哪个进程占用,功能比 netstat
更直观、信息更全。
3️⃣ 统计当前各 TCP 状态数量(排查半开连接、SYN Flood)
netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(i in S) print i,S[i]}'
4️⃣ 实时刷新(像 top 一样)
netstat -c 1
5️⃣ 看路由表(快速确认网关)
netstat -rn # Linux
netstat -r # Windows
字段解释
Destination
目标网络或主机地址;0.0.0.0
表示“默认路由”。Gateway
下一跳地址;0.0.0.0
(或*
)代表“直连网络”,无需网关,直接发到本地子网。Genmask / Netmask
与 Destination 配合构成网络前缀。0.0.0.0
对应默认路由;255.255.255.0
对应/24
。Flags(常用字母)
U Route is up
G 使用网关(Gateway 字段非 0)
H 目标是一个主机(host route),而非网络
D 由 ICMP 重定向或守护进程动态安装
M 被路由守护进程修改或重定向
! 拒绝路由(reject/blackhole)
MSS
此路由上 TCP 连接的默认 最大报文段长度;通常为空或 0,表示使用路径 MTU 发现。Window
早期用于 TCP 窗口大小 的静态值;现代内核已忽略,多为 0。irtt (initial RTT)
初始往返时间估计值(毫秒),仅影响旧版路由度量;通常 0。Iface
报文要从哪个接口发出去,如eth0
、wlan0
、en0
、utun3
等。
6️⃣ 看接口流量统计(丢包、错误)
netstat -i # Linux
字段 | 全称 | 含义 |
---|---|---|
Iface / Name | Interface | 接口名字,如 eth0 , wlan0 , en0 , utun3 。 |
MTU | Maximum Transmission Unit | 该接口一次能发多少字节的 IP 载荷(不含二层头)。常见 1500(以太网)、9000(巨帧)。 |
RX-OK / Ipkts / Packets | Received OK | 成功接收且无错误的帧数。 |
RX-ERR / Ierrs | Received Errors | 接收时检测到的错误帧数(CRC、对齐、长度等)。 |
RX-DRP / Idrop | Received Drops | 帧无错,但被内核主动丢弃(通常因缓冲区满)。 |
RX-OVR / Oerrs | RX Overruns | 硬件/驱动来不及把帧从网卡搬进内存而丢包。 |
TX-OK / Opkts | Transmitted OK | 成功发送的帧数。 |
TX-ERR / Oerrs | Transmit Errors | 发送时产生的错误。 |
TX-DRP | Transmit Drops | 发送路径被丢弃(队列满、策略丢包)。 |
TX-OVR | TX Overruns | 内核来不及把帧送到网卡,硬件队列溢出。 |
Flg / Flags | Interface Flags | 接口状态位,见下方“Flag 字母表”。 |
8️⃣ 查看协议级统计(定位 TCP 重传、丢包)
netstat -s
输出如下:
tovwang@VM-123-217-tencentos ~]$ netstat -s
Ip:
Forwarding: 2
2170479 total packets received
1 with invalid addresses
0 forwarded
0 incoming packets discarded
2170478 incoming packets delivered
2188216 requests sent out
96 dropped because of missing route
OutTransmits: 2188216
Icmp:
418166 ICMP messages received
0 input ICMP message failed
ICMP input histogram:
echo requests: 418162
echo replies: 4
419676 ICMP messages sent
0 ICMP messages failed
OutRateLimitHost: 20
ICMP output histogram:
destination unreachable: 1509
echo requests: 5
echo replies: 418162
IcmpMsg:
InType0: 4
InType8: 418162
OutType0: 418162
OutType3: 1509
OutType8: 5
Tcp:
221352 active connection openings
6 passive connection openings
0 failed connection attempts
5748 connection resets received
5 connections established
1629477 segments received
1655469 segments sent out
627 segments retransmitted
0 bad segments received
5997 resets sent
Udp:
115046 packets received
1529 packets to unknown port received
0 packet receive errors
116681 packets sent
0 receive buffer errors
0 send buffer errors
UdpLite:
TcpExt:
2267 TCP sockets finished time wait in fast timer
15393 delayed acks sent
Quick ack mode was activated 282 times
31854 packet headers predicted
622920 acknowledgments not containing data payload received
195993 predicted acknowledgments
TCPSackRecovery: 157
Detected reordering 106 times using SACK
4 congestion windows fully recovered without slow start
TCPDSACKUndo: 24
1 congestion windows recovered without slow start after partial ack
TCPLostRetransmit: 33
TCPSackFailures: 1
169 fast retransmits
6 retransmits in slow start
TCPTimeouts: 66
TCPLossProbes: 509
TCPLossProbeRecovery: 200
TCPSackRecoveryFail: 8
TCPBacklogCoalesce: 8
TCPDSACKOldSent: 282
TCPDSACKRecv: 114
TCPDSACKOfoRecv: 2
37 connections reset due to unexpected data
5747 connections reset due to early user close
1 connections aborted due to timeout
TCPDSACKIgnoredNoUndo: 11
TCPSackMerged: 4
TCPSackShiftFallback: 342
TCPRcvCoalesce: 226743
TCPOFOQueue: 182
TCPOrigDataSent: 834124
TCPDelivered: 1055180
TcpTimeoutRehash: 65
TcpDuplicateDataRehash: 19
TCPDSACKRecvSegs: 117
IpExt:
InMcastPkts: 6179
InOctets: 211864985
OutOctets: 380262294
InMcastOctets: 222444
InNoECTPkts: 2196962
MPTcpExt:
netstat -s
会把 IP、ICMP、TCP、UDP 四大协议(以及 IPv6 对应版本)的 内核累计统计 全部打印出来,主要分成 “计数器” 和 “错误/异常” 两大类,可直接用来判断 丢包、重传、队列溢出 等故障。下面给出 每个协议最常被关注的指标 与 对应含义:
① IP 层(网络层)
关键词 | 含义 |
---|---|
total packets received |
系统启动以来收到的 IP 包总数 |
forwarded |
被本机转发的包数(>0 说明本机在做路由器) |
incoming packets discarded |
因无路由/内存不足等被丢弃的包 |
incoming packets delivered |
真正交到上层协议的包 |
dropped because of missing route |
路由缺失导致丢包 |
② ICMP 层
关键词 | 含义 |
---|---|
ICMP messages received/sent |
收/发 ICMP 报文总数 |
ICMP input histogram |
分类计数:目的不可达、超时、重定向… |
InCsumErrors |
校验和错误 → 可能线路故障或攻击 |
③ TCP 层(排查连接质量最常用)
关键词 | 含义 |
---|---|
Active opens / Passive opens |
主动/被动连接建立次数 |
segments retransmitted |
重传段数 —— 高值说明网络抖动或拥塞 |
retransmit timeouts |
超时重传次数 |
listen queue overflows |
监听队列溢出 → 应用 accept() 太慢 |
failed connection attempts |
三次握手失败次数 |
packets pruned from receive queue |
因队列满被丢弃的 TCP 数据 |
④ UDP 层
关键词 | 含义 |
---|---|
InDatagrams / OutDatagrams |
收/发 UDP 数据报总数 |
RcvbufErrors / SndbufErrors |
接收/发送缓存满导致丢包 |
NoPorts |
目的端口未开放 的 ICMP 端口不可达 |
实战示例:快速定位问题
# 1) 查重传是否过多
netstat -s | grep -E 'segments retransmitted|retransmit timeouts'
# 2) 查监听队列是否溢出
netstat -s | grep 'listen queue overflow'
# 3) 查 UDP 丢包
netstat -su | grep -E 'RcvbufErrors|SndbufErrors'