【问题标题】:Filesystem VS Raw disk benchmarking in CC中的文件系统VS原始磁盘基准测试
【发布时间】:2015-05-02 04:39:37
【问题描述】:

我正在做一些基准测试(在 OS X 上),以了解文件系统的使用如何影响带宽等。我正在使用并发,希望在 FS 中创建碎片。

但是,使用 FS 似乎比原始磁盘访问更有效。为什么?

这是我的代码:

#include <pthread.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

#define NO_THREADS (2)
#define PACKET_SIZE (1024 * 4)
#define SIZE_TO_WRITE (1024 * 1024 * 1024)

void write_buffer(void *arg) {
    int *p_start = arg;
    int start = *p_start;
    char buffer[PACKET_SIZE];


    char path[50];
    sprintf(path, "file%d", start);
    int fd = open(path, O_CREAT | O_WRONLY | O_APPEND);

    //int fd = open("/dev/rdisk0s4", O_WRONLY);

    if (fd < 0) {
        fprintf(stderr, "Cound not open.\n", stderr);
        goto end;
    }

    //lseek(fd, start * SIZE_TO_WRITE, SEEK_SET);

    int current;
    for (current = start; current < start + SIZE_TO_WRITE; current += PACKET_SIZE) {

        int i;
        for (i = 0; i < PACKET_SIZE; ++i) {
            buffer[i] = i + current;
        }

        if (PACKET_SIZE != write(fd, buffer, PACKET_SIZE)) {
            fprintf(stderr, "Could not write packet %d properly.", current);
            goto close;
        }
    }

    fsync(fd);

  close:
    close(fd);
  end:
    pthread_exit(0);
}

void flush(void) {
    fflush(stdout);
    fflush(stderr);
}

int main(void) {
    pthread_t threads[NO_THREADS];
    int starts[NO_THREADS];
    int i;

    atexit(flush);

    for (i = 0; i < NO_THREADS; ++i) {

        starts[i] = i;

        if(pthread_create(threads + i, NULL, (void *) &write_buffer, (void *)(starts + i))) {
            fprintf(stderr, "Error creating thread no %d\n", i);
            return EXIT_FAILURE;
        }
    }

    for (i = 0; i < NO_THREADS; ++i) {
        if(pthread_join(threads[i], NULL)) {
            fprintf(stderr, "Error joining thread\n");
            return EXIT_FAILURE;
        }
    }

    puts("Done");

    return EXIT_SUCCESS;
}

在 FS 的帮助下,2 个线程在 31.33 秒内写入文件。没有,几分钟后就实现了……

【问题讨论】:

    标签: c filesystems disk raw-disk


    【解决方案1】:

    当您使用/dev/rdisk0s4 而不是/path/to/normal/file%d 时,对于您执行的每次写入,操作系统都会发出磁盘I/O。即使该磁盘是 SSD,这意味着往返时间平均可能至少为几百微秒。相反,当您写入文件时,文件系统实际上直到稍后才向磁盘发出写入。 Linux man page 很好地描述了这一点:

    从 write() 成功返回并不能保证数据已提交到磁盘。事实上,在一些有缺陷的实现中,它甚至不能保证已成功为数据保留空间。唯一可以确定的方法是在完成所有数据写入后调用 fsync(2)。

    因此,您写入的数据正在由文件系统缓冲,它只需要在内存中进行复制——这可能最多需要几微秒的时间。如果你想做一个苹果对苹果的比较,你应该确保你对两个测试用例都进行同步 I/O。即使在整个测试完成后运行fsync 也可能会让文件系统更快,因为它会将 I/O 批量化为一个连续的流式写入,这可能比直接在磁盘上进行的测试更快。 .

    一般来说,编写良好的系统基准测试非常困难,尤其是当您很多了解要测试的系统时。如果您想要高质量的结果,我建议您使用现成的 Unix 文件系统基准测试工具包——否则,您可能会花费一生的时间来学习您正在测试的操作系统和 FS 的性能问题……不是这样的一件坏事,如果你像我一样对它感兴趣:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      相关资源
      最近更新 更多