c++ - FIO 运行时不同于 gettimeofday()

标签 c++ linux performance io execution-time

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

现在,问题是

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

  3. 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.htmlhttps://stackoverflow.com/a/3527632/4513656)- 这可能使 telapsed 不可靠(甚至是负面的)。

  1. 你的 gettimeofday/popen/gettimeofday 测量(telapsed)将是:fio 进程启动(即 Linux 上的 fork+exec)elapsed + fio 初始化(例如线程创建,因为我看到 --thread, ioengine initialisation) + fio job elapsed (runt) + fio stopped elapsed + process stop elapsed).您将其与 runt 进行比较,runttelapsed 的子组件。不太可能所有非 runt 组件都会立即发生(即占用 0 usecs),因此预计 runt 将小于 telapsed。尝试使用 --debug=all 运行 fio 只是为了查看它除了为作业实际提交 I/O 之外所做的所有事情。
  2. 这很难回答,因为这取决于您说“fio 执行”时的意思以及为什么(即这个问题很难以明确的方式解释)。您是否对 fio 为给定作业(runt)尝试提交 I/O 实际花费了多长时间感兴趣?您是否对您的系统启动/停止一个新进程需要多长时间感兴趣,而该进程恰好在给定时间段内尝试提交 I/O(telapsed)?您对提交 I/O(以上都不是)花费了多少 CPU 时间感兴趣吗?因此,因为我很困惑,所以我会问你一些问题:你打算将结果用于什么目的?为什么?
  3. 为什么不看看源代码? 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/

相关文章:

c++ - 我无法直接将模板函数传递给 std::apply 但我可以通过 lambda

linux - 将所有脚本中的变量评估方法从 $VAR_NAME 更改为 ${VAR_NAME}

java - Tomcat 不会在端口 8080 上响应

javascript - 运行 HTML5 Web Worker 时 Google Chrome 无响应

G1 的 java GC 堆参数

javascript - 使用 GoJS 时提高性能

c++ - QT中的动态内存释放

c++ - 高级文件类型猜测器

c++ - 在 clang RefactoringTool 中替换返回空 map

c++ - 何时创建多少个线程?