Simpan seluruh proses untuk kelanjutan setelah reboot

54

Saya mengembangkan sebuah algoritma untuk masalah yang cukup sulit dalam matematika yang kemungkinan akan membutuhkan beberapa bulan untuk menyelesaikannya. Karena saya memiliki sumber daya yang terbatas saja, saya memulai ini pada laptop Ubuntu 12.04 (x86) saya. Sekarang saya ingin menginstal beberapa pembaruan dan benar-benar me-restart laptop (pesan "tolong reboot" hanya mengganggu).

Apakah ada cara untuk menyimpan seluruh proses termasuk memori yang dialokasikan untuk kelanjutan setelah reboot?

Berikut ini beberapa informasi tentang proses yang mungkin Anda butuhkan. Silakan meminta informasi lebih lanjut jika diperlukan.

  • Saya menyebut proses di terminal dengan perintah " ./binary > ./somefile &" atau "time ./binary> ./somefile &", saya tidak bisa mengingatnya.
  • Ini mencetak beberapa informasi debug ke std :: cerr (tidak terlalu sering).
  • Saat ini menggunakan sekitar 600,0 kiB dan meskipun ini akan meningkat, itu tidak mungkin meningkat dengan cepat.
  • proses berjalan dengan prioritas normal
  • kernelnya 3.2.0-26-generic-pae, cpu adalah AMD, sistem operasinya adalah Ubuntu 12.04 x86.
  • ini berjalan sejak 9 hari dan 14 jam (terlalu lama untuk membatalkannya ;-))
Stefan
sumber
3
Karena penasaran, apa yang Anda hitung?
Viktor Mellgren
3
@ user1261166: Saya mempelajari Masalah Target Kunjungan (yang merupakan perpanjangan dari Traveling Salesman Problem) dengan pendekatan Branch-and-Cut. Jadi saya perlu tahu sebanyak mungkin aspek dari beberapa polytope dimensi tinggi khusus. Pada dasarnya, ini meledakkan masalah besar menjadi raksasa dan kemudian mencoba memecahkan sedikit untuk menguranginya setelah itu.
Stefan
5
Itu tidak cukup menjawab pertanyaan Anda tetapi apakah Anda sudah mempertimbangkan menjalankan kode Anda pada kluster khusus di masa depan? Itu hampir tidak ditutup dan saya yakin ada beberapa grid komputasi yang tersedia untuk Anda. Tidak hanya mereka selalu aktif tetapi juga sedikit lebih cepat (terutama jika Anda dapat memparalelkan kode Anda). Anda bahkan bisa mencobanya sendiri (lihat Oracle Grid Engine).
Wojtek Rzepala
Saya tidak pernah memikirkan ini karena pertanyaan yang begitu populer (paling tidak lebih populer daripada setiap pertanyaan saya). Karena prosesnya selesai sekarang (tanpa terduga, meskipun tanpa crash), saya akan mencoba setiap metode segera. Terimakasih semuanya!
stefan
1
stackoverflow.com/questions/2134771/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

41

Solusi terbaik / paling sederhana adalah mengubah program Anda untuk menyimpan status ke file menggunakan kembali file itu untuk memulihkan proses.

Berdasarkan halaman wikipedia tentang snapshot aplikasi ada beberapa alternatif:

  1. Ada juga cryopid tetapi tampaknya tidak terawat.
  2. Linux checkpoint / restart tampaknya menjadi pilihan yang baik tetapi kernel Anda perlu CONFIG_CHECKPOINT_RESTOREdiaktifkan.
  3. criu mungkin adalah proyek yang paling mutakhir dan mungkin hasil terbaik Anda, tetapi juga tergantung pada beberapa opsi Kernel tertentu yang mungkin belum disetel oleh distribusi Anda.

Ini sudah terlambat tetapi pendekatan lain yang lebih praktis adalah memulai proses Anda dalam VM khusus dan hanya menunda dan mengembalikan seluruh mesin Virtual. Bergantung pada hypervisor Anda, Anda juga dapat memindahkan mesin di antara berbagai host.

Untuk masa depan pikirkan tentang di mana Anda menjalankan proses yang sudah berjalan lama, bagaimana cara melumpuhkan mereka dan bagaimana menangani masalah, misalnya disk penuh, proses terbunuh, dll.

Ulrich Dangel
sumber
20

Cara yang cukup "murah" untuk melakukan ini adalah dengan melakukan pemrosesan dalam VM (misalnya, dengan VirtualBox). Sebelum Anda mematikan, tunda VM dan simpan negara. Setelah boot, pulihkan VM & status.

Ini memang memiliki kelemahan yaitu harus membunuh dan memulai kembali pekerjaan. Tetapi jika itu benar-benar akan berjalan selama beberapa bulan maka perbedaan sembilan hari menjadi sepele (peningkatan 5% selama 6 bulan).


Sunting: Saya baru menyadari bahwa Ulrich telah menyebut ini dalam nomor 4 yang tidak bernomor dalam daftarnya.

Saya masih mendorong Anda untuk mempertimbangkan ini sebagai pilihan, terutama karena tidak ada alternatif yang tampak seperti solusi yang kuat. Masing-masing memiliki alasan mengapa itu tidak berhasil.

Saya kira hal terbaik yang harus dilakukan adalah mencoba salah satunya dan jika tidak berhasil restart pekerjaan di VM.

bahamat
sumber
15

Mengintip alat CryoPID .

Dari beranda: "CryoPID memungkinkan Anda untuk menangkap keadaan proses yang sedang berjalan di Linux dan menyimpannya ke file. File ini kemudian dapat digunakan untuk melanjutkan proses nanti, baik setelah reboot atau bahkan di komputer lain."

Tim
sumber
4
Gunakan ini sebelumnya untuk menyimpan keadaan skrip python yang berjalan di kotak Linux dan memindahkannya ke kotak FreeBSD dan dilanjutkan di sana. Beberapa keajaiban misterius terjadi di sana;)
Tim
Saya tidak tahu FreeBSD dan Linux kompatibel dengan biner; itu sesuatu yang sangat menarik yang baru saya pelajari. Tetapi apakah itu berarti mereka memiliki model memori yang persis sama? Tampaknya tidak masuk akal bagi saya bahwa mereka memiliki konvensi syscall yang sama, libc yang sama (saya kira fbsd menggunakan glibc), konvensi panggilan yang sama persis pada tingkat asm, dll. Ketidakcocokan terdengar bagi saya seolah-olah Anda mengambil proses MacOS dan dibuang itu ke kotak Windows; itu sungguh menakjubkan.
kucing
Adakah yang sudah mencoba ini baru-baru ini? Situs hilang, saya tidak dapat menemukan deb, bangunan dari sumber gagal, dll. Saya ingin tahu apakah mungkin sebelum menghabiskan lebih lama untuk itu. Saya menggunakan Debian jika itu penting.
John P
1
@JohnP Tersedia di GitHub sekarang: github.com/maaziz/cryopid
starbeamrainbowlabs
7

Jika pada akhirnya Anda perlu me-restart program Anda, saya akan mendorong Anda untuk meluangkan waktu menambahkan beberapa fitur ke kode Anda yang mungkin menghemat waktu Anda di masa depan.

Jika proses ini akan berjalan untuk waktu yang lama, bisa menyimpan seluruh kondisi proses saat Anda me-restart mesin mungkin tidak akan sangat membantu jika proses Anda macet saat sedang berjalan.

Saya akan mendorong Anda untuk memiliki output program Anda ke file "pos pemeriksaan" data. Data ini harus memadai sehingga program Anda dapat melanjutkan dari keadaan pada saat file pos pemeriksaan disimpan. Anda tidak perlu menyimpan seluruh proses, hanya snapshot dari variabel yang relevan yang digunakan dalam perhitungan Anda, cukup untuk perhitungan Anda untuk melanjutkan di mana ia tinggalkan. Kode Anda juga perlu menyertakan beberapa cara membaca data dari file ini untuk mendapatkan status permulaannya.

Anda dapat mengatur kode Anda sehingga saat Anda mengirim sinyal, ia menyimpan salah satu file pos pemeriksaan ini, sehingga Anda dapat menyimpan "keadaan" perhitungan Anda kapan saja.

Selain itu, dapat melihat bagaimana data berubah saat kalkulasi berlangsung mungkin menarik dengan sendirinya!

James Womack
sumber