[英]Is it possible to keep writing time stable when bytes are written at offset 0 on a file?
linux內核:5.1.15 glibc:2.29 g ++:9.1.1 std:c ++ 17 -Ofast ext4fs HDD:Seagate ST1000LM014 1TB SSHD 2.5“
std::array<int, 10000> state;
我從狀態將nbrmsgs int寫入打開的文件中,如下所示:
#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)獲得專用的SSD
2)用write()
寫東西
3)每次測量前先fflush()
。 在OS由於內存壓力而不得不分割寫入的情況下,這表現得比O_SYNC
更好。 使用O_DIRECT
看起來很穩定,但實際上並非如此。
除了往返磁盤刷新之外,沒有任何一種模型能使穩定時間有意義。 這也是最慢的模型。 決定你想要什么。
或者,如果您根本不關心崩潰,請使用老式的RAM驅動器。
# mknod -m 660 /dev/ram0 b 1 0
將在ram0
創建一個專用的ram磁盤,之后可以在其上進行塗抹。 您仍然需要打開O_DIRECT
才能使其穩定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.