【问题标题】:How to measure wallclock time of file I/O如何测量文件 I/O 的挂钟时间
【发布时间】:2014-12-15 19:09:15
【问题描述】:

我正在用 C 编写几个基准程序来完成以下任务:

  1. 从网络磁盘读取的速度。打印读取 8192 个字节所需的秒数。
  2. 从本地计算机上的本地目录 /tmp 读取的速度。打印读取 8192 个字节所需的秒数。
  3. 从磁盘页面缓存中读取的速度。打印读取 8192 个字节所需的秒数。
  4. 写入网络磁盘的速度。打印写入 8192 字节所需的秒数。
  5. 写入本地计算机上本地目录 /tmp 的速度。打印写入 8192 字节所需的秒数。

这里的目标是测量执行文件读取或写入所花费的时间(使用readwrite 以避免来自fread 的任何缓冲时间)

我对 1 和 2 的一般做法是创建一个 8192 字节的文件并将其写入磁盘(无论是本地目录还是网络磁盘),然后调用 sleep(10) 等待页面缓存刷新所以我正在测量实际 I/O 的时间,而不是缓存 I/O。然后我测量了数千次空for循环所需的时间,然后是读取8192字节所需的时间,然后减去两者,除以所有迭代的平均值。我的代码如下:

struct timespec emptyLoop1, emptyLoop2;
clock_gettime(CLOCK_REALTIME, &emptyLoop1);
for(i = 0, j = 0; i < ITERATIONS; i++) {
    j+=i*i;
}
clock_gettime(CLOCK_REALTIME, &emptyLoop2);
char readbuf[NUM_BYTES];

struct timespec beforeRead, afterRead;
clock_gettime(CLOCK_REALTIME, &beforeRead);
for(i = 0, j = 0; i < ITERATIONS; i++){
    j+=i*i;
    read(fd, readbuf, NUM_BYTES);
}

这足以准确测量从这些位置读取的时间吗?

接下来,我对如何从页面缓存中读取感到困惑。它存在于磁盘上的什么位置,我如何访问它?最后,4 和 5 的一些技巧显然比看起来要难得多,但我不确定我错过了什么。

【问题讨论】:

  • 关于1和2:看看this 关于4和5:你应该刷新缓冲区才能实际写入(主要用于本地目录)。检查 fflush 的手册页
  • 关于1、2、3:第一次读取网络驱动器和本地驱动器后,它们不会在内存缓存中吗?

标签: c benchmarking


【解决方案1】:

以下是我的文件读取功能,可以选择使用或不使用基于内存的缓存。如果先写文件,则需要类似的 open 语句。请注意,不能通过 LAN 使用直接 I/O,并且缓存可能是不可预测的。更多详细信息以及源代码和执行文件的访问权限可以在http://www.roylongbottom.org.uk/linux_disk_usb_lan_benchmarks.htm找到。

int readFile(int use, int dsize)
{
    int p;

    if (useCache)
    {
          handle = open(testFile, O_RDONLY);
    }
    else
    {
          handle = open(testFile, O_RDONLY | O_DIRECT);
    }

    if (handle == -1)
    {
        printf (" Cannot open data file for reading\n\n");
        fprintf (outfile, " Cannot open data file for reading\n\n");
        fclose(outfile);
        printf(" Press Enter\n");
        g  = getchar();
        return 0;
    }

    for (p=0; p<use; p++)
    {
        if (read(handle, dataIn, dsize) == -1)
        {
            printf (" Error reading file\n\n");
            fprintf (outfile, " Error reading file\n\n");
            fclose(outfile);
            close(handle);
            printf(" Press Enter\n");
            g  = getchar();
            return 0;
        }           

    }
    close(handle);
    return 1;
}

【讨论】:

    猜你喜欢
    • 2013-07-04
    • 1970-01-01
    • 2020-08-05
    • 2013-06-30
    • 1970-01-01
    • 2023-03-24
    • 2013-12-18
    • 2010-12-04
    相关资源
    最近更新 更多