Linuxのバッファキャッシュのサイズを制限する


25

Linuxカーネルにバッファキャッシュに特定の割合のメモリのみを使用するように指示する方法はありますか?私/proc/sys/vm/drop_cachesは一時的にキャッシュをクリアするために使用できることを知っていますが、例えばメインメモリの50%以上に成長するのを防ぐ永続的な設定はありますか?

これを行う理由は、ディスクからのデータを常に提供し、数時間以内に物理メモリ全体をバッファキャッシュとして使い果たすCeph OSDを実行しているサーバーがあるためです。同時に、大量(数十GB)の物理メモリを割り当てるアプリケーションを実行する必要があります。一般的な信念に反して(バッファキャッシュに関するほぼすべての質問に与えられたアドバイスを参照)、クリーンキャッシュエントリを破棄してメモリを自動的に解放すること瞬時ではありません:バッファキャッシュがいっぱいになると、アプリケーションの起動に最大1分かかることがあります( *)キャッシュをクリアした後(を使用echo 3 > /proc/sys/vm/drop_caches)、同じアプリケーションがほぼ瞬時に起動します。

(*)この1分間の起動時間中、アプリケーションは新しいメモリに障害が発生しますが、Vtuneによると呼ばれる関数によると、その時間の100%がカーネルで費やされますpageblock_pfn_to_page。この機能は、巨大なページを見つけるために必要なメモリ圧縮に関連しているようで、実際に断片化が問題であると考えさせられます。


1
キャッシュ階層化と呼ばれるものがあります。ceph osdプールセット{cachepool} hit_set_count 1 ceph osdプールセット{cachepool} hit_set_period 3600 ceph osdプールセット{cachepool} target_max_bytes 1000000000000を参照してください。docs.ceph.com/docs/master/rados/operations/cache-tiering
マイケルD.

2
この問題は明らかにメモリを集中的に使用するアプリケーションの起動にのみ影響するため、実際に起動する前にキャッシュをクリアするスクリプトを使用してアプリを起動できます。おそらく、実行中はキャッシュ管理をカーネルに任せたままで、より高速に起動できます。
Thawn

回答:


14

絶対的な制限を望まないが、カーネルにバッファをより速くフラッシュするように圧力をかけるだけの場合は、 vm.vfs_cache_pressure

この変数は、ページキャッシュとスワップではなく、VFSキャッシュのキャッシュに使用されるメモリを再利用するカーネルの傾向を制御します。この値を増やすと、VFSキャッシュが再利用される割合が増えます。

範囲は0〜200です。圧力を上げるには200に向かって動かします。デフォルトは100に設定されていますslabtop。コマンドを使用してメモリ使用量を分析することもできます。あなたの場合、dentryand *_inode_cache値は高くなければなりません。

絶対的な制限が必要な場合は、検索する必要がありますcgroups。Ceph OSDサーバーをcgroup内に配置し、cgroupのmemory.limit_in_bytesパラメーターを設定して、使用できる最大メモリを制限します。

memory.memsw.limit_in_bytesメモリとスワップの使用量の合計の最大量を設定します。単位が指定されていない場合、値はバイトとして解釈されます。ただし、キロバイトの場合はkまたはK、メガバイトの場合はmまたはM、ギガバイトの場合はgまたはGのように、接尾辞を使用して大きな単位を表すことができます。

参照:

[1] -GlusterFS Linuxカーネルチューニング

[2] -RHEL 6リソース管理ガイド


1
limit_in_bytesセットを持つcgroup がそれを行うようです。ありがとう!
ウィム

4
私は考えるvfs_cache_pressureだけのdentryやiノードのキャッシュをクリアし、バッファキャッシュとは何の関係もありません。
kawing-chiu

vfs_cache_pressure上記の100値を増やすと、ワークロードに十分なRAMがない場合に役立ちます。RAMの使用量は削減されますが、全体的なI / Oパフォーマンスが低下します。
ミッコランタライネン

3

A%については知りませんが、時間制限を設定して、x分後に削除することができます。

ターミナルで最初に

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

現在のキャッシュをクリアします。

それ作るcron-job Altキーを押し-F2、タイプgksudo gedit /etc/crontabそして、底部付近に次の行を追加します。

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches

これは15分ごとにクリーニングします。最初のパラメーターを* / 15ではなく*または* / 5に変更することで、本当に必要な場合は1分または5分に設定できます。

キャッシュを除く空きRAMを表示するには:

free -m | sed -n -e '3p' | grep -Po "\d+$

ここで少し冗長性を感じます。私の知る限り、これに3 > drop_cachessync
-andras.tim

1
@ andras.tim no-syncはダーティページをディスクに書き込み、3をdrop_cachesに書き込むと、クリーンページやその他のキャッシュで使用されたメモリのみが回収/解放されます。同期を実行する必要はありませんが、実行すると、ダーティではなくクリーンなメモリが多くなり、キャッシュを削除するとより多くのメモリが解放されます
ダニエルS.スターリング

2

あなたの質問の最後のあなたの予感は正しい軌道に乗っていると思います。A、CPU間でページを移行するNUMA対応のメモリ割り当て、またはおそらく、連続した整列領域を見つけようとする透過的なhugepagesのデフラグコードのいずれかが疑われます。

特定のワークロードでの顕著なパフォーマンスの向上と、大きな利点を提供せずに膨大な量のCPU時間を消費する原因の両方について、ヒュージページと透過的なヒュージページが特定されています。

実行しているカーネル、/ proc / meminfo(または少なくともHugePages_ *値)の内容、および可能であればpageblock_pfn_to_page()を参照するvtuneプロファイラーコールグラフの詳細を知ることは役立ちます。

また、私の推測にふけるなら、hugepage defragを無効にしてみてください:

echo 'never'> / sys / kernel / mm / transparent_hugepage / defrag

(カーネルに応じて、代わりにこれがあります:)

echo 'never'> / sys / kernel / mm / redhat_transparent_hugepage / defrag

最後に、このアプリはあなたが書いた何十ものRAMを使用していますか?何語?

「メモリページの障害」という用語を使用しているので、操作の設計と仮想メモリについて十分に理解していると思います。私は、多くのI / Oを読み取らない、非常に積極的な障害が発生する状況/アプリケーションを想像するのに苦労しています。ほとんどの場合、制限しようとしているバッファーキャッシュからです。

(興味がある場合は、MAP_ANONYMOUS、MAP_POPULATE、mincore(2)などのmmap(2)フラグを確認してください。これらのフラグを使用すると、実際に物理ページがマッピングされている仮想ページを確認できます。

がんばろう!


2

セファロOSDは、1つの別個のプロセスである場合は、使用できるのcgroupをプロセスが利用するリソースを制御します:

group1のような名前のcgroupを、メモリ制限(たとえば、50GBのCPUなどの他の制限がサポートされています。例ではCPUも記載されています)で作成します。

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

次に、アプリが既に実行されている場合は、アプリをこのcgroupに追加します。

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

または、このcgroup内でアプリを実行します。

cgexec -g memory,cpu:group1 your_app_name

0

tunedは、使用状況に応じてシステム設定を動的に調整する動的な適応システム調整デーモンです。

 $ man tuned

関連ドキュメント、および構成ファイルを参照してください。

 /etc/tuned
 /etc/tuned/*.conf
 /usr/share/doc/tuned-2.4.1
 /usr/share/doc/tuned-2.4.1/TIPS.txt

This parameter may be useful for you.

** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs

追加情報

同期コマンドはバッファをフラッシュし、つまりは、ディスクに書き込まれるすべての未書き込みデータを強制的に、もう1つは必ずすべてが安全に書き込まれることになりたいと思っているときに使用することができます。従来のUNIXシステムには、30秒ごとに同期を実行するupdateというプログラムがバックグラウンドで実行されているため、通常は同期を使用する必要はありません。Linuxには追加のデーモンbdflushがあります。これは、より頻繁に不完全な同期を実行し、同期によって時々発生する重いディスクI / Oによる突然の凍結を回避します。

Linuxでは、bdflushは更新によって開始されます。通常、それを心配する理由はありませんが、何らかの理由でbdflushが停止した場合、カーネルはこれについて警告するため、手動で起動する必要があります(/ sbin / update)。


1
これはダーティエントリ専用ではありませんか?私のシステムでは問題はないと思います。すべてがクリーンであるためです。遅延はダーティページを書き戻すのではなく、クリーンなページを削除することによって残されたスペースをデフラグすることにあります。
ウィム

はい、これはダーティページ用です。動的モードに調整することで、他のパフォーマンスの問題を修正することもできると思います。
イヤズアフマドカーン

「Linux 2.6以降、[bdflush]システムコールは非推奨であり、何もしません。将来のカーネルリリースでは完全になくなる可能性があります。現在、bdflush()によって実行されるタスクはカーネルpdflushスレッドによって処理されます。」man7.org/linux/man-pages/man2/bdflush.2.html
sourcejedi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.