将字节以偏移量0写入文件时,能否保持写入时间稳定?

时间:2019-07-07 19:11:47

标签: c++ c linux filesystems ext4

Linux内核:5.1.15 glibc:2.29 g ++:9.1.1 标准:c ++ 17 -Ofast ext4fs 硬盘:希捷ST1000LM014 1TB SSHD 2.5英寸

std::array<int, 10000> state;

我将状态下的 nbrmsgs 整数写入打开的文件中,如下所示:

#include <fcntl.h>
#include <unistd.h>
persistfd=open("persist", O_CREAT | O_WRONLY | O_SYNC, S_IRUSR | S_IWUSR);

致电:

pwrite(persistfd, state.data(), nbrmsgs*sizeof(int), 0)

全部使用同步写入。要求是确保在继续操作之前将数据写入文件(即,如果写入后进程崩溃,则数据在文件中,但是如果内核层或硬件层失败,那不是我的问题)

以前,我使用 write 而不是pwrite,没有指定偏移量。因此,这是将字节添加到文件末尾。

我当时正在监视写操作的经过时间,在我的平台上大约1微米左右,它一直很稳定,直到文件达到一定大小,然后经过的时间开始增长,大概是由于重新放置文件所涉及的全部时间inode和C库调用下的所有任务。)

我将写入更改为pwrite,偏移量为0,并且文件大小确实保持不变。但是,我仍然看到经过多次写入之后,经过的时间开始增加。

  1. 由于文件没有“增长”,我期望经过的时间应该保持稳定对吗?
  2. 是否可以对ext4fs或内核参数进行用户级别调整,以使写入0偏移相同数据大小的可能性更大,并且在文件不增长的情况下,观察到的经过时间保持稳定?

1 个答案:

答案 0 :(得分:2)

所以您说您希望它稳定。不,你没有。您只认为您希望它稳定。

要使其稳定:

1)获得专用的SSD

2)用write()

3)fflush()在每次测量之前。在OS由于内存压力而不得不分割写入的情况下,这比O_SYNC的性能更好。使用O_DIRECT看起来很稳定,但实际上不是。

除了往返磁盘刷新外,没有任何其他模型可以使稳定时间有意义。这也是最慢的模型。确定你想要什么。

或者,如果您根本不关心崩溃,请使用老式的RAM驱动器。

# mknod -m 660 /dev/ram0 b 1 0将在ram0中制作一个专用的ram盘,此后可以在其上涂抹。为了保持稳定,您仍然需要打开O_DIRECT