當對相同檔案進行並發讀取時,Linux 會提前讀取

當對相同檔案進行並發讀取時,Linux 會提前讀取

當按順序讀取檔案時,Linux 會執行預讀(在 /sys/block//queue/read_ahead_kb 中指定)。

有興趣的作業系統:紅帽Linux 有興趣的檔案系統:xfs、ext4

決定順序讀取完成的標準是什麼?考慮使用 pread (https://man7.org/linux/man-pages/man2/pwrite.2.html)具有相同或不同的 FD。

例如

相同的FD。讀取位置 10-20-30-78-89(超出 seq 讀取)-40-50-60-70 - 23-34(超出 seq 讀取)- 80-90-100...

在這種情況下,上述微妙的亂序讀取是否可以避免預讀?

如果是這樣,使用兩個不同的 FD 是否可以解決此問題(即使用單獨的 FD 來讀取 78-89-23-34)? (即預讀將照常進行 10-20-30-40-50 次讀取)

答案1

在這種情況下,上述微妙的亂序讀取是否可以避免預讀?

是的,從同一檔案描述子中進行亂序讀取可能會影響預讀,但核心會嘗試考慮到這一點——至少對於與順序讀取並行的小型「隨機」讀取而言。看按需預讀設計的描述, 尤其:

在交錯順序讀取中,同一 fd 上的並發流可能會使彼此的預讀狀態無效。因此,我們使用 PG_readahead 標記 (start+size-async_size) 處的新預讀頁面,並將其用作預讀指示器。該標誌不會在已快取的頁面上設置,以避免無意義的預讀,從而節省無意義的頁面快取查找。

您可以透過查看來了解它的適用範圍ondemand_readahead, 尤其它的呼籲try_context_readahead以及周圍的評論。

像往常一樣,在嘗試消除效能瓶頸時,您不應該考慮潛在的瓶頸,除非作為提示:您應該設計自己的基準並分析特定場景的效能特徵。例如,可能的情況是,您的失序讀取僅命中了由於順序讀取的預讀而已經存在於頁面快取中的頁面。

相關內容