我正在尝试测量 FIO 基准测试的执行时间。目前,我正在这样做,将 FIO 调用包装在 gettimeofday() 之间:
gettimeofday(&startFioFix, NULL);
FILE* process = popen("fio --name=randwrite --ioengine=posixaio rw=randwrite --size=100M --direct=1 --thread=1 --bs=4K", "r");
gettimeofday(&doneFioFix, NULL);
并将耗时计算为:
double tstart = startFioFix.tv_sec + startFioFix.tv_usec / 1000000.;
double tend = doneFioFix.tv_sec + doneFioFix.tv_usec / 1000000.;
double telapsed = (tend - tstart);
现在,问题是
耗时与 FIO 输出的runt 不同(更大)。你能帮我理解为什么吗?正如 FIO 输出中所见:
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=posixaio, iodepth=1 fio-2.2.8 Starting 1 thread randwrite: (groupid=0, jobs=1): err= 0: pid=3862: Tue Nov 1 18:07:50 2016 write: io=102400KB, bw=91674KB/s, iops=22918, runt= 1117msec ...
而逝去的是:
telapsed: 1.76088 seconds
FIO 执行的实际时间是多少: a) FIO 给出的 runt,或者 b) getttimeofday() 消耗的时间
- FIO 如何衡量其 runt? (可能这个问题与 1 有关。)
PS:我尝试用 std::chrono::high_resolution_clock::now() 替换 gettimeofday(用 std::chrono::high_resolution_clock::now()),但它的行为也一样(同样,我的意思是它也比 矮个子)
提前感谢您的时间和帮助。
最佳答案
要点:gettimeofday()
在 Linux 上使用的时钟不一定以恒定间隔滴答,甚至可以向后移动(参见 http://man7.org/linux/man-pages/man2/gettimeofday.2.html 和 https://stackoverflow.com/a/3527632/4513656)- 这可能使 telapsed
不可靠(甚至是负面的)。
- 你的 gettimeofday/popen/gettimeofday 测量(
telapsed
)将是:fio 进程启动(即 Linux 上的 fork+exec)elapsed + fio 初始化(例如线程创建,因为我看到--thread
, ioengine initialisation) + fio job elapsed (runt
) + fio stopped elapsed + process stop elapsed).您将其与runt
进行比较,runt
是telapsed
的子组件。不太可能所有非runt
组件都会立即发生(即占用 0 usecs),因此预计runt
将小于telapsed
。尝试使用--debug=all
运行 fio 只是为了查看它除了为作业实际提交 I/O 之外所做的所有事情。 - 这很难回答,因为这取决于您说“fio 执行”时的意思以及为什么(即这个问题很难以明确的方式解释)。您是否对 fio 为给定作业(
runt
)尝试提交 I/O 实际花费了多长时间感兴趣?您是否对您的系统启动/停止一个新进程需要多长时间感兴趣,而该进程恰好在给定时间段内尝试提交 I/O(telapsed
)?您对提交 I/O(以上都不是)花费了多少 CPU 时间感兴趣吗?因此,因为我很困惑,所以我会问你一些问题:你打算将结果用于什么目的?为什么? - 为什么不看看源代码? https://github.com/axboe/fio/blob/7a3b2fc3434985fa519db55e8f81734c24af274d/stat.c#L405显示
runt
来自ts->runtime[ddir]
。您可以看到它是通过调用set_epoch_time()
( https://github.com/axboe/fio/blob/6be06c46544c19e513ff80e7b841b1de688ffc66/backend.c#L1664 ) 来初始化的,由update_runtime()
( https://github.com/axboe/fio/blob/6be06c46544c19e513ff80e7b841b1de688ffc66/backend.c#L371 ) 更新,它是从thread_main()
.
关于c++ - FIO 运行时不同于 gettimeofday(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40366423/