我想计算脚本完整运行过程中的磁盘访问次数。
我的 bash 脚本在本地运行另外 2 个可执行文件,在远程运行另外 2 个可执行文件。如下所示(这些可执行文件本身可能会访问其他工具):
#!/bin/bash
./executable1 DATA1 &
./executable2 DATA2 &
ssh remote_host './executable3 DATA3' &
ssh remote_host './executable4 DATA4' &
wait;
现在我正在perf
像这样运行我的 bash 脚本:
perf stat -e page-faults,page-faults:u ./myBashScript.sh
但结果总是相同的,无论我是否更改 DATA* 文件、顺序、命令数量……如下所示:
128,470 page-faults
127,641 page-faults:u
现在我的问题是“如何计算整个脚本的磁盘访问次数?”
附言:
- 如您所知,Linux 尝试通过使用 RAM 的可用空间作为缓存磁盘来减少磁盘访问次数,这里所说的“计算磁盘访问次数”确切地意味着 OS 需要将数据从硬盘传送到主内存的次数(= RAM 命中/未命中)
- 我只需要计算本地机器上的磁盘访问次数,而不是远程机器的磁盘访问次数。
答案1
perf
linux 工具 ( )中的页面错误perf_events
既包括次要页面错误,也包括主要页面错误。次要页面错误不适用于磁盘访问。并非每个主要页面错误都适用于磁盘访问(仅当编辑了磁盘文件时才适用mmap
)。读/写磁盘访问不会产生任何页面错误。
一些通用的页面错误计数解决方案如下https://stackoverflow.com/questions/23302763。
要全局统计磁盘访问次数,请使用iostat
工具http://man7.org/linux/man-pages/man1/iostat.1.html(tps、r/s、w/s) 或vmstat
工具http://man7.org/linux/man-pages/man8/vmstat.8.html(bo、bi、-d
)。两者都与以秒为单位的句点一起使用,例如iostat 1
或vmstat 1
每秒打印一组活动,直到被 ctrl-c 终止;或者像iostat 1 60
或vmstat 1 60
每秒打印 1 分钟并退出。
其他解决方案是结合使用perf
工具和来自 i/o 或磁盘子系统的一些特定事件。Gregg 在以下网址提供了一些高级 perf 使用示例:http://www.brendangregg.com/perf.html和https://github.com/brendangregg/perf-tools。
他的 iosnoop 工具http://www.brendangregg.com/blog/2014-07-16/iosnoop-for-linux.html和http://www.brendangregg.com/blog/2014-07-23/linux-iosnoop-latency-heat-maps.html(基于 perf)可以使用进程 pid、磁盘 id、偏移量和 io 大小跟踪磁盘 i/o,还可以测量磁盘访问的延迟。
另请参阅“7.2. 热图”http://www.brendangregg.com/perf.html
我使用 perf_events 记录块请求(磁盘 I/O)问题和完成静态跟踪点:
# perf record -e block:block_rq_issue -e block:block_rq_complete -a sleep 120