簡體   English   中英

當字節以偏移量0寫入文件時,能否保持寫入時間穩定?

[英]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. 我期望文件不會不“增長”而經過的時間應該保持穩定,這對我有錯嗎?
  2. 是否可能對ext4fs或內核參數進行用戶級別的調整,以使寫入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM