gpt4 book ai didi

c++ - 当字节写入文件的偏移量 0 时,是否可以保持写入时间稳定?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:32 25 4
gpt4 key购买 nike

Linux 内核:5.1.15glibc:2.29g++:9.1.1标准:C++17-Ofastext4文件系统硬盘:希捷 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,文件大小保持不变。然而,我仍然看到在多次 pwrites 之后耗时开始增长。

  1. 既然文件不会“增长”,我期望耗时应该保持稳定是错误的吗?
  2. 是否有可能对 ext4fs 或内核参数进行用户级别的调整,使 pwriting 到 0 偏移相同大小的数据更有可能,并且在文件不增长的情况下,观察到的耗时保持稳定?

最佳答案

所以你说你希望它稳定。不,你不知道。你只是认为你想要它稳定。

为了让它稳定:

1) 获取专用 SSD

2) 用 write() 写你的东西

3) fflush() 每次测量前。在操作系统由于内存压力而不得不拆分写入的情况下,这比 O_SYNC 表现得更好。使用 O_DIRECT 看似稳定,但实际上并非如此。

除了往返刷新到磁盘之外,没有稳定时间有意义的模型。这也是最慢的模型。决定你想要什么。

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

# mknod -m 660/dev/ram0 b 1 0 将在 ram0 中制作一个专用的 ram 磁盘,您可以在其上涂鸦。您仍然需要使用 O_DIRECT 打开才能稳定。

关于c++ - 当字节写入文件的偏移量 0 时,是否可以保持写入时间稳定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56925312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com