Linuxカーネルは、I / Oの操作を高速化するためにページキャッシュを実装します。
研究とテストのためにページキャッシュをオフまたはオンにすることができれば役立ちます。
Linuxページキャッシュを無効にする方法は?
アップデート1:ページキャッシュをグローバルにオフにできない場合は、Linuxファイルシステムを連続書き込みモードでマウントできます。私が正しく理解した場合、EXT2、EXT4、およびXFSのマウントオプションはdax
write-throughモードを実装します。ページキャッシュを防ぐための有効なオプションですか(少なくともファイルシステムの場合)。
https://www.kernel.org/doc/Documentation/filesystems/dax.txt
アップデート2:明らかにDAXはやや死んでおり、ページキャッシュを適切にオフにすることはできません(グローバルには、まったくオフにせず、個々のアプリケーションに対して限られた方法でのみ)。しかし、実際にLinuxファイルシステム(たとえば、mountパラメータを介して)を連続書き込みモードに設定する方法はありませんか?
アップデート3:このツールは、dd
Linuxカーネルページキャッシュを簡単にバイパスできるアプリケーションの一例ですoflag=direct
。
https://man7.org/linux/man-pages/man1/dd.1.html
アップデート4:明らかに、FUSE(ユーザー空間のファイルシステム)モジュールを使用するファイルシステムは、ページキャッシュへの読み取りと書き込みが完全にバイパスされる直接IOモードで使用できます。
https://www.kernel.org/doc/Documentation/filesystems/fuse-io.txt
アップデート5:マウントオプションを-o sync
使用すると、一部のファイルシステム(ext2、ext3、FAT、VFAT、UFS)に対して連続書き込みモードとページキャッシュバイパスが可能です。
答え1
一時的にページキャッシュを無効にすることもできません。
しかし、特定のアプリケーションは、実際には、次の方法でキャッシュをバイパスするために最善を尽くす可能性があります。開いている_ingファイルにはO_DIRECTフラグが設定されています。
O_DIRECT (since Linux 2.4.10) Try to minimize cache effects of the I/O to and from this file… File I/O is done directly to/from user-space buffers. The O_DIRECT flag on its own makes an effort to transfer data synchronously, but does not give the guarantees of the O_SYNC flag that data and necessary metadata are transferred. To guarantee synchronous I/O, O_SYNC must be used in addition to O_DIRECT.
これは、onが対応する変更されたソースコードを再構成できることを意味しますが、キャッシュなし、これはオープンとクローズのシステムコールを傍受し、変更されていないバイナリを実行するために使用できます。
もちろん、プロセスを遅くするいくつかの制限があります...テストしたことはありません。
一つのコースは永遠にできるキャッシュを空にする次のコマンドを使用します。
# echo 1 > /proc/sys/vm/drop_caches
答え2
HDDやSSDなどのブロックデバイスでページキャッシュをバイパスしようとするべきではないと思います。これは、これらのディスクの粒度が次のようになるためです。詰まった(512B、4KB、またはその他)ただし、r / wシステムコールがオンになっています。バイト。
不一致は、カーネルがディスクに書き込むデータを他の構成ブロックのデータと組み合わせて一度にディスクに書き込む必要があることを意味します(ブロック全体の書き込みを無視する場合も同様です)。読み取りの場合、カーネルは必要なデータを含むブロック全体を読み取り、必要な部分を提供します。
これらの不一致を理解することで、ページキャッシュが単純なスピードアップトリック以上であることがわかります。対照的に、ページキャッシュはディスクI / Oスタックにとって非常に重要です。より正確には、不一致はページキャッシュとバッファヘッダによって処理されますが、これはより複雑です。
とにかく、ページキャッシュを迂回するには、次のいくつかのヒントに従ってください。
ドイツDAX指数:仕事をしているならバイトアドレス指定機器(PMEMなど)を使用している場合は、DAXが最善の選択です。デバイス自体はバイト単位でアクセスできるため、カーネルは上記の不一致を心配する必要はありません。 DAXモードでは、ファイルシステムは単にページキャッシュをバイパスし、デバイスから直接読み書きを実行します。 DAXを参照してくださいできないブロックデバイスでお試しください!あなたは参照することができますファイルに直接アクセス詳細については。
O_DIRECT: ページキャッシュをバイパスするために、O_DIRECT フラグでファイルを開くこともできます。これは、ユーザースペースに独自の高性能キャッシュを持つアプリケーション用に設計されています。しかし、私が知っている限り、実行のみ可能です。調整それに取り組んでください。また、返されたときにデータがすでにディスクに存在することを確認しません。他のキャッシュメカニズムが実装されていないと、パフォーマンスがはるかに低下する可能性があります。マニュアルページをご覧くださいオープン(2)、またはこの議論Direct IOの意味を明確にします。、または一度試してみてください。また、@MC68020で関連部品をリストしました。
また、ページキャッシュの影響を受けずにファイルシステムのパフォーマンスを評価したい場合は、次のことを試すことができます。
同期:これ書く。ファイルを開くO_SYNC、各書き込みはデータがディスクにある場合にのみ返されます。オープン(2)O_SYNCでの書き込みパフォーマンスは、ページキャッシュが「無効」になっている場合と似ています(ページキャッシュにデータをコピーするなどの追加のオーバーヘッドがありますが、主なコストはディスクI / Oです)。
キャッシュの削除:これ読む。 @MC68020が述べたように、特定のタスクを実行する前にシステムキャッシュを削除できます。これは空のページキャッシュを提供するので、何かを読み取ると、ファイルシステムはディスクからそのエントリを取得します。コマンドは次のとおりです。
echo 1 > /proc/sys/vm/drop_caches
またはsysctl -w vm.drop_caches=1
。ここで確認してください/proc/sys/仮想マシン、「drop_cache」を検索してください。欠点は、ある場所での読み取りが初めてのみディスクに移動することです。次回はページキャッシュになります。
これが役に立つことを願っています:)