磁盘io查看命令iostat与网络连接查看命令netstat
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: 22170479 total packets received1 with invalid addresses0 forwarded0 incoming packets discarded2170478 incoming packets delivered2188216 requests sent out96 dropped because of missing routeOutTransmits: 2188216
Icmp:418166 ICMP messages received0 input ICMP message failedICMP input histogram:echo requests: 418162echo replies: 4419676 ICMP messages sent0 ICMP messages failedOutRateLimitHost: 20ICMP output histogram:destination unreachable: 1509echo requests: 5echo replies: 418162
IcmpMsg:InType0: 4InType8: 418162OutType0: 418162OutType3: 1509OutType8: 5
Tcp:221352 active connection openings6 passive connection openings0 failed connection attempts5748 connection resets received5 connections established1629477 segments received1655469 segments sent out627 segments retransmitted0 bad segments received5997 resets sent
Udp:115046 packets received1529 packets to unknown port received0 packet receive errors116681 packets sent0 receive buffer errors0 send buffer errors
UdpLite:
TcpExt:2267 TCP sockets finished time wait in fast timer15393 delayed acks sentQuick ack mode was activated 282 times31854 packet headers predicted622920 acknowledgments not containing data payload received195993 predicted acknowledgmentsTCPSackRecovery: 157Detected reordering 106 times using SACK4 congestion windows fully recovered without slow startTCPDSACKUndo: 241 congestion windows recovered without slow start after partial ackTCPLostRetransmit: 33TCPSackFailures: 1169 fast retransmits6 retransmits in slow startTCPTimeouts: 66TCPLossProbes: 509TCPLossProbeRecovery: 200TCPSackRecoveryFail: 8TCPBacklogCoalesce: 8TCPDSACKOldSent: 282TCPDSACKRecv: 114TCPDSACKOfoRecv: 237 connections reset due to unexpected data5747 connections reset due to early user close1 connections aborted due to timeoutTCPDSACKIgnoredNoUndo: 11TCPSackMerged: 4TCPSackShiftFallback: 342TCPRcvCoalesce: 226743TCPOFOQueue: 182TCPOrigDataSent: 834124TCPDelivered: 1055180TcpTimeoutRehash: 65TcpDuplicateDataRehash: 19TCPDSACKRecvSegs: 117
IpExt:InMcastPkts: 6179InOctets: 211864985OutOctets: 380262294InMcastOctets: 222444InNoECTPkts: 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'