Tangguhkan / lanjutkan proses tunggal ke / dari disk


22

Kadang-kadang, kami ingin menunda proses intensif-memori pada server Ubuntu dan OS X kami untuk sementara membebaskan beberapa RAM untuk pekerjaan lain. Jika yang kami khawatirkan adalah penggunaan CPU, cara sederhana Ctrl-Zakan berhasil. Namun, kita harus dapat membebaskan RAM (dengan menuliskannya ke disk) dan kemudian memulai kembali proses (disk -> RAM) atau dengan kata lain "hibernasi" satu proses. Adakah petunjuk tentang cara melakukan ini? (Lebih disukai dari CLI.) Terima kasih.


7
Saya mengira bahwa ketika suatu proses dalam keadaan ditangguhkan, memori yang digunakan adalah kandidat untuk ditukar ke disk, jika diperlukan, dan ini harus dilakukan secara otomatis dari kernel.
enzotib

1
@enzotib - Saya tidak tahu apakah ini terjadi dan, secara teori, ini terdengar bagus. Namun, saya baru saja melakukan tes kasar dan dalam praktiknya itu tidak berhasil. Setiap proses baru yang muncul ketika 'pemakan RAM' ditangguhkan sangat lamban dan saya tidak mendeteksi aktivitas disk apa pun yang diharapkan jika RAM sedang ditukar ke disk.
Mike Covington

1
@frozenwithjoy Saya dapat mengkonfirmasi bahwa ini memang terjadi. Satu-satunya alasan saya dapat memikirkan bahwa proses yang ditangguhkan tidak akan secara bertahap ditukar adalah jika itu meminta memori yang tidak dapat diganti (sangat jarang, dan (kebanyakan) dicadangkan untuk root), atau jika memori yang dipetakannya dibagi dengan yang lain, proses aktif .
Gilles 'SO- stop being evil'

1
Sebuah istilah yang mungkin bisa membantu di sini adalah "checkpointing" (ya, bentuk kata kerja jelek). Ini umumnya masalah yang sulit karena program mungkin menggunakan beberapa sumber daya yang dapat mengubah status saat program sedang tidur. Mengelola masalah itu dulunya merupakan salah satu perbedaan antara Big Iron dan sedikit komputer fiddly.
dmckee

Jawaban:


8

Tidak ada fasilitas umum untuk hibernasi satu proses, hanya seluruh sistem.

Namun, jika Anda tidak peduli bahwa gambar proses tidak akan selamat dari reboot, ada fasilitas bawaan untuk menyimpan gambar proses ke disk: bertukar. Pastikan Anda memiliki ruang swap yang cukup, dan jika ada tekanan memori dan prosesnya tidak aktif (misalnya karena ditangguhkan), memorinya akan ditukar.

Jika Anda tahu bahwa proses tersebut kemungkinan tidak aktif untuk waktu yang lama dan bahwa Anda akan memerlukan waktu respons cepat, Anda dapat memaksa banyak RAM untuk dibebaskan sekarang dengan mengalokasikan banyak RAM dalam proses berdurasi pendek, mis

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

Anda tidak mendapatkan kendali atas apa yang ditukar, jadi proses lain mungkin ditukar. Di Linux, Anda dapat menukar proses kembali dengan secara paksa mengakses halaman yang dipetakannya. Skrip dalam jawaban ini akan melakukan itu: memuat ke memori semua halaman yang dipetakan oleh suatu proses (perhatikan bahwa ini termasuk file yang terbuka; Anda dapat melintasi daerah secara selektif berdasarkan informasi peta untuk menghindari pertukaran data yang Anda tahu Anda tidak perlu , lihat jawaban ini untuk informasi lebih lanjut).



5

Pastikan Anda memiliki banyak ruang swap. Pastikan sistem Anda diatur untuk lebih suka bertukar halaman tidak aktif ( vm.swappiness = 100 ). Maka harus cukup untuk menunda proses. Kernel akan lebih suka untuk menukar halaman tidak aktif keluar.


-1

Pada Mac OS X Anda dapat mencoba menggunakan purgeperintah (disediakan dengan Xcode) untuk membebaskan sebagian (tidak aktif) RAM.

vm_stat
purge
vm_stat

2
purgetidak akan membantu di sini. Ini menghapus cache disk, tetapi itu tidak akan menyebabkan memori proses untuk ditukar, dan itu tidak akan membuatnya lebih cepat untuk proses lain untuk mendapatkan RAM.
Gilles 'SO- stop being evil'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.