簡體   English   中英

C磁盤I / O - 在讀取文件的相同偏移量后寫入將使讀取吞吐量非常低

[英]C Disk I/O - write after read at the same offset of a file will make read throughput very low

背景:

我正在開發一個與數據庫相關的程序,我需要按順序將臟元數據從內存刷新到磁盤。 / dev / sda1是volumn格式,因此將逐塊訪問/ dev / sda1上的數據,如果按順序訪問,則塊在物理上相鄰。 我使用直接I / O,因此I / O將繞過文件系統的緩存機制並直接訪問磁盤上的塊。

問題:

在打開/ dev / sda1之后,我將讀取一個塊,更新塊並將塊重新寫回/ dev / sda1開頭的相同偏移量。

代碼如下 -

//block_size = 256KB
int file = open("/dev/sda1", O_RDWR|O_LARGEFILE|O_DIRECT);
for(int i=0; i<N; i++) {
    pread(file, buffer, block_size, i*block_size);
    // Update the buffer
    pwrite(file, buffer, block_size, i*block_size);
}

我發現如果我不做pwrite,讀取吞吐量是125 MB / s

如果我執行pwrite,讀取吞吐量將為21 MB / s ,寫入吞吐量為169 MB / s

如果我在pwrite之后pread,寫吞吐量是115 MB / s ,讀吞吐量是208 MB / s

我也試過read()/ write()和aio_read()/ aio_write(),但問題仍然存在。 我不知道為什么在讀取文件的相同位置后寫入會使讀取吞吐量如此之低。

如果一次訪問更多的塊,就像這樣

pread(file, buffer, num_blocks * block_size, i*block_size);

問題會緩解,請參閱圖表

我使用直接I / O,因此I / O將繞過文件系統的緩存機制並直接訪問磁盤上的塊。

如果設備上沒有文件系統並直接使用設備進行讀/寫,則圖片中沒有文件系統緩存。

您觀察到的行為是典型的磁盤訪問和IO行為。

我發現如果我不做pwrite,讀取吞吐量是125 MB / s

原因:磁盤只是讀取數據,它不必返回偏移量並寫入數據,減少1次操作。

如果我執行pwrite,讀取吞吐量將為21 MB / s,寫入吞吐量為169 MB / s。

原因:您的磁盤可能具有更好的寫入速度,可能是磁盤緩沖區正在緩存寫入而不是直接命中介質。

如果我在pwrite之后pread,寫吞吐量是115 MB / s,讀吞吐量是208 MB / s。

原因:最有可能寫入的數據是在磁盤級別緩存的,因此讀取數據來自緩存而不是媒體。

要獲得最佳性能,您應該一次使用異步IO和塊數。 但是,您必須使用合理數量的塊,並且不能使用非常大的數量。 應該通過反復試驗找出最佳的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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