菜鸟科技网

iotop命令如何实时监控磁盘I/O?

iotop 是一个类似于 top 的命令行工具,它的主要作用是实时监控 Linux 系统中进程的磁盘 I/O 活动情况,通过 iotop,你可以清晰地看到哪个进程正在读写磁盘,以及它们占用了多少 I/O 带宽,这对于排查系统性能瓶颈(尤其是磁盘瓶颈)非常有用。

iotop命令如何实时监控磁盘I/O?-图1
(图片来源网络,侵删)

iotop 是什么?

iotop 的名字来源于 I/O + top,它通过读取内核的 I/O 计数器信息来工作,这些信息通常位于 /proc 文件系统中。

核心功能:

  • 实时显示每个进程的磁盘读写速度。
  • 显示总的磁盘读写速度。
  • 显示等待 I/O 的进程数量和百分比。

如何安装 iotop

iotop 通常不是 Linux 系统的默认组件,你需要手动安装,在不同的发行版中,安装命令也不同:

对于 Debian / Ubuntu / Mint 系统:

iotop命令如何实时监控磁盘I/O?-图2
(图片来源网络,侵删)
sudo apt update
sudo apt install iotop

对于 CentOS / RHEL / Fedora / Rocky Linux / AlmaLinux 系统:

# 对于 CentOS/RHEL 7/8 及更新版本
sudo yum install iotop
# 或者
sudo dnf install iotop
# 对于 CentOS/RHEL 6 及更早版本
sudo yum install iotop

对于 Arch Linux 系统:

sudo pacman -S iotop

iotop 的基本用法

最简单的用法就是直接在终端输入 iotop

sudo iotop

注意: iotop 需要 root 权限才能获取所有进程的 I/O 信息,因此必须使用 sudo 运行。

iotop命令如何实时监控磁盘I/O?-图3
(图片来源网络,侵删)

基本界面解读

运行 iotop 后,你会看到一个类似下面的界面:

Total DISK READ:       0.00 K/s | Total DISK WRITE:       0.00 K/s
Actual DISK READ:      0.00 K/s | Actual DISK WRITE:      0.00 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
    1 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % systemd
    2 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % kthreadd
    3 rt/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % rcu_gp
    4 rt/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % rcu_par_gp
    5 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % slub_flushwq
    6 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % netns
    7 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % rcu_tasks_kthre
    8 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % rcu_tasks_rude_
    9 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % rcu_tasks_trace
   10 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % kworker/0:0H-events
   11 rt/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % migration/0
   12 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % ksoftirqd/0
   13 rt/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % rcuop/0
   14 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % watchdog/0
   15 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % watchdog/0
   16 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % migration/0
   17 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % kdevtmpfs
   18 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % netns
   19 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % kworker/0:1-events
...
 1234 be/4 myuser      50.00 M/s    0.00 K/s  0.00 % 99.99 % my_disk_intensive_app
...

列说明:

  • TID (Thread ID): 线程 ID,在大多数情况下,它与进程 ID 相同。
  • PRIO (Priority): 进程的优先级。
  • USER: 运行该进程的用户。
  • DISK READ: 进程从磁盘读取数据的速度。
  • DISK WRITE: 进程向磁盘写入数据的速度。
  • SWAPIN: 进程换入交换分区的百分比。
  • IO%: 这是最重要的列之一,表示该进程等待 I/O 操作(包括读写)所花费的时间占总 CPU 时间的百分比,如果一个进程的 IO% 很高,说明它正在“饥饿”地等待磁盘。
  • COMMAND: 进程的名称或命令。 信息说明:**
  • Total DISK READ/WRITE: 所有进程 I/O 的总和。
  • Actual DISK READ/WRITE: 磁盘实际的 I/O 速度,这个值通常小于 Total,因为多个进程的 I/O 可能被合并或缓存。

常用选项和交互式命令

iotop 支持很多有用的选项,并且在运行时可以通过按键进行交互。

常用启动选项

选项 说明
-o, --only 只显示有 I/O 活动的进程,这对于快速找到问题进程非常有用,默认会显示所有进程。
-b, --batch 批处理模式,将输出重定向到文件或管道中,不使用交互式界面,适合用于脚本。
-n, --num 指定在批处理模式下显示的迭代次数。iotop -b -n 10 会显示 10 次快照后退出。
-d, --delay 指定刷新间隔,单位是秒。iotop -d 5 表示每 5 秒刷新一次。
-p, --pid 只监控指定 PID 的进程。iotop -p 1234
-u, --user 只监控指定用户的进程。iotop -u myuser
-a, --accumulated 显示累计的 I/O 数量,而不是速率。
-k, --kilobytes 使用 KB/s 作为单位,而不是默认的 MB/s。

示例:

  • 只显示有 I/O 活动的进程:
    sudo iotop -o
  • 将 I/O 活动记录到文件中,每秒刷新一次,共记录 60 次:
    sudo iotop -b -d 1 -n 60 > iotop.log

交互式命令

iotop 在交互式模式下运行时,你可以按以下键来控制它:

按键 功能
left / right / up / down 上下左右箭头键,用于在列表中排序。
a 切换 --accumulated 模式(累计 I/O / 速率 I/O)。
d 切换 --delay 时间间隔。
p 切换 --pid 过滤器(会提示你输入 PID)。
q 退出 iotop
r 切换 --raw 模式(显示原始数据)。
s 切换 --since 过滤器(显示自某个时间以来的 I/O)。
t 切换 --total 模式(显示/隐藏顶部摘要行)。
u 切换 --user 过滤器(会提示你输入用户名)。

实际应用场景

系统响应缓慢,怀疑是磁盘瓶颈

当你的 Linux 服务器突然变慢,鼠标卡顿,网页打不开时,可以运行 sudo iotop -o

  • 观察现象: 如果看到某个进程(mysqld, java, nginx)的 DISK READDISK WRITE 列的值非常高,IO% 列也持续处于高位(比如超过 50%),那么这个进程很可能就是导致系统缓慢的元凶。
  • 解决方案:
    1. 确认该进程是否正常工作。
    2. 如果是数据库,可能需要优化 SQL 查询或增加缓存。
    3. 如果是应用,可能需要检查其日志写入或文件操作逻辑。
    4. 考虑升级硬件,例如使用更快的 SSD 替换 HDD。

监控备份或数据同步任务

当你运行 rsync, tar, dd 等命令进行大文件复制或备份时,你想知道它占用了多少 I/O 带宽。

  • 操作: 在另一个终端窗口运行 sudo iotop -p <PID>,将 <PID> 替换为备份进程的 PID。
  • 观察现象: 你可以实时看到该进程的读写速度,从而判断备份进度是否正常,以及是否对线上服务造成了 I/O 压力。

分析日志文件

iotop 的输出保存到文件中,以便后续分析。

  • 操作:
    sudo iotop -b -n 60 -d 1 > /var/log/iotop_$(date +%Y%m%d_%H%M%S).log
  • 用途: 在系统出现性能问题的特定时间段内运行此命令,可以记录下当时的 I/O 情况,方便事后排查问题根源。

替代工具

虽然 iotop 非常直观,但还有一些其他工具可以实现类似的功能:

  • iostat (sysstat 包): 更侧重于设备和系统整体的 I/O 统计,而不是单个进程,它可以显示磁盘的利用率、读写请求队列长度等,是分析磁盘性能的利器。
  • pidstat (sysstat 包): 可以监控单个进程或所有进程的 CPU、内存、I/O 等情况,使用 pidstat -d -p <PID> 可以查看特定进程的 I/O 统计。
  • dstat: 一个非常强大的多功能系统统计工具,可以同时显示 CPU、内存、网络、磁盘 I/O 等信息,并可以灵活定制。

iotop 是 Linux 系统管理员和开发者排查进程级磁盘 I/O 问题首选工具之一,它直观、易用,能快速定位到是哪个进程在“疯狂”地读写磁盘,结合 iostatpidstat 等工具,你可以构建一个强大的 I/O 性能监控和分析工具集。

分享:
扫描分享到社交APP
上一篇
下一篇