FIO运行时与gettimeofday()不同

时间:2016-11-01 18:34:54

标签: c++ linux performance io execution-time

我正在尝试衡量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);

现在,问题是

  1. 经过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
    
  2. FIO执行的实际时间是多少: a)由FIO给出的 runt ,或者 b) getttimeofday()的经过时间

  3. FIO如何衡量其 runt ? (可能,这个问题与1有关。)
  4. PS:我曾尝试替换gettimeofday(使用std :: chrono :: high_resolution_clock :: now()),但它的行为也相同(同样,我的意思是它也比提供更长的运行时间欠幅

    提前感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:0)

快速点:Linux上的gettimeofday()使用的时钟不一定以固定间隔打勾,甚至可以向后移动(请参阅http://man7.org/linux/man-pages/man2/gettimeofday.2.htmlhttps://stackoverflow.com/a/3527632/4513656) - 这可能会使telapsed不可靠(甚至是否定的)。

  1. 你的gettimeofday / popen / gettimeofday测量(telapsed)将是:fio进程启动(即Linux上的fork + exec)已经过去+ fio初始化(例如创建线程,因为我看到{{1} },ioengine初始化)+ fio作业已过去(--thread)+ fio停止已经过去+过程停止已经过去)。您将此与runt的{​​{1}}的子组件runt进行比较。所有非telapsed组件不太可能立即发生(即占用0个usecs),因此预期runt将小于runt。尝试使用telapsed运行fio,只是为了查看它所做的所有事情以及实际提交作业的I / O.
  2. 这很难回答,因为当你说“fio执行”以及为什么时(这个问题很难以明确的方式解释),这取决于你想要的意思。您是否对fio实际花费多长时间为特定作业(--debug=all)提交I / O感兴趣?您是否对系统启动/停止新进程需要多长时间感兴趣?尝试提交给定时间段内的I / O(runt)?您是否对提交I / O所花费的CPU时间感兴趣(以上都不是)?因为我很困惑,我会问你一些问题:你打算用什么结果?为什么?
  3. 为什么不看源代码? https://github.com/axboe/fio/blob/7a3b2fc3434985fa519db55e8f81734c24af274d/stat.c#L405显示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()