パーツのcpulimitに似た、ram2swapのようなツールがなぜないのか疑問に思います。
例えば。
プログラムdaemon.binがあります。
一時的なスワップファイル(1 Gb)を作成しましょう:
% dd if=/dev/zero of=tmp.swap bs=1m count=1000
打ち上げ:
% cpulimit -l 10 ram2swap -f tmp.swap daemon.bin
RAM使用法またはスワップ)の代わりに、daemon.binはtmp.swap
ファイルにメモリを割り当てます。
はい、パフォーマンスが大幅に低下します。しかし、これはどのように柔軟です。
単一のプログラムの観点からは意味がないため、そのようなツールはありません。
CPU/HDD/RAM /スワップをリソースと見なすことができます。これらのリソースは、プロセス、ユーザー、コンテキストなどの間で、オペレーティングシステムによってさまざまな方法で共有できます。
特定の状況では、オペレーティングシステムにハード制限を適用するように指示するのが理にかなっています。
これにより、実際の柔軟性が提供されます。管理者の希望に応じてリソースがユーザー間で共有され、OSが準拠します。
プログラムを手動でスワップするのはなぜ良い考えではないのですか?
では、なぜユーザーは魔法のコマンドラインを使用してプログラムをスワップに入れることができないのでしょうか。
libmylib.so
にリンクされていますが、それもスワップに入れるべきですか?そして、libc.so
はどうですか?要するに、あなたはそれを処理するためにカーネルを必要とします、そしてこれはまさにそれがすることです。ほとんどのニーズでは、応答性の高いシステムを実現するには、スワッピングを微調整するだけで十分です。
さて、あなたが本当にしたいのなら
(出典: freakoutnation.com ) 、カーネルはcgroups
を使用してこの「柔軟性」を提供します。 cgroups
でデーモンのmaxmemおよびmaxmem + swapを設定することにより、必要なものを取得できます。プログラムごとのスワッピングを設定することで、より適切な結果を得ることができます。しかし、どちらにしても、それは良い考えではなく、説明として this 以上に進むことはしません。
あなたが説明するもののようなものがあります:プロセスによって使用されるRAMの量を制限する機能があります(仮想メモリではなくRAM)。RLIMIT_RSS
制限セットプログラムの常駐セットサイズの上限。つまり、(スワップアウトではなく)メモリに常駐するプロセスのメモリの部分。ただし、Linuxには実装されていません。
RLIMIT_RSS
は一部の古いUnixシステム(BSDのみ?)に存在していましたが、多くの最新システムから削除されました。 Linux では、2.4シリーズにのみ存在していました(完全に機能していませんでした)。 Solarisでは、遠い過去のある時点で ドロップされました Solaris SunOSはBSDからSystemVに切り替えました、多分?)。 FreeBSD はまだそれを持っているようです。
RLIMIT_RSS
が削除された理由がわかりません。 Alan Cox は2006年にこう言っています:
Linux用の元のmmは、計算コストがかからないRSSを追跡する方法がなかったため、強制しませんでした。現在のmmはおそらくRSS制限を実装できますが、ユーザーがRSS制限を低く設定し、スワップスラッシングを大量に発生させた場合に、これがどのような影響を与えるかについては疑問が残ります。
あなたがそれを効率的に実装する方法を見つけることができるなら、それを選んでください。
それ以来、このトピックは何度か取り上げられましたが、私が知る限り、Linuxカーネルへのパッチは受け入れられませんでした。
プロセスの物理メモリ使用量に制限を適用する理由の1つは、プロセスが使用している物理メモリの量を定義するのが難しいことです。 OK、スタックとヒープ(スワップアウトされていない部分)を数えます。メモリマップトファイルはどうですか?プロセスの物理メモリ使用量を測定するには、プロセスがマップするファイルによって使用されるキャッシュをカウントする必要があります。共有ライブラリやその他の共有マッピングはどうですか?それらが単一のプロセスで使用されている場合は、明らかにそれに対してカウントする必要がありますが、複数のプロセスで使用されている場合、どのプロセスがどの部分を使用しているかを知ることは困難です。
単一のプロセスの物理メモリ使用量を制限することは、それほど意味がありません。リソース制限が継承されるとすると、各子は同じ量の物理メモリを使用できます。一連のプロセスの物理メモリに制限を設けることは、もう少し理にかなっています。 Linuxには、この機能が cgroups に組み込まれています。これは、プロセスとその子孫が、独自のファイルシステムルート、独自のネットワークコントローラー、独自のリソースを持つことができるコンテナーで実行される部分的な仮想化システムです。制限など。 cgroupのメモリ使用量 は、memory.limit_in_bytes
パラメータで制限できます(memory.memsw.limit_in_bytes
はRAM =プラススワップ)。ドキュメントは、グループ間で共有されるページがやや任意の方法で割り当てられることを警告しています(「共有ページはファーストタッチアプローチに基づいて会計処理されます。ページに最初にタッチするcgroupはページを会計処理します。」) 。 制限が厳密に適用されない他の方法 があるかもしれません。
あなたが求めているものの他の部分は、プロセス専用のスワップファイルを持つことです。これには、カーネルにかなりの複雑さが必要になります。ページは共有できることを忘れないでください。 2つのプロセスに異なるスワップスペースが割り当てられている場合、どのスワップファイルを使用しますか?一方、この機能はプロセス側からかなり簡単に実装できます。ファイルをメモリにマップします。共有ページの場合、まだ1つのファイルがあります。副次的な利点として、プロセスのさまざまな領域でさまざまな「スワップスペース」を使用できます。