Linux无法直接查看目录读写性能,因内核不按目录统计I/O;需通过iostat监控所在设备、iotop定位访问进程、inotifywatch统计事件频次,或用fio结合df/findmnt映射到设备后压测。

Linux 无法直接“查看某个目录的读写性能”,因为内核不按目录维度统计 I/O 性能;必须通过监控其所在文件系统设备、或追踪访问该目录的进程来间接获取。
iostat 只能查设备,不能查目录
目录本身不是 I/O 调度单元,iostat 输出的是块设备(如 /dev/sdb1)或逻辑卷的吞吐、延迟、队列等指标。即使你 cd 进某个目录再跑 iostat,看到的仍是整个挂载点底层设备的表现。
-
iostat -xk 1 /dev/sdb1可聚焦某一分区,但无法区分是/var/log还是/home在拖慢它 -
%util高只说明设备忙,不等于“这个目录在被狂写” - 若目录跨多个设备(如 LVM 条带、overlayfs、bind mount),
iostat更无法归因
用 iotop 定位访问该目录的进程
真正影响目录 I/O 行为的是进程——哪个程序在读写它,才是关键。用 iotop 按进程维度抓实时带宽,再结合 lsof 或 pidof 确认路径归属:
- 运行
sudo iotop -o -d 1,观察IO>列高的进程 PID - 对 PID 执行
lsof -p <pid> | grep '/your/target/dir'</pid>,确认是否真在操作目标目录下的文件 - 注意:
lsof输出中REG类型文件才代表真实磁盘 I/O;DIR或CHR不计入吞吐 - 如果进程使用了 mmap,
iotop可能不显示其 I/O(取决于是否触发 page fault 后的回写)
用 inotifywatch 监控目录级事件频次,但不反映性能
inotifywatch 能统计某目录下 access、modify、create 等事件发生次数,适合判断“有没有人频繁碰这个目录”,但完全不提供速度、延迟、吞吐量等性能数据:
- 命令示例:
inotifywatch -e modify -e access -t 30 -r /path/to/dir - 输出只有事件计数,比如
modify: 127,不代表每次修改花了多少毫秒 - 它不捕获 I/O 大小、block 层排队、设备响应时间等底层指标
- 大量小文件操作可能触发海量 inotify 事件,但实际磁盘负载未必高(可能全在 page cache 里)
fio 测试时需手动映射目录到设备
如果你想测“写入该目录的实际性能”,本质是测它所在文件系统的后端设备。步骤是:
- 先用
df /path/to/dir查出挂载点(如/mnt/data),再用findmnt -D /mnt/data或lsblk找到对应设备(如/dev/nvme0n1p2) - 用
fio对该设备或挂载点下的测试文件压测:fio --name=write-test --ioengine=libaio --rw=write --bs=4k --size=2G --filename=/mnt/data/fio.tmp --direct=1 - 务必加
--direct=1绕过 page cache,否则测的是内存带宽而非磁盘能力 - 别在生产目录里留大测试文件;建议
umount后用dd if=/dev/zero of=/dev/xxx bs=1M测裸设备(仅限非系统盘)
真正的瓶颈往往藏在路径层级之外:文件系统类型(ext4 vs xfs)、挂载选项(noatime、barrier)、RAID 控制器缓存策略、甚至 NVMe 的 queue depth 设置——这些都比“看目录”更决定最终性能表现。



















