web-dev-qa-db-ja.com

再起動後に続行するためにプロセス全体を保存します

私は、数学でかなり難しい問題を解くアルゴリズムを開発しました。この問題は、完了するまでに数か月かかる可能性があります。私はリソースが限られているため、これを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時間から実行されます(キャンセルするには長すぎます;-))
55
stefan

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

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

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

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

将来的には、長期実行プロセスをどこで実行するか、それらをパラレライズする方法、問題を処理する方法について考えます。ディスクがいっぱい、プロセスが強制終了するなど.

43
Ulrich Dangel

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

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


編集:ウルリッヒは、リストの番号が付けられていない項目4でこれについて既に言及していることに気づきました。

特に、堅牢なソリューションのように見える代替手段がないため、これをオプションとして検討することをお勧めします。それぞれに機能しない理由があります。

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

20
bahamat

ツール CryoPID をのぞいてみてください。

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

16
Tim

プログラムを再起動する必要がある場合は、時間を節約してコードに機能を追加することをお勧めします。

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

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

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

さらに、計算が進むにつれてデータがどのように変化するかを確認できること自体が興味深いかもしれません!

7
James Womack