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,并且文件大小确实保持不变。但是,我仍然看到经过多次写入之后,经过的时间开始增加。
答案 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
。