前提条件

前提条件

間接的にトリガーするカーネルオブジェクトを制限するタスクを実行したいと思います。これは、アプリケーション、スレッドなどが使用するメモリに関するものではなく、カーネルが使用するメモリに関するものです。具体的には回数を制限したい。アイノードキャッシュジョブを使用できます。

私の動機を与える例はですupdatedb。後で必要とされないほとんどのタスクに大規模な inode キャッシュを使用できます。特にext4_inode_cache行に表示される値を制限したいと思います/proc/slabinfo。 (これは表示された「バッファ」または「キャッシュ」行には含まれていませんfree。これはファイルコンテンツキャッシュにすぎず、スラブコンテンツはカーネルメモリであり、「使用済み」列に書き込まれます。)

echo 2 >/proc/sys/vm/drop_cachesキャッシュは後で解放されますが、私には役に立ちません。実行中のアプリケーションや頻繁に使用されるファイルなど、メモリに保存したいものを役に立たないものに置き換えます。

システムは最新(≥3.8)カーネルを備えたLinuxです。ルートアクセスとして設定できます。

(ext4)inodeキャッシュへの環境の貢献が私が設定した値に制限されるように制限された環境(コンテナ?)でコマンドを実行するにはどうすればよいですか?

答え1

私自身の質問によるとランカ・メレこれは以下を使用して保存できます。コントロールグループv2:

前提条件

  1. LinuxカーネルがMEMCG_KMEM有効になっていることを確認してください。grep CONFIG_MEMCG_KMEM "/boot/config-$(uname -r)"
  2. オペレーティングシステム(およびバージョン)によっては、Linuxカーネルコマンドラインでそれを指定して有効になります(systemd例:。cgroups2systemd.unified_cgroup_hierarchy=1/boot/grub/grub.cfg
  3. cgroup2ファイルシステムは、例えば、または/sys/fs/cgroup/それにmount -t cgroup2 none /sys/fs/cgroup対応します/etc/fstab。 (systemdこれは基本的に自動的に行われます)

祈る

  1. プロセス用の新しいグループを作成しますmy-find(1回の起動に1回)。mkdir /sys/fs/cgroup/my-find
  2. (現在)プロセス(および今後のすべてのサブプロセス)をグループに関連付けます。echo $$ >/sys/fs/cgroup/my-find/cgroup.procs
  3. ソフト制限(例:2MiB)を設定します。echo 2M >/sys/fs/cgroup/my-find/memory.high

正しい値を見つけるには調整と実験が必要です。memory.currentおよび/またはで現在の値を取得できますmemory.stat。時間が経つにつれて、Linuxカーネルがキャッシュを繰り返し強制的に縮小するので、high増加することがわかります。memory.events

付録

この制限が適用されます。両方ユーザー空間メモリとカーネルメモリ。それも動作しますみんなによって開始された子プロセスを含むプロセスグループは、デフォルトで次のupdatedbタスクを実行しますfind | sort | frcode

  • find私たちが制限したいのは、破損してキャッシュするdentryプログラムです。inodeそうでなければ、ユーザ空間メモリ要件は(理論的に)一定である。
  • sort多くのメモリが必要です。それ以外の場合は一時ファイルが使用され、追加のIOが発生します。
  • frcode結果をディスク(たとえば単一ファイル)に書き込むには、継続的なメモリが必要です。

したがって、デフォルトでは、キャッシュゴミを制限するためにfind単一のエントリのみを入力する必要があります。cgroupsortfrcode

PS

cgroup v1設定が廃止memory.kmem.limit_in_bytesされ、プロセスが設定された制限を超えると、「メモリ不足」イベントが発生し、Linuxカーネルが古いデータを削除してメモリ使用量を減らすのを強制するのではなく、プロセスがすぐにシャットダウンされるため機能しません。引用符CONFIG_MEMCG_KMEM

現在、カーネルメモリにソフト制限は実装されていません。今後の作業は、これらの限界に達するとプレートのリサイクルを開始することです。

答え2

見たらカーネル inode ソースコード、ihash_entriesがカーネルレベルでのみ設定されていることがわかります。

ユーザーまたはプロセスレベルの考慮事項はまったくありません。これを追加すると、パフォーマンスが大幅に低下し、非生産的になる可能性があります。

これはまた、キャッシュエントリを使用してすべてのプロセスを追跡するため、これを実行するためにより多くのメモリを使用することを意味します。

さらに、現在のカーネルでは不可能なだけでなく、実装するのも良い考えではありません。

関連情報