Linuxでメモリをディスクに保存して後で復元することにより、プロセスを「休止状態」にする方法


99

Linuxでプロセスを「休止状態」にすることは可能ですか?ラップトップの「休止状態」のように、プロセスが使用するすべてのメモリをディスクに書き込み、RAMを解放します。そして、後で、「プロセスを再開」することができます。つまり、メモリからすべてのデータを読み取ってRAMに戻し、プロセスを続行できますか?


8
興味深い質問:D
10

あなたが説明するものは実際にはしばしば「チェックポイント」と呼ばれ、その用語で検索する方が運が良いかもしれません。
Tim Post

それはする必要があります。良い機能。休止状態と閉じる。
Vitaly Fadeev 2017

回答:


54

私はCryoPIDを維持するために使用しました。これは、あなたが話していることを正確に実行するプログラムです。プログラムのアドレス空間、VDSO、ファイル記述子の参照および状態の内容を、後で再構築できるファイルに書き込みます。Linux自体に使用可能なフックがなかったときにCryoPIDが開始され、ユーザー空間から完全に機能しました(実際には、ディストリビューション、カーネル、セキュリティ設定によっては、機能します)。

問題は(確かに)ソケット、保留中のRTシグナル、多数のX11の問題、glibcキャッシングgetpid()の実装などです。ランダム化(特にVDSO)は、Bernardがそこから離れた後、それに取り組んでいる私たちの数人にとって乗り越えられないものであることがわかりました。しかし、それは楽しかったし、いくつかの修士論文のトピックとなった。

実行状態を保存してその状態に直接再起動できるプログラムを検討している場合は、おそらく信号を処理するときに、プログラム自体からその情報を保存する方がはるかに簡単です。


5
2014年7月の時点で、残念なことにCryoPIDはもはや必須ではなく、最近のカーネルでは動作しません。しかし、その間に新しいプロジェクトが生まれました(TCP接続の「ハイバネーション」でもいくつかの措置が講じられています)。更新された情報を使用して、以下に回答を掲載しました。見てみな!;)
dappiu 14

1
@dappiuすばらしいですが、CryoPIDはこの回答のであり、それがどれほどトリッキーであるかを示しています。私は、プログラム自体の中で状態を保存することを簡単に再開できるように処理することを提案しました。CryoPIDが停滞しても、回答の関連性は低くなりません。
Tim Post

Cryopid2が最近アクティブになりました(2013):sourceforge.net/projects/cryopid2
Leopd

31

ここに、2014年のステータス更新を掲載したいと思います。

受け入れられた答えは、チェックポイント/復元を実行するためのツールとしてCryoPIDを示唆していますが、このプロジェクトは手に負えず、最近のカーネルでコンパイルすることは不可能であることがわかりました。さて、私はアプリケーションチェックポイント機能を提供する2つのアクティブに管理されたプロジェクトを見つけました。

最初に、私はそれを実行した方が幸運であるので、 主にユーザースペースでチェックポイント/復元を実行するCRIU提案し、動作するにはカーネルオプションCONFIG_CHECKPOINT_RESTOREを有効にする必要があります。

チェックポイント/ユーザースペースでの復元、またはCRIU(発音はkree-oo、IPA:/krɪʊ/、ロシア語:криу)は、Linuxオペレーティングシステム用のソフトウェアツールです。このツールを使用すると、実行中のアプリケーション(またはその一部)をフリーズし、ファイルのコレクションとしてハードドライブにチェックポイントできます。その後、ファイルを使用して、アプリケーションをフリーズした時点から復元して実行できます。CRIUプロジェクトの特徴は、主にユーザー空間で実装されることです。

後者はDMTCPです。彼らのメインページからの引用:

DMTCP(分散マルチスレッドチェックポイント)は、マルチスレッドおよび分散アプリケーションを含む複数の同時アプリケーションの状態を透過的にチェックポイントするツールです。Linuxカーネルモジュールやその他のカーネル変更を行わずに、ユーザーバイナリ実行可能ファイルを直接操作します。

引数には、すばらしいWikipediaページもあります。Application_checkpointing


20

この回答ctrl-zは、実際にはシグナルでプロセスを停止することを示していSIGTSTPます。次のコマンドで停止信号を発行できますkill

kill -STOP <pid>

それはプロセスの実行を一時停止します。それが使用していたメモリはすぐには解放されませんが、他のプロセスにメモリが必要なため、停止したプロセスが使用していたメモリは徐々にスワップアウトされます。

再び起こしたいときは、

kill -CONT <pid>

CryoPIDのようなより複雑なソリューションは、停止したプロセスがシステムのシャットダウン/再起動に耐えられるようにしたい場合にのみ実際に必要です-必要なようには聞こえません。


13

問題は、プログラムが開いたストリーム(ファイルとソケット)を復元することです。

OS全体が休止状態になると、ローカルファイルなどを復元できます。ネットワーク接続はサポートしていませんが、インターネットにアクセスするコードは、通常、より多くのエラーチェックなどであり、エラー条件を乗り越えます(またはすべきです)。

プログラムごとの休止状態(アプリケーションサポートなし)を行った場合、開いているファイルをどのように処理しますか?別のプロセスが暫定的にそれらのファイルにアクセスするとどうなりますか?等?

プログラムが読み込まれていない状態を維持することは困難です。

スレッドを一時停止してディスクにスワップさせるだけでも、ほとんど同じ効果がありますか?

または、仮想マシンでプログラムを実行し、VMに一時停止を処理させます。


12

短い答えは「はい、しかし必ずしも確実ではない」です。CryoPIDを確認してください。

http://cryopid.berlios.de/

実際、開いているファイルが最も一般的な問題です。CryoPIDは明示的に述べています:

開いているファイルとオフセットが復元されます。リンクが解除され、ファイルシステムでアクセスできない一時ファイルは、常にイメージに保存されます。再開時に存在しない他のファイルはまだ復元されていません。このような状況でファイルの内容を保存するためのサポートが計画されています。

同じ問題はTCP接続にも影響しますが、CryoPIDは接続再開のためにtcpcpをサポートしています。


3
送信ボタンを押した後、CryoPIDのスパム/広告によく似ていることがわかりました。そうではありません-私は単にユーティリティの満足しているユーザーです。
Ulissesモンテネグロ2010



6

SourceForgeから入手可能なCryopid2と呼ばれるパッケージを作成するCryopidを拡張しました。これは、プロセスを移行するだけでなく、休止状態にすることもできます(開いているファイルとソケットと一緒に-ソケット/パイプ内のデータは休止状態でプロセスに吸い込まれ、プロセスが再起動するとこれらに戻されます)。

私がこのプロジェクトで活動していない理由は、私はカーネル開発者ではないためです-これ(および/または元のクリオピッド)の両方が、最新のカーネル(例:Linux 3.x)で実行できる人をボードに入れる必要があります。 。

Cryopidメソッドは機能します。これは、私が遭遇したLinuxでの汎用プロセスの休止状態/移行に対するおそらく最良のソリューションです。


3

他の人が指摘したように、アプリケーションが壊れたストリームを処理するには組み込みのエラーチェックが必要なため、OSがこの機能を提供することは困難です。

ただし、補足として、Selfプログラミング言語など、仮想マシンを使用する一部のプログラミング言語とツールは、この機能を明示的にサポートしています。


0

Ctrl-Zは、プロセスのページがスワップされる可能性を高めますが、プロセスのリソースを完全には解放しません。プロセスのリソースを完全に解放することの問題は、ファイルハンドル、ソケットなどがプロセスが使用するカーネルリソースであるが、それ自体で永続化する方法がわからないことです。したがって、Ctrl-Zはそれと同じくらい優れています。


0

Linuxのチェックポイント/復元については2.2日と2.4日でいくつかの調査が行われましたが、プロトタイプを超えることはありませんでした。可能性のある特定の値については(他の回答で説明されている警告があれば)可能です。これを行うためのカーネルモジュールを作成できますが、可能です。しかし、可能性の一般的な価値については(商用Linuxディストリビューションのシェルからそれを行うことができますか)、まだ可能ではありません。


0

これは、クラスタ化されたオペレーティングシステムの最終的な目標のようなものです。Mathew Dillonは、Dragonfly BSDプロジェクトでこのようなものを実装するために多くの努力をしています。


この機能はDragonfly BSDに完全に実装されていますか?
Arjun J Rao

0

別の回避策を追加:virtualboxを使用できます。通常の仮想マシンでアプリケーションを実行し、必要なときにいつでも「マシンの状態を保存」するだけです。私はこれが答えではないことを知っていますが、本当の選択肢がないときに役立つと思いました。

何らかの理由でvirtualboxが気に入らなければ、vmwareとQemuは同じくらい良いです。


-2

ありますctrl+zLinuxでは、しかし、私は確かにそれはあなたが指定した機能を提供していませんよ。あなたがこの質問をしていないのではないかと思います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.