なぜそのようなツールがないのだろうか。メモリ2スワップ、部分的にcpulimitに似ています。
例えば
daemon.binプログラムがあります。
一時スワップファイル(1GB)を作成してみましょう。
% dd if=/dev/zero of=tmp.swap bs=1m count=1000
放射:
% cpulimit -l 10 ram2swap -f tmp.swap daemon.bin
daemon.binはRAMまたはSWAPを使用する代わりにファイルにメモリを割り当てますtmp.swap
。
パフォーマンスが大幅に低下します。はい。しかし、どのくらい柔軟性がありますか。
ベストアンサー1
単一プログラムの観点では意味がないため、そのようなツールは存在しません。
CPU/HDD/RAM/スワップはリソースと見なすことができます。オペレーティングシステムは、さまざまな方法でプロセス、ユーザー、コンテキストなどの間でこれらのリソースを共有できます。
オペレーティングシステムに厳格な制限を適用するように指示することが適切な特定の状況があります。
- このプログラムがメモリの60%以上を使用しないようにしてください。
- そのユーザーが必要な場合は、他のユーザーがCPU時間の20%以上を使用することを許可しないでください。それ以外の場合は、100%CPUを使用できます。
- このグループのユーザーは2つ以上のコアを使用できません。
- ...
これは実際柔軟性:管理者の希望とオペレーティングシステムの遵守に応じて、ユーザー間でリソースを共有します。
プログラムを手動でスワップに入れるのが悪いのはなぜですか?
- 基本的にカーネルの経験的方法よりも優れていると仮定しています。カーネルはすでにスワップ空間自体を処理します。デーモンが長時間アクティブでなく、オペレーティングシステムのRAMが不足すると、最終的にスワップ状態になります。
- AFAIK、スワップ領域は実行可能ではありません。実行する前に、スワップ領域の内容をRAMで取得する必要があります。したがって、RAMで最初のタイプのプログラムを実行し、スワップで2番目のタイプのプログラムを実行したい場合は、すぐに停止すると機能しません。
- 「はい、しかし特定のデーモンは月に2回呼び出されます。RAMでは必要ありません」これが真であれば、RAMが不足するとカーネルがスワップ状態になります。
- 「メモリが足りなくなるのを待たなければならないのはなぜですか?」スワップに物を入れて取り出すことは、特に一般的なハードドライブの場合には高価です。システムがすべてをRAMに保存できる場合は、これを行うのが最善です。一時的に何かを強制的に交換すると、システムの反応性が低下します。他の「ファーストクラス」デーモンも一部のHDD IOを実行する可能性が高いため、これらのデーモンも速度が遅くなります。 「2番目のタイプ」デーモンが起動し、RAMに配置する必要がある場合でも同じことが起こります。
これで、ユーザーはなぜ魔法のコマンドラインを使用してプログラムをスワップに入れることができないのですか?
- ユーザースペース(非カーネル)の観点からは、スワップに何を入れるべきかは明確ではありません。あなたのプログラムはに接続されています
libmylib.so
。このプログラムも交換する必要がありますか?だから何libc.so
? - 実際に予想される動作は何ですか?デーモンをスワップに直接入れたいですか?ただし、一部の初期化操作を実行する必要があります。そうですか?その後、ロードするとRAMに戻ります。
- デーモンが廃止され、安全に再スワップできることをどうやって知ることができますか?
- スワップ領域に直接送り返す必要がありますか、それとも待つ必要がありますか?それ以外の場合は、デーモンがスリープするたびにスワップに入り、目が覚めるたびにRAMに戻ります。たとえば、デーモンがコンピュータの時計を更新している場合は、数時間の交換に備えてください。
- ...
簡単に言えば、これを処理するにはコアが必要で、これがコアが実行する作業です。ほとんどの要件に対して交換性を調整するだけでレスポンシブシステムを実現できます。
今本当に欲しいなら
(源泉:Freakoutnation.com) 、カーネルはを使用して動作しますcgroups
。でデーモンにmax memとmax mem + swapを設定して、必要なものを取得できますcgroups
。各プログラムの交換性を設定すると、より合理的な結果が得られます。しかし、どちらにしても良い考えではなく、もはや進行しません。これ説明として。