Linux は、ファイルを順番に読み取るときに先読み (/sys/block//queue/read_ahead_kb で指定) を実行します。
興味のあるOS: レッドハットリナックス 興味のあるファイルシステム: xfs、ext4
シーケンシャル読み取りが完了したかどうかを判断する基準は何ですか?preadを使用して同じファイルに対して複数の同時読み取りを行うことを検討してください(詳しくは、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... の読み取り。
この場合、上記の微妙な順序外の読み取りによって先読みを回避できるでしょうか?
もしそうなら、2 つの異なる FD を使用するとこの問題は解決しますか (つまり、78-89-23-34 の読み取りに別の FD を使用する)? (つまり、10-20-30-40-50 の読み取りでは通常どおり先読みが行われます)
答え1
この場合、上記の微妙な順序外読み取りによって先読みを回避できるでしょうか?
はい、同じファイル記述子からの順序外の読み取りは先読みに影響を与える可能性がありますが、カーネルはこれを考慮しようとします — 少なくとも、連続読み取りと並行した小さな「ランダム」読み取りの場合。オンデマンド先読み設計の説明、 特に:
インターリーブされたシーケンシャル読み取りでは、同じ fd 上の同時ストリームが互いの先読み状態を無効にする可能性があります。そのため、PG_readahead を使用して (start+size-async_size) の新しい先読みページにフラグを立て、それを先読みインジケーターとして使用します。このフラグは、すでにキャッシュされているページには設定されません。これは、先読みの無駄な手間を省き、無意味なページ キャッシュ検索を節約するためです。
これがどこに当てはまるかは、ondemand_readahead
、 特にその呼びかけtry_context_readahead
と周囲のコメント。
パフォーマンスのボトルネックを解消しようとするときはいつも、潜在的なボトルネックをヒントとしてのみ考慮する必要があります。独自のベンチマークを考案し、特定のシナリオのパフォーマンス特性を分析する必要があります。たとえば、順次読み取りの先読みの結果として、順序外読み取りがページ キャッシュにすでに存在するページにのみヒットする場合があります。