Bagaimana cara "hibernasi" proses di Linux dengan menyimpan memorinya ke disk dan memulihkannya nanti?

99

Apakah mungkin untuk 'menghibernasi' proses di linux? Sama seperti 'hibernate' di laptop, saya akan menulis semua memori yang digunakan oleh suatu proses ke disk, membebaskan RAM. Dan kemudian, saya dapat 'melanjutkan proses', yaitu membaca semua data dari memori dan mengembalikannya ke RAM dan saya dapat melanjutkan proses saya?

hap497
sumber
8
Pertanyaan menarik: D
dangerstat
Apa yang Anda gambarkan sebenarnya sering disebut sebagai 'checkpointing', Anda mungkin lebih beruntung mencari dengan istilah itu.
Pos Tim
Ini harus menjadi fitur yang bagus. Hibernasi vs dekat.
Vitaly Fadeev
unix.stackexchange.com/questions/43854/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

54

Saya dulu memelihara CryoPID , yang merupakan program yang melakukan persis apa yang Anda bicarakan. Ini menulis konten ruang alamat program, VDSO, referensi deskriptor file, dan status ke file yang nantinya dapat direkonstruksi. CryoPID dimulai ketika tidak ada kait yang dapat digunakan di Linux itu sendiri dan bekerja sepenuhnya dari ruang pengguna (sebenarnya, ini masih berfungsi, tergantung pada pengaturan distro / kernel / keamanan Anda).

Masalahnya adalah (memang) soket, sinyal RT yang tertunda, banyak masalah X11, implementasi getpid () caching glibc di antara banyak lainnya. Pengacakan (terutama VDSO) ternyata tidak dapat diatasi bagi sedikit dari kita yang mengerjakannya setelah Bernard meninggalkannya. Namun, ternyata menyenangkan dan menjadi topik tesis beberapa master.

Jika Anda hanya memikirkan sebuah program yang dapat menyimpan status berjalannya dan memulai kembali secara langsung ke status itu, jauh .. jauh .. lebih mudah untuk hanya menyimpan informasi itu dari dalam program itu sendiri, mungkin saat melayani sinyal.

Tim Pos
sumber
5
Sejak Juli 2014, sayangnya, CryoPID tidak lagi dipertahankan dan tidak berjalan pada kernel terbaru. Tapi sementara itu proyek baru lahir (beberapa langkah telah diambil bahkan dalam koneksi TCP "hibernasi"). Saya telah memberikan jawaban di bawah ini dengan informasi terbaru. Saksikan berikut ini! ;)
dappiu
1
@dappiu Itu bagus - tetapi CryoPID hanyalah sebuah contoh dalam jawaban ini untuk menggambarkan betapa rumitnya hal itu, di mana saya kemudian menyarankan mereka menangani penyelamatan negara dalam program itu sendiri, sedemikian rupa sehingga dapat dengan mudah dilanjutkan. CryoPID yang stagnan tidak membuat jawaban menjadi kurang relevan.
Tim Post
Cryopid2 baru-baru ini aktif (2013): sourceforge.net/projects/cryopid2
Leopd
31

Saya ingin memasang pembaruan status di sini, mulai 2014.

Jawaban yang diterima menyarankan CryoPID sebagai alat untuk melakukan Checkpoint / Restore, tetapi saya menemukan proyek tersebut tidak terawat dan tidak mungkin untuk dikompilasi dengan kernel terbaru. Sekarang, saya menemukan dua proyek yang dikelola secara aktif yang menyediakan fitur pos pemeriksaan aplikasi.

Yang pertama, yang saya sarankan karena saya lebih beruntung menjalankannya, adalah CRIU yang melakukan checkpoint / restore terutama di userspace, dan membutuhkan opsi kernel CONFIG_CHECKPOINT_RESTORE diaktifkan untuk berfungsi.

Checkpoint / Restore In Userspace, atau CRIU (diucapkan kree-oo, IPA: / krɪʊ /, Rusia: криу), adalah alat perangkat lunak untuk sistem operasi Linux. Dengan menggunakan alat ini, Anda dapat membekukan aplikasi yang sedang berjalan (atau bagiannya) dan memeriksanya ke hard drive sebagai kumpulan file. Anda kemudian dapat menggunakan file tersebut untuk memulihkan dan menjalankan aplikasi dari titik pembekuannya. Ciri khas proyek CRIU adalah bahwa CRIU diterapkan terutama di ruang pengguna.

Yang terakhir adalah DMTCP ; mengutip dari halaman utama mereka:

DMTCP (Distributed MultiThreaded Checkpointing) adalah alat untuk secara transparan memeriksa status beberapa aplikasi secara bersamaan, termasuk aplikasi multi-utas dan terdistribusi. Ini beroperasi langsung pada pengguna biner yang dapat dieksekusi, tanpa modul kernel Linux atau modifikasi kernel lainnya.

Ada juga halaman Wikipedia yang bagus dengan argumen: Application_checkpointing

dappiu
sumber
21

Jawaban yang disebutkan ctrl-zsebenarnya berbicara tentang menghentikan proses dengan sinyal, dalam hal ini SIGTSTP. Anda dapat mengeluarkan sinyal berhenti dengan kill:

kill -STOP <pid>

Itu akan menunda pelaksanaan proses. Ini tidak akan segera membebaskan memori yang digunakan olehnya, tetapi karena memori diperlukan untuk proses lain, memori yang digunakan oleh proses yang dihentikan akan ditukar secara bertahap.

Saat Anda ingin membangunkannya lagi, gunakan

kill -CONT <pid>

Solusi yang lebih rumit, seperti CryoPID, benar-benar hanya diperlukan jika Anda ingin proses yang dihentikan dapat bertahan saat sistem dimatikan / dimulai ulang - sepertinya Anda tidak membutuhkannya.

kafe
sumber
14

Masalahnya adalah memulihkan aliran - file dan soket - yang dibuka oleh program.

Ketika seluruh OS Anda hibernate, file lokal dan semacamnya jelas dapat dipulihkan. Koneksi jaringan tidak, tetapi kemudian kode yang mengakses internet biasanya lebih memeriksa kesalahan dan semacamnya dan bertahan dari kondisi kesalahan (atau seharusnya).

Jika Anda melakukan hibernasi per program (tanpa dukungan aplikasi), bagaimana Anda menangani file yang terbuka? Bagaimana jika proses lain mengakses file tersebut untuk sementara? dll?

Mempertahankan status saat program tidak dimuat akan menjadi sulit.

Hanya menangguhkan utas dan membiarkannya ditukar ke disk akan memiliki efek yang sama?

Atau jalankan program di mesin virtual dan biarkan VM menangani penangguhan.

Akan
sumber
12

Jawaban singkatnya adalah "ya, tetapi tidak selalu dapat diandalkan". Lihat CryoPID:

http://cryopid.berlios.de/

File terbuka memang akan menjadi masalah paling umum. CryoPID menyatakan secara eksplisit:

File yang terbuka dan offset dikembalikan. File sementara yang telah dibatalkan tautannya dan tidak dapat diakses di sistem file selalu disimpan dalam gambar. File lain yang tidak ada di resume belum dikembalikan. Dukungan untuk menyimpan konten file untuk situasi seperti itu direncanakan.

Masalah yang sama juga akan mempengaruhi koneksi TCP, meskipun CryoPID mendukung tcpcp untuk melanjutkan koneksi.

Ulisses Montenegro
sumber
3
Setelah menekan tombol kirim, saya sekarang menyadari ini sangat mirip dengan spam / iklan untuk CryoPID. Ini bukan - Saya hanyalah pengguna utilitas yang puas, sungguh.
Ulisses Montenegro
6

Saya memperluas Cryopid menghasilkan paket yang disebut Cryopid2 tersedia dari SourceForge. Ini dapat memigrasikan proses serta melakukan hibernasi (bersama dengan file dan soket yang terbuka - data di soket / pipa disedot ke dalam proses saat hibernasi dan diludahi kembali saat proses dimulai ulang).

Alasan saya belum aktif dengan proyek ini adalah saya bukan pengembang kernel - baik ini (dan / atau cryopid asli) perlu mendapatkan seseorang yang dapat menjalankannya dengan kernel terbaru (misalnya Linux 3.x) .

Metode Cryopid berfungsi - dan mungkin merupakan solusi terbaik untuk proses hibernasi / migrasi tujuan umum di Linux yang pernah saya temui.

Mark O'Neill
sumber
3

Seperti yang telah dicatat orang lain, sulit bagi OS untuk menyediakan fungsionalitas ini, karena aplikasi perlu memiliki beberapa pengecekan kesalahan bawaan untuk menangani aliran yang rusak.

Namun, di samping catatan, beberapa bahasa pemrograman dan alat yang menggunakan mesin virtual secara eksplisit mendukung fungsi ini, seperti bahasa pemrograman diri .

Cerin
sumber
0

Ctrl-Z meningkatkan kemungkinan halaman proses akan ditukar, tetapi tidak membebaskan sumber daya proses sepenuhnya. Masalah dengan membebaskan sumber daya proses sepenuhnya adalah hal-hal seperti pegangan file, soket adalah sumber daya kernel yang dapat digunakan proses, tetapi tidak tahu cara bertahan sendiri. Jadi Ctrl-Z sebagus yang didapatnya.

Tobu
sumber
0

Ada beberapa penelitian tentang checkpoint / restore untuk Linux dalam 2.2 dan 2.4 hari, tetapi tidak pernah berhasil melewati prototipe. Dimungkinkan (dengan peringatan yang dijelaskan dalam jawaban lain) untuk nilai-nilai tertentu yang mungkin - Jika Anda dapat menulis modul kernel untuk melakukannya, itu mungkin. Tetapi untuk kemungkinan nilai umum (dapatkah saya melakukannya dari shell pada distribusi Linux komersial), itu belum memungkinkan.

florin
sumber
0

Ini semacam tujuan akhir dari sistem operasi berkerumun. Mathew Dillon berusaha keras untuk mengimplementasikan hal seperti ini dalam proyek Dragonfly BSD- nya.

Nikolai Fetissov
sumber
Apakah fitur ini diterapkan sepenuhnya di Dragonfly BSD?
Arjun J Rao
0

menambahkan solusi lain: Anda dapat menggunakan virtualbox. menjalankan aplikasi Anda di mesin virtual biasa dan cukup "simpan status mesin" kapan pun Anda mau. Saya tahu ini bukan jawaban, tetapi saya pikir ini bisa berguna ketika tidak ada pilihan nyata.

jika karena alasan apa pun Anda tidak menyukai virtualbox, vmware dan Qemu sama baiknya.

Omid Ataollahi
sumber
-2

Ada ctrl+zdi linux, tapi saya tidak yakin itu menawarkan fitur yang Anda tentukan. Saya curiga Anda menanyakan pertanyaan ini karena ternyata tidak

Simon Walker
sumber