間接的にトリガーするカーネルオブジェクトを制限するタスクを実行したいと思います。これは、アプリケーション、スレッドなどが使用するメモリに関するものではなく、カーネルが使用するメモリに関するものです。具体的には回数を制限したい。アイノードキャッシュジョブを使用できます。
私の動機を与える例はですupdatedb
。後で必要とされないほとんどのタスクに大規模な inode キャッシュを使用できます。特にext4_inode_cache
行に表示される値を制限したいと思います/proc/slabinfo
。 (これは表示された「バッファ」または「キャッシュ」行には含まれていませんfree
。これはファイルコンテンツキャッシュにすぎず、スラブコンテンツはカーネルメモリであり、「使用済み」列に書き込まれます。)
echo 2 >/proc/sys/vm/drop_caches
キャッシュは後で解放されますが、私には役に立ちません。実行中のアプリケーションや頻繁に使用されるファイルなど、メモリに保存したいものを役に立たないものに置き換えます。
システムは最新(≥3.8)カーネルを備えたLinuxです。ルートアクセスとして設定できます。
(ext4)inodeキャッシュへの環境の貢献が私が設定した値に制限されるように制限された環境(コンテナ?)でコマンドを実行するにはどうすればよいですか?
答え1
私自身の質問によるとランカ・メレこれは以下を使用して保存できます。コントロールグループv2:
前提条件
- Linuxカーネルが
MEMCG_KMEM
有効になっていることを確認してください。grep CONFIG_MEMCG_KMEM "/boot/config-$(uname -r)"
- オペレーティングシステム(およびバージョン)によっては、Linuxカーネルコマンドラインでそれを指定して有効になります(
systemd
例:。cgroups2
systemd.unified_cgroup_hierarchy=1
/boot/grub/grub.cfg
cgroup2
ファイルシステムは、例えば、または/sys/fs/cgroup/
それにmount -t cgroup2 none /sys/fs/cgroup
対応します/etc/fstab
。 (systemd
これは基本的に自動的に行われます)
祈る
- プロセス用の新しいグループを作成します
my-find
(1回の起動に1回)。mkdir /sys/fs/cgroup/my-find
- (現在)プロセス(および今後のすべてのサブプロセス)をグループに関連付けます。
echo $$ >/sys/fs/cgroup/my-find/cgroup.procs
- ソフト制限(例: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
単一のエントリのみを入力する必要があります。cgroup
sort
frcode
PS
cgroup v1
設定が廃止memory.kmem.limit_in_bytes
され、プロセスが設定された制限を超えると、「メモリ不足」イベントが発生し、Linuxカーネルが古いデータを削除してメモリ使用量を減らすのを強制するのではなく、プロセスがすぐにシャットダウンされるため機能しません。引用符CONFIG_MEMCG_KMEM
現在、カーネルメモリにソフト制限は実装されていません。今後の作業は、これらの限界に達するとプレートのリサイクルを開始することです。
答え2
見たらカーネル inode ソースコード、ihash_entriesがカーネルレベルでのみ設定されていることがわかります。
ユーザーまたはプロセスレベルの考慮事項はまったくありません。これを追加すると、パフォーマンスが大幅に低下し、非生産的になる可能性があります。
これはまた、キャッシュエントリを使用してすべてのプロセスを追跡するため、これを実行するためにより多くのメモリを使用することを意味します。
さらに、現在のカーネルでは不可能なだけでなく、実装するのも良い考えではありません。