Linuxでファイルアクセス用に大きなバッファを設定できますか?

Linuxでファイルアクセス用に大きなバッファを設定できますか?

完全なファイルシステムを読み取り、ファイルをハッシュするプロセスがあります。読み込みにより多くの照会が発生するため、速度が遅くなります(約4倍)。各ファイルの小さなチャンクは4つのスレッドのそれぞれから読み取られますが、コピー(cp)を介して順次読み込みをテストすると、より速く読み取ることができます。 CPU使用率は25%なので、CPUバインディングではありません。私は追求することが問題だと確信しています。

カーネルはアクセス速度を上げるためにかなり洗練されたディスク読み取り戦略があることを読んだので、カーネルバッファがここでの使用を制限しているかどうか、そしてより多くのバッファリングを可能にするように増やすことができるかどうか疑問に思います。私は私が使用しているプログラムが各読み取り呼び出しで非常に少量のデータしか要求しないと仮定しているので、これがうまくいくかどうかわかりません。

各ファイルを正確に1つずつメモリに読み込むのが最も効率的だと思いますが、今はアプリケーションを書き換えることはできません(私のものではなく、大きくて膨らんだようです)。しかし、OSに各ファイルを順番に読み込むことはできますか?ファイルは完全に(または部分的には、一度に約100〜500 MB)バッファーで開かれているため、アプリケーションスレッドは小さなファイルのそれぞれのみを使用します。代わりにメモリ読み取りを呼び出します。ディスク(探索結果)?

後で追加:

@Artem Cachingはここで何もしないようで、その理由を理解できると思います。カーネルは「合理的」にしようとし、「ユーザーが最初のMBを要求したため、500MBのファイル全体をメモリに読み込むことはありません」と言います。これは意味があります。読み込まれたコンテンツはキャッシュされているため、再利用される場合(たとえば、他のプロセスで)、メモリからインポートできます。しかし、私が望むのは、カーネルが最初の読み取りからファイル全体をキャッシュにロードすることです(最初の読み取りは何ですか、おそらく2MBですか?)。

したがって、システムコールが読み込まれます(fd、buf、size)。私がプログラミングしている場合、CIは絶対サイズほど大きなバッファを入れません。多くのプログラマーがそうするかどうか疑わしいです。したがって、おそらくより一般的なバッファサイズ(1〜2 MB)を使用して書き込まれた可能性があります。

したがって、ユーザープロセスは1〜2 MBを取得し、ハッシュ機能に移動し、しばらく忙しい状態を維持し、ディスクを読み取るためにカーネルを悩ませることを停止します。同時に、異なるディスク読み取りは、ディスクの異なる部分を読み取るために、別のスレッドによってキューに追加されます。そのため、カーネルが稼働しており、ディスクがディスクの別の部分を探しています。これには約15ミリ秒かかります。

残念ながら、ファイルはディスクのかなり大きな連続ブロックに保存されることがよくあります。したがって、ディスクから最初のファイルを継続的に読み取ると、ナビゲーションなしで数十万、さらには百万ブロック、数十または数百MBを読み取ることができます。高性能ディスクの読み取りは、私が推奨したいものです。

しかし、そうではありません。プロセスは小さなデータの塊を要求しており、カーネルは正常な状態を維持しようとしています。狂ったように見つけるためにすべての時間を費やします。

「cp -r」とは対照的です。 1つのスレッドだけがカーネルにファイルの読み込みを要求します。だから、誰もディスクヘッドにディスクの別の部分を見つけるようにMBまたは2 MBごとに指示しないので、後続の読み取りがカーネルに入ると、ドライブはデータをすばやく取得できます。

より大きなバッファでコードを書き換えることができるので、これは私にとってオプションです。しかし、前述したように、カーネルに「事前に」より多くのバッファリングを実行するように指示することが可能かどうかを知りたいです。一種の「先読みキャッシュ」と同じです。ファイルが開かれると、完全に読み込まれることが予想されるので、各ファイルのカーネルバッファを読み取るために物理ディスクを停止する前に、読み取りバッファは最小nバイトで満たされます。

答え1

Linuxカーネルは、ファイルシステムのキャッシュに使用可能なRAM全体を使用します。もう活用することはできません。

より高いswappiness値を試してみることもできますが、99%役に立たないと確信しています。

たぶん、より多くのメモリが必要になるかもしれません。

関連情報