我正在对 Linux 程序进行性能实验,该程序获取输入数据,对其进行处理并将数据写入块设备
尽管我知道输入有多少数据(例如1GB),但我不知道到底有多少数据写入块设备,因为程序会处理它(包括删除一些中间数据,写入额外数据)。所以这不利于计算块设备的整个吞吐量。
我曾经使用过blktrace
,但它可以轻松获取大量数据,我不确定这是否能够在过去的 1 小时内工作。
我知道FIO
能够对 IO 设备进行基准测试,但我特别想测试该程序下的块 IO 设备行为。所以基本上我实际上是在测试块 IO 设备和程序的组合,而不仅仅是块 IO 设备。
du -sh
我也考虑过这种方法,但du -sh
无法捕获删除的数据量。另外,能否du -sh
捕获写入物理设备的数据?我的意思是,不是文件系统。
还有其他工具可以使用吗?
答案1
如果您需要每小时读/写的总字节数,iostat
可以为您提供。
$ iostat sda -tdyh 10
Linux 4.12.14-122.136-default (hostname) 05/22/2023 _x86_64_ (18 CPU)
05/22/2023 12:56:22 PM
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device
2.30 0.0k 14.8k 0.0k 148.0k sda
05/22/2023 12:56:32 PM
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device
412.00 0.0k 102.5M 0.0k 1.0G sda
05/22/2023 12:56:42 PM
tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device
420.80 102.4M 104.8k 1.0G 1.0M sda
kB_read
并kB_wrtn
分别显示读取或写入的块总数。首先,它表明:
- 之间12:56:22和12:56:321GB 已写入磁盘。
- 之间12:56:32和12:56:42从磁盘读取了 1GB。
(我使用dd
命令将 1G 文件写入/读取到磁盘来创建这些数字并确保报告正确)
我使用过的标志:
-t
- 打印显示的每个报告的时间。-d
- 仅显示设备报告(没有它,iostat
也会显示CPU利用率)-y
- 省略系统启动后的第一份统计报告。仅报告间隔之间的利用率。-h
- 使设备利用率报告更易于人类阅读(如果需要,MB/GB,而不仅仅是 kB)10
- 是间隔(以秒为单位),在本例中为每 10 秒。如果您想每小时检查一次,请使用 3600。