Linuxカーネルに特定の割合のメモリのみをバッファキャッシュとして使用するように指示する方法はありますか?一時的にキャッシュを消去するために使用できることはわかっていますが、/proc/sys/vm/drop_caches
キャッシュがメインメモリの50%を超えて増加するのを防ぐ永続的な設定はありますか?
私がこれをやろうとしているのは、ディスクからデータを継続的に提供し、数時間以内に物理メモリ全体をバッファキャッシュとして使用するCeph OSDを実行しているサーバーがあるためです。同時に、大量(数十GB)の物理メモリを割り当てるアプリケーションを実行する必要があります。一般的な信念(バッファキャッシングに関するほとんどすべての質問に提供されているアドバイスを参照)とは異なり、クリーンなキャッシュエントリを削除して自動的にメモリを解放することは、いいえ一時的:バッファキャッシュがいっぱいになると(*)アプリを実行するのに最大1分かかりますが、キャッシュをクリアした後は(を使用してecho 3 > /proc/sys/vm/drop_caches
)同じアプリがほぼすぐに起動します。
(*)名前付き関数のVtuneによると、この起動時間中にアプリケーションは新しいメモリでクラッシュしますが、その時間の100%をカーネルで消費しますpageblock_pfn_to_page
。この機能は、巨大なページを見つけるために必要なメモリ圧縮に関連しているようで、これは実際に断片化が問題であると信じています。
ベストアンサー1
絶対的な制限は必要ありませんが、バッファをより速くフラッシュするようにカーネルに圧力をかける場合は、次の点を見てください。vm.vfs_cache_pressure
この変数は、VFSキャッシュ(ページキャッシュとスワップと比較)キャッシュに使用されるメモリを回復するカーネルの傾向を制御します。この値を大きくすると、VFS キャッシュの回収率が高くなります。
範囲は0〜200です。より高い圧力を得るには、200ページに進みます。デフォルト設定は100です。このslabtop
コマンドを使用してメモリ使用量を分析することもできます。あなたの場合は、dentry
その金額が*_inode_cache
高くなければなりません。
絶対限度が欲しいなら探してみなければなりませんcgroups
。 Ceph OSDサーバーをcgroupに配置し、memory.limit_in_bytes
cgroupのパラメータを設定して使用できる最大メモリを制限します。
memory.memsw.limit_in_bytes
結合メモリとスワップ使用量の最大量を設定します。単位が指定されない場合、値はバイトとして解釈されます。ただし、より大きな単位を表すためにサフィックスを使用できます。 k または K はキロバイト、m または M はメガバイト、g または G はギガバイトです。
引用:
[1]-GlusterFS Linuxカーネルのチューニング
[2]-RHEL 6リソース管理ガイド