ディスクへの/ディスクからの単一プロセスの中断/再開


22

場合によっては、UbuntuおよびOS Xサーバーでメモリを集中的に使用するプロセスを一時停止して、他のジョブのためにRAMを一時的に解放したいことがあります。心配しているのがCPUの使用量だけだった場合、単純な方法で問題ありCtrl-Zません。ただし、RAMを解放して(ディスクに書き込むことにより)、プロセスを再起動(ディスク-> RAM)するか、つまり単一のプロセスを「休止状態」にする必要があります。これを行う方法についての手がかりはありますか?(できればCLIから。)ありがとう。


7
プロセスが一時停止状態にあるとき、必要に応じて、使用されているメモリがディスクにスワップされる候補であり、これはカーネルから自動的に行われるべきだと思います。
enzotib

1
@enzotib-これが起こるかどうかはわかりませんが、理論的にはこれはいいですね。ただし、大まかなテストを行っただけで、実際には機能しません。「RAMイーター」が中断されている間に生成される新しいプロセスは非常に遅く、RAMがディスクにスワップされた場合に予想されるディスクアクティビティは検出されません。
マイクコビントン

1
@frozenwithjoyこれが起こることを確認できます。私が考えることができる唯一の理由は、中断されたプロセスが徐々にスワップアウトされないことです。 。
ジル「SO-悪であるのをやめる」

1
ここで役立つ用語は「チェックポイント」です(はい、yeい動詞形式)。これは、プログラムがスリープ中に状態を変更する可能性のあるリソースをプログラムが使用している可能性があるため、一般に難しい問題です。その問題を管理することは、かつてはBig Ironと少し面倒なコンピューターの違いの1つでした。
dmckee

回答:


8

単一のプロセスを休止状態にするための一般的な機能はなく、システム全体のみです。

ただし、プロセスイメージが再起動後も存続しないことを気にしない場合は、プロセスイメージをディスクに保存するための組み込み機能があります:スワッピング。十分なスワップ領域があることを確認してください。メモリのプレッシャーがあり、プロセスがアクティブでない場合(たとえば、中断されているため)、そのメモリはスワップアウトされます。

プロセスが長時間非アクティブである可能性が高く、ある時点で高速な応答時間を必要とすることがわかっている場合は、多くのRAMを短期間のプロセス、例えば

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

スワップアウトされるものを制御できないため、他のプロセスがスワップアウトされる可能性があります。Linuxでは、マップされているページに強制的にアクセスすることで、プロセスを元に戻すことができます。この答えのスクリプトはそれを行います:プロセスによってマップされたすべてのページをメモリにロードします(これには開いているファイルが含まれることに注意してください。マップ情報に基づいて領域を選択的に走査して、不要なデータの交換を回避できます、詳細についてはこの回答をご覧ください)。



5

十分なスワップ領域があることを確認してください。システムが非アクティブなページのスワップを優先するように設定されていることを確認してください(vm.swappiness = 100)。その後、プロセスを一時停止するだけで十分です。カーネルは、非アクティブなページをスワップアウトすることを好みます。


-1

Mac OS Xでは、purgeコマンド(Xcodeで提供)を使用して(非アクティブな)RAMを解放しようとする場合があります。

vm_stat
purge
vm_stat

2
purgeここでは役に立ちません。ディスクキャッシュは削除されますが、プロセスのメモリがスワップアウトされることはありません。また、別のプロセスがRAMを取得する速度が向上することもありません。
ジル「SO-悪であるのをやめる」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.