Ini sering terjadi pada saya ketika saya sedang mengkompilasi perangkat lunak di latar belakang dan tiba-tiba semuanya mulai melambat dan akhirnya membeku [jika saya tidak melakukan apa-apa], karena saya kehabisan RAM dan ruang swap.
Pertanyaan ini mengasumsikan bahwa saya memiliki cukup waktu dan sumber daya untuk membuka Terminal Gnome, mencari melalui sejarah saya, dan menjalankan satu sudo
perintah.
Perintah apa yang bisa menyelamatkan saya dari keharusan melakukan boot ulang keras, atau boot ulang sama sekali?
command-line
ram
freeze
swap
Akiva
sumber
sumber
make
, coba-j4
misalnya untuk 4 build paralel pada satu waktu.Jawaban:
Dalam pengalaman saya, Firefox dan Chrome menggunakan lebih banyak RAM daripada 7 komputer pertama saya yang digabungkan. Mungkin lebih dari itu, tetapi saya sudah jauh dari poin saya. Hal pertama yang harus Anda lakukan adalah menutup browser Anda . Sebuah perintah?
Saya telah mengikat browser paling populer menjadi satu perintah di sana, tetapi jelas jika Anda menjalankan sesuatu yang lain (atau tahu Anda tidak menggunakan salah satu dari ini) hanya memodifikasi perintah. Ini
killall -9 ...
adalah bagian yang penting. Orang-orang memang ragu-ragu tentangSIGKILL
(nomor sinyal 9) tetapi browser sangat tangguh. Lebih dari itu, menghentikan secara lambatSIGTERM
akan berarti browser melakukan banyak pembersihan sampah - yang membutuhkan ledakan RAM tambahan - dan itu adalah sesuatu yang Anda tidak mampu dalam situasi ini.Jika Anda tidak bisa memasukkannya ke terminal yang sudah berjalan atau dialog Alt+ F2, pertimbangkan beralih ke TTY. Control+ Alt+ F2akan membawa Anda ke TTY2 yang memungkinkan Anda untuk masuk (meskipun mungkin lambat) dan bahkan harus membiarkan Anda menggunakan sesuatu seperti
htop
untuk men-debug masalah. Saya tidak berpikir saya pernah kehabisan RAM sampai saya tidak bisahtop
bangun.Solusi jangka panjang mencakup membeli lebih banyak RAM, menyewanya melalui komputer jarak jauh, atau tidak melakukan apa yang sedang Anda lakukan. Saya akan menyerahkan argumen ekonomi yang rumit kepada Anda, tetapi secara umum, RAM murah untuk dibeli, tetapi jika Anda hanya perlu jumlah burst, server VPS ditagih per menit, atau jam adalah pilihan yang baik.
sumber
lazygit
yang saya gunakan dari waktu ke waktu, mungkin sesuatu seperti itu dapat diterapkan di sini? Keseluruhankillall ...
skrip dapat direduksi menjadi sederhanaemptyram
atau semacamnyaemptyram
skrip daripada sekadar menekankillall -9 firefox
.Pada sistem dengan Kunci Permintaan Sistem Ajaib diaktifkan, menekan Alt + System Request+ f(jika tidak ditandai pada keyboard Anda, System Requestsering kali pada Print Screentombol tersebut) akan secara manual memanggil keluar dari memory killer (oomkiller) kernel, yang mencoba untuk memilih proses yang paling buruk untuk penggunaan memori dan bunuh. Anda dapat melakukan ini jika Anda memiliki waktu yang kurang dari yang telah Anda jelaskan dan sistem baru akan dimulai (atau mungkin sudah mulai) meronta-ronta - dalam hal ini Anda mungkin tidak peduli dengan pasti apa yang terbunuh, hanya saja Anda mengakhiri dengan sistem yang dapat digunakan. Kadang-kadang ini bisa berakhir dengan membunuh X, tetapi sebagian besar waktu ini jauh lebih baik dalam memilih proses yang buruk daripada sebelumnya.
sumber
kernel.sysrq
ke1
atau nomor termasuk bit yang benar di komputer Anda/etc/sysctl.d/10-magic-sysrq.conf
.Bertentangan dengan jawaban lain, saya sarankan Anda menonaktifkan swap saat Anda melakukan ini. Sementara swap membuat sistem Anda berjalan dengan cara yang dapat diprediksi, dan sering digunakan untuk meningkatkan throughput aplikasi mengakses disk (dengan mengusir halaman yang tidak digunakan untuk memberikan ruang bagi cache disk), dalam hal ini sepertinya sistem Anda sedang melambat ke tingkat yang tidak dapat digunakan karena terlalu banyak memori yang digunakan sedang diusir secara paksa untuk bertukar.
Saya akan merekomendasikan menonaktifkan swap sama sekali saat melakukan tugas ini, sehingga pembunuh kehabisan memori akan bertindak segera setelah RAM terisi.
Solusi alternatif:
zswap
di kernel. Ini mengkompres halaman sebelum dikirim untuk bertukar, yang mungkin memberikan ruang gerak yang cukup untuk mempercepat mesin Anda. Di sisi lain, itu hanya bisa menjadi penghalang dengan kompresi / dekompresi tambahan yang dilakukannya.tcc
), dengan mengorbankan sedikit kinerja runtime hit ke produk yang dikompilasi. (Ini biasanya dapat diterima jika Anda melakukan ini untuk tujuan pengembangan / debugging.)sumber
sudo swapoff -a
dapat menyelamatkan Anda ketika Anda sudah dalam keadaan terikat: itu akan segera menghentikan penggunaan ruang swap apa pun, yaitu pembunuh OOM harus dipanggil pada saat berikutnya dan membawa mesin ke dalam urutan kerja.sudo swapoff -a
juga merupakan tindakan pencegahan yang sangat baik ketika men-debug kebocoran memori atau mengkompilasi, katakanlah, firefox. Biasanya, swap sedikit berguna (misalnya untuk hibernasi atau menukar barang yang benar-benar tidak dibutuhkan), tetapi ketika Anda benar-benar menggunakan memori, pembekuannya lebih buruk.Anda dapat menggunakan perintah berikut (berulang kali jika perlu) untuk mematikan proses menggunakan RAM terbanyak pada sistem Anda:
Dengan:
ps -eo pid --no-headers --sort=-%mem
: menampilkan id proses semua proses yang berjalan, diurutkan berdasarkan penggunaan memorihead -1
: hanya simpan baris pertama (proses menggunakan sebagian besar memori)xargs kill -9
: bunuh prosesnyaEdit setelah komentar akurat Dmitry:
Ini adalah solusi cepat dan kotor yang harus dijalankan ketika tidak ada tugas sensitif yang berjalan (tugas yang tidak Anda inginkan
kill -9
).sumber
Sebelum menjalankan perintah yang menghabiskan sumber daya Anda, Anda juga bisa menggunakan systemr setrlimit (2) , mungkin dengan
ulimit
builtin bash shell Anda (ataulimit
builtin di zsh) terutama dengan-v
forRLIMIT_AS
. Kemudian konsumsi ruang alamat virtual terlalu besar (misalnya dengan mmap (2) atau sbrk (2) yang digunakan oleh malloc (3) ) akan gagal (dengan errno (3) sedangENOMEM
).Kemudian mereka (yaitu proses lapar di shell Anda, setelah Anda mengetik
ulimit
) akan dihentikan sebelum membekukan sistem Anda.Baca juga Linux Ate My RAM dan pertimbangkan untuk menonaktifkan overcommitment memori (dengan menjalankan perintah
echo 0 > /proc/sys/vm/overcommit_memory
sebagai root, lihat proc (5) ...).sumber
Dalam hal itu, sesuatu seperti "killall -9 make" (atau apa pun yang Anda gunakan untuk mengelola kompilasi Anda, jika tidak membuat). Ini akan menghentikan proses kompilasi lebih lanjut, akan SIGHUP semua proses kompiler diluncurkan dari itu (mudah-mudahan menyebabkan mereka berhenti juga) dan, sebagai bonus, tidak perlu sudo dengan anggapan Anda mengkompilasi sebagai pengguna yang sama dengan yang Anda login sebagai. Dan karena membunuh penyebab sebenarnya dari masalah Anda alih-alih browser web Anda, sesi X atau beberapa proses secara acak, itu tidak akan mengganggu apa pun yang Anda lakukan pada sistem pada saat itu.
sumber
Buat lebih banyak swap untuk Anda sendiri.
Yang berikut ini akan menambah 8G swap:
Itu masih lambat (Anda bertukar) tetapi Anda seharusnya tidak benar-benar kehabisan. Versi modern Linux dapat bertukar ke file. Tentang penggunaan hanya untuk partisi swap hari ini adalah untuk hibernasi laptop Anda.
sumber
fallocate -l 8G /root/moreswap
bukannyadd
menghindari keharusan melakukan 8GB I / O saat sistem meronta-ronta. Ini tidak bekerja dengan sistem file lain. Jelas bukan XFS, di mana swapon melihat luasan tidak tertulis sebagai lubang. (Saya kira diskusi milis xfs ini tidak berjalan dengan baik). Lihat jugaswapd
, daemon yang membuat / menghapus file swap dengan cepat untuk menghemat ruang disk. Juga askubuntu.com/questions/905668/…xul.dll
) adalah sekitar 50 MB, jadi sekitar 10 kali lebih berat dari kernel Linux.Salah satu cara untuk mendapatkan sepotong RAM gratis dalam waktu singkat adalah dengan menggunakan zram , yang menciptakan disk RAM terkompresi dan bertukar di sana. Dengan CPU setengah layak, ini jauh lebih cepat daripada swap biasa, dan tingkat kompresi cukup tinggi dengan banyak RAM RAM modern seperti browser web.
Dengan anggapan Anda telah menginstal dan mengkonfigurasi zram, yang harus Anda lakukan adalah menjalankan
sumber
sudo swapoff -a
akan menonaktifkan swap, membuat kernel secara otomatis membunuh proses dengan skor tertinggi jika sistem kehabisan memori. Saya menggunakan ini jika saya tahu saya akan menjalankan sesuatu RAM-berat yang saya lebih suka membunuh jika keluar dari kendali daripada membiarkannya masuk ke swap dan macet selamanya. Gunakansudo swapon -a
untuk mengaktifkannya kembali sesudahnya.Kemudian, Anda mungkin ingin melihat pengaturan swap Anda. Kedengarannya swap Anda ada di disk yang sama dengan partisi root, yang akan memperlambat sistem Anda ketika Anda menekan swap, jadi hindari itu jika Anda bisa. Juga, menurut saya, sistem modern sering dikonfigurasi dengan terlalu banyak swap. RAM 32GiB biasanya berarti swap 32GiB dialokasikan secara default, seolah-olah Anda benar-benar ingin memasukkan 32GiB ke dalam ruang swap Anda.
sumber
Hal lain yang dapat dilakukan adalah membebaskan cache halaman memori melalui perintah ini:
Dari dokumentasi kernel.org (penekanan ditambahkan):
sumber
/proc/sys/vm/swappiness
. Dengan swappiness diatur ke 0, Anda benar. Dengan pengaturan default 60, Anda sudah dekat. Namun dengan ditetapkan ke 200, bagaimanapun, itu akan menjadi halaman yang paling baru-baru ini digunakan dari proses yang berjalan yang dijatuhkan terlebih dahulu ... dalam kasus tertentu, perintah ini mungkin berguna. Tetapi menetapkan swappiness ke 0 (atau nilai rendah, mungkin 20 atau 30) akan menjadi pendekatan umum yang lebih baik.kswapd
bug (beberapa orang bahkan membuat cronjobs dengannya). Tapi Anda benar, saya ragu itu akan membantu dengan pertanyaan ini.Anda mengatakan "kompilasi di latar belakang". Apa yang kamu lakukan di latar depan? Jika Anda mengembangkannya dengan Eclipse atau sumber daya berat IDE lainnya, periksa apakah semuanya benar dihentikan di konsol.
Lingkungan pengembangan sering memungkinkan untuk memulai beberapa proses yang sedang dikembangkan, ini mungkin tetap menggantung juga setelah Anda tidak lagi tertarik pada mereka (dalam debugger, atau tidak selesai dengan baik). Jika pengembang tidak memperhatikan, puluhan proses yang terlupakan mungkin menumpuk di siang hari, menggunakan beberapa gigabyte secara bersamaan.
Periksa apakah semua yang harus diakhiri dalam IDE diakhiri.
sumber