我正在尝试衡量FIO基准测试的执行时间。我现在正在这样做,在gettimeofday()之间包装FIO调用:
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是:
telapsed: 1.76088 seconds
FIO执行的实际时间是多少: a)由FIO给出的 runt ,或者 b) getttimeofday()的经过时间
PS:我曾尝试替换gettimeofday(使用std :: chrono :: high_resolution_clock :: now()),但它的行为也相同(同样,我的意思是它也比提供更长的运行时间欠幅)
提前感谢您的时间和帮助。
答案 0 :(得分:0)
快速点:Linux上的gettimeofday()
使用的时钟不一定以固定间隔打勾,甚至可以向后移动(请参阅http://man7.org/linux/man-pages/man2/gettimeofday.2.html和https://stackoverflow.com/a/3527632/4513656) - 这可能会使telapsed
不可靠(甚至是否定的)。
telapsed
)将是:fio进程启动(即Linux上的fork + exec)已经过去+ fio初始化(例如创建线程,因为我看到{{1} },ioengine初始化)+ fio作业已过去(--thread
)+ fio停止已经过去+过程停止已经过去)。您将此与runt
的{{1}}的子组件runt
进行比较。所有非telapsed
组件不太可能立即发生(即占用0个usecs),因此预期runt
将小于runt
。尝试使用telapsed
运行fio,只是为了查看它所做的所有事情以及实际提交作业的I / O. --debug=all
)提交I / O感兴趣?您是否对系统启动/停止新进程需要多长时间感兴趣?尝试提交给定时间段内的I / O(runt
)?您是否对提交I / O所花费的CPU时间感兴趣(以上都不是)?因为我很困惑,我会问你一些问题:你打算用什么结果?为什么?telapsed
来自runt
。您可以看到它是通过致电ts->runtime[ddir]
(https://github.com/axboe/fio/blob/6be06c46544c19e513ff80e7b841b1de688ffc66/backend.c#L1664)初始化的,由set_epoch_time()
(https://github.com/axboe/fio/blob/6be06c46544c19e513ff80e7b841b1de688ffc66/backend.c#L371)更新,该update_runtime()
来自thread_main()
。