linux内核: 5.1.15 glibc: 2.29 g++:9.1.1STD: c++17 -Ofast ext4fs HDD: Seagate ST1000LM014 1TB SSHD2.5“
std::array<int, 10000> state;我将nbrmsgs ints从状态写入打开的文件,如下所示:
#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)这都是使用同步写入。要求是确保数据在继续之前被写入文件(即如果写入后进程崩溃,数据在文件中,但是如果内核层或硬件层失败,这不是我的问题)。
以前,我使用的是 used 而不是pwrite,而没有指定偏移量。因此,这是在将字节添加到文件的末尾。
我在监视编写过程中经过的时间,在我的平台上,它在1微米左右相当稳定,直到文件达到一定的大小,然后运行时间开始增长,大概是因为重新定位inode和C库调用下的所有任务。
我用偏移量0将写更改为pwrite,并且文件大小确实保持不变。然而,我仍然看到经过的时间开始增长,在许多pwrites之后。
发布于 2019-07-07 20:17:28
所以你说你希望它稳定下来。不,你不想。你只想让它稳定下来。
为了让它稳定:
1)获得一个专用的SSD
2)用write()写你的东西
3)每次测量前的fflush()。在操作系统由于内存压力而不得不拆分写的情况下,这比O_SYNC更好。O_DIRECT的使用看起来是稳定的,但实际上并非如此。
没有任何一个模型,在稳定的时代是有意义的,除了往返冲洗磁盘。这也是最慢的模型。决定你想要什么。
或者,如果您根本不关心崩溃,那么使用老式的RAM驱动器。
# mknod -m 660 /dev/ram0 b 1 0将在ram0中制作一个专用的内存磁盘,之后您可以在上面乱写。您仍然需要使用O_DIRECT打开它才能保持稳定。
https://stackoverflow.com/questions/56925312
复制相似问题