【问题标题】:How to measure execution time of file I/Os in C programs on Linux?如何在 Linux 上测量 C 程序中文件 I/O 的执行时间?
【发布时间】:2020-08-05 02:26:15
【问题描述】:

我想测量 Linux 上 C 程序中文件 I/O 的执行时间。 我发现了很多关于测量时间的问题和答案。

但是,我认为任何答案都不符合我的目的。

在我的情况下,与实时时钟相关的功能不合适 因为我想排除其他进程消耗的时间。 (例如gettimeofdayclock_gettime(CLOCK_MONOTONIC_RAW)

在我的情况下,与 CPU 时间相关的功能也不合适, 因为我想包括磁盘 I/O 的等待时间。 (例如getrusageclockclock_gettime(CLOCK_PROCESS_CPUTIME_ID)

有什么建议吗?

【问题讨论】:

    标签: c linux time disk measure


    【解决方案1】:

    阅读time(7)page cache,然后阅读有关operating systems 的教科书。

    我想在 Linux 上测量 C 程序中文件 I/O 的执行时间

    你的问题没有真正的意义。磁盘 I/O 或file systems 是一个完整的计算机活动,而不仅仅是由特定的process 完成一些syscalls(2)。例如, find(1) 系统上的一些大文件(几十兆字节)并在其上运行 time wc 几次。请参阅wc(1)time(1)

    特别是内核将处理page faults(在处理器内部MMU 的帮助下),并且给定页面可以由不同进程多次mmap(2)

    Drepper 的论文 How to write shared librariesdynamic linker(参见 ld.so(8) ...)是相关的。

    实际上,在 2020 年,大多数 ELF 可执行文件是动态链接的(例如,链接到 libc.so)。请参阅ldd(1)ps(1)pmap(1)proc(5)

    另请参阅kernelnewbies.orgAdvanced Linux Programminghttps://www.linuxatemyram.com/

    【讨论】:

      【解决方案2】:

      您可以使用openreadwrite 调用直接测量磁盘 I/O 速度,避免自动流缓冲(如fopen)。

      对于readwrite,您应该验证读取和写入的字节数。

      要计时,只需使用clock_gettime(CLOCK_PROCESS_CPUTIME_ID,*tp)CLOCK_THREAD_CPUTIME_ID(参见this question)。我这么说是因为 Linux includes kernel/system time 代表进程(这在 clock_gettime 的 man 条目中只有 on OpenBSD 是明确的)。如果要测量连续(非突发)速度,您可能需要确保正在填充磁盘缓存,并且可能还需要填充内核磁盘页面缓存。这样您对open 的调用将仅在完成文件写入后返回。

      只有使用上述过程才能获得正常使用内核磁盘页面缓存的结果。您可以进一步绕过内核页面缓存,如下所示。但请记住,这些是“原始”结果,不一定与您使用内核页面缓存时的结果相对应,正如 Basile Starynkevitch 所描述的那样。

      使用O_SYNC|O_DIRECT 操作模式标志调用open(参见this question)。 O_DIRECT 绕过内核页面缓存。这样,您的数据将被确认完全传输到磁盘而不是计算机 RAM 缓存。

         O_DIRECT (since Linux 2.4.10)
                Try to minimize cache effects of the I/O to and from this
                file.  In general this will degrade performance, but it is
                useful in special situations, such as when applications do
                their own caching.  File I/O is done directly to/from user-
                space buffers.  The O_DIRECT flag on its own makes an effort
                to transfer data synchronously, but does not give the
                guarantees of the O_SYNC flag that data and necessary metadata
                are transferred.  To guarantee synchronous I/O, O_SYNC must be
                used in addition to O_DIRECT.  See NOTES below for further
                discussion.
      

      除非我弄错了,否则您不必担心内核会在测试中将另一个进程调度到您的 CPU 上,除非您的大多数 CPU 都很忙。即使它确实安排了另一个进程,它也可能在同步写入完成后立即返回到您的进程(如果您知道,请在评论中告诉我)。因此使用CLOCK_MONOTONIC_RAW 可能无关紧要。 cpuset 可能有用。

      请参阅 Linux man 条目和 GNU C 库参考手册。另请参阅 fsyncthis question,了解页面缓存写入需要多长时间才能到达磁盘。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多