再起動後の継続のためにプロセス全体を保存する


54

私は数学でかなり難しい問題のためのアルゴリズムを開発しました。リソースが限られているため、Ubuntu 12.04(x86)ラップトップでこれを開始しました。ここで、いくつかの更新プログラムをインストールし、実際にラップトップを再起動します(「再起動してください」というメッセージは煩わしいだけです)。

再起動後も継続できるように、割り当てられたメモリを含むプロセス全体を保存する方法はありますか?

必要なプロセスに関する情報を次に示します。必要に応じて、詳細情報をお気軽にお問い合わせください。

  • コマンド " ./binary > ./somefile &"または "time ./binary> ./somefile&" を使用して端末でプロセスを呼び出しましたが、実際には思い出せません。
  • いくつかのデバッグ情報をstd :: cerrに出力しています(あまり頻繁ではありません)。
  • 現在約600.0 kiBを使用していますが、これは増加しますが、急速に増加する可能性は低いです。
  • プロセスは通常の優先度で実行されます
  • カーネルは3.2.0-26-generic-pae、CPUはAMD、オペレーティングシステムはUbuntu 12.04 x86です。
  • 9日と14時間から実行されます(キャンセルするには長すぎます;-))

3
好奇心から、あなたは何を計算していますか?
ビクトルメルグレン

3
@ user1261166:ブランチアンドカットアプローチで、ターゲット訪問問題(巡回セールスマン問題の拡張)を研究しています。したがって、特定の高次元ポリトープの可能な限り多くの側面を知る必要があります。基本的に、それは大きな問題を巨大な問題に吹き飛ばし、それを少し解決しようとして後で解決しようとしています。
ステファン

5
あなたの質問にはまったく答えられませんが、将来、専用クラスターでコードを実行することを検討しましたか?それらはほとんどシャットダウンされず、利用可能なコンピューティンググリッドがあると確信しています。それらは常にオンであるだけでなく、かなり高速です(特に、コードを並列化できる場合)。自分で設定することもできます(Oracle Grid Engineを調べてください)。
Wojtek Rzepala

私はこのような人気のある質問を考えたことは一度もありませんでした(少なくとも、他の質問よりもずっと人気があります)。プロセスが終了したので(クラッシュせずに予期せず)、各メソッドをすぐに試してみます。みんな、ありがとう!
ステファン

回答:


41

最良/最も簡単な解決策は、プログラムを変更して状態をファイルに保存し、そのファイルを再利用してプロセスを復元することです。

アプリケーションのスナップショットに関するウィキペディアのページに基づいて、複数の選択肢があります。

  1. クリオピッドもありますが、メンテナンスされていないようです。
  2. Linuxチェックポイント/再起動は適切な選択のようですが、カーネルをCONFIG_CHECKPOINT_RESTORE有効にする必要があります。
  3. criuはおそらく最新のプロジェクトであり、おそらくあなたのベストショットですが、ディストリビューションがおそらく設定していない特定のカーネルオプションにも依存します。

これはすでに手遅れですが、もう1つのより実践的なアプローチは、専用のVMでプロセスを開始し、仮想マシン全体を一時停止して復元することです。ハイパーバイザーに応じて、異なるホスト間でマシンを移動することもできます。

将来的には、長期実行プロセスをどこで実行するか、それらをパラレライズする方法、および問題(ディスクがいっぱい、プロセスが停止するなど)を処理する方法について考えてください。


20

これを行うためのかなり「安い」方法は、VMで処理を行うことです(たとえば、VirtualBoxを使用)。シャットダウンする前に、VMをサスペンドして状態を保存します。起動後、VMと状態を復元します。

これには、ジョブを強制終了して再起動する必要があるという欠点があります。しかし、実際に数か月間実行される場合、9日間の差はわずかになります(6か月で5%増加)。


編集:私はちょうどウルリッヒが彼のリストの番号なしの項目4でこれをすでに言及していることに気付きました。

特に選択肢が堅牢なソリューションとは思えないため、これをオプションとして検討することをお勧めします。それぞれが機能しない理由があります。

最善の方法は、それらのいずれかを試して、それが機能しない場合は、VMでジョブを再起動することです。


15

ツールCryoPIDを覗いてください

ホームページから:「CryoPIDを使用すると、Linuxで実行中のプロセスの状態をキャプチャしてファイルに保存できます。このファイルを使用して、再起動後または別のマシンでもプロセスを再開できます。」


4
前にこれを使用して、Linuxボックスで実行されているpythonスクリプトの状態を保存し、FreeBSDボックスに移動して再開しました。そこに起こっている不可解な魔法;)
ティム

FreeBSDとLinuxがバイナリ互換であることは知りませんでした。それは私が学んだばかりの非常に興味深いものです。しかし、それはまったく同じメモリモデルを持っているということですか?彼らには同じsyscall規約、同じlibc(私はfbsdがglibcを使用していると思います)、asmレベルでの同じ正確な呼び出し規約などがあることは私には信じられないように思われます。それをWindowsボックスに; それは本当に驚くべきことです。

最近誰もこれを試しましたか?サイトがなくなって、.debが見つからない、ソースからのビルドが失敗するなど。それ以上使用する前に可能かどうかを知りたい。問題があればDebianにいます。
ジョンP

1
@JohnP GitHubで利用可能になりました:github.com/maaziz/cryopid
starbeamrainbowlabs

7

プログラムの再起動が必要になった場合は、コードに機能を追加して、将来時間を節約できる可能性のある機能を追加する時間をかけることをお勧めします。

プロセスを長時間実行する場合、マシンの再起動時にプロセス全体の状態を保存できることは、実行中にプロセスがクラッシュした場合にはおそらくあまり役​​に立ちません。

プログラムのファイルを「チェックポイント」データに出力することをお勧めします。このデータは、チェックポイントファイルが保存されたときの状態からプログラムが再開できるようにするのに十分でなければなりません。プロセス全体を保存する必要はありません。計算で使用されている関連変数のスナップショットだけで、計算を中断したところから再開するのに十分です。また、コードには、このファイルからデータを読み込んで開始状態を取得する何らかの方法を含める必要があります。

シグナルを送信すると、これらのチェックポイントファイルの1つが保存されるようにコードを設定できるため、計算の「状態」をいつでも保存できます。

さらに、計算が進むにつれてデータがどのように変化するかを見ることができること自体が興味深い場合があります!

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