Kita semua pernah mengalaminya - beberapa program diminta untuk melakukan sesuatu yang membutuhkan banyak memori. Itu dengan patuh mencoba mengalokasikan semua memori ini, dan sistem segera mulai meronta-ronta, bertukar tanpa henti dan menjadi lamban atau tidak responsif.
Baru-baru ini saya mengalami ini pada laptop Ubuntu saya karena skrip Matlab mencoba mengalokasikan matriks yang sangat besar. Setelah ~ 5 + menit meronta-ronta, saya bisa Ctrl-F1 ke konsol dan membunuh Matlab. Saya lebih suka memiliki beberapa hot-key yang akan memberi saya kontrol sistem segera dan memungkinkan saya untuk membunuh proses yang menyinggung; atau, mungkin, secara diam-diam menolak untuk mengalokasikan buffer sebesar itu.
Apa cara tercepat untuk mendapatkan kembali kendali atas sistem Linux yang telah menjadi tidak responsif atau sangat lamban karena bertukar yang berlebihan?
Adakah cara yang efektif untuk mencegah swapping terjadi di tempat pertama, misalnya dengan membatasi jumlah memori proses yang diizinkan untuk mencoba mengalokasikan?
Sudah dijawab di atas dengan Alt-SysRq-F
Saya menjawab bagian ke-2 ini. Ya,
ulimit
masih berfungsi cukup baik untuk membatasi satu proses. Kamu bisa:Juga, sebagaimana disebutkan secara singkat:
Memang, cgroup menawarkan kontrol yang lebih maju, tetapi saat ini lebih rumit untuk dikonfigurasi menurut pendapat saya.
Ulimit sekolah tua
Sekali off
Inilah contoh sederhana:
Itu:
r2(){ r2 $@$@;};r2 r2
yang akan secara eksponensial mengunyah CPU dan RAM dengan menggandakan dirinya secara tak terbatas sambil meminta memori tumpukan.Seperti yang Anda lihat, itu terhenti ketika mencoba untuk meminta lebih dari 1GB.
Catatan,
-v
beroperasi pada alokasi memori virtual (total, yaitu fisik + swap).Perlindungan permanen
Untuk membatasi alokasi memori virtual,
as
adalah setara dengan-v
untuklimits.conf
.Saya melakukan hal berikut untuk melindungi dari proses pelanggaran tunggal:
address space limit = <physical memory> - 256MB
.Satu liner:
Untuk memvalidasi, ini menghasilkan yang berikut (misalnya pada sistem 16GB):
Catatan:
rss
opsi dalam membatasi.conf. Ini tidak dihormati oleh kernel yang lebih baru.CGroup yang lebih baru
Menawarkan lebih banyak kontrol, tetapi saat ini lebih kompleks untuk digunakan:
memory.max_usage_in_bytes
dapat menghitung dan membatasi memori fisik secara terpisah.ulimit -m
dan / ataurss
dalamlimits.conf
dimaksudkan untuk menawarkan fungsionalitas yang serupa, tetapi itu tidak berfungsi sejak kernel Linux 2.4.30!cgroup_enable=memory swapaccount=1
.cgm
sekarang tampaknya menjadi alat userspace yang didukung secara resmi.Misalnya untuk memeriksa pengaturan saat ini:
Misalnya untuk membatasi memori satu proses:
Untuk melihatnya beraksi mengunyah RAM sebagai proses latar belakang dan kemudian terbunuh:
Perhatikan pertumbuhan permintaan memori yang eksponensial (kekuatan 2).
Di masa depan, mari kita berharap untuk melihat "distro / vendor" pra-konfigurasi prioritas dan batasan cgroup (melalui unit systemd) untuk hal-hal penting seperti SSH dan tumpukan grafis, sehingga mereka tidak pernah kehabisan memori.
sumber
Anda mungkin dapat menekan Ctrl- zuntuk menunda program. Kemudian Anda dapat melakukan
kill %1
(atau apa pun nomor pekerjaan itu atau Anda dapat menggunakan PID).Anda dapat menggunakan
ulimit
perintah untuk mencoba membatasi jumlah memori yang tersedia untuk suatu proses.sumber
kill -STOP <pid>
yang akan melakukan hal yang sama dengan Ctrl-Z.Anda dapat menggunakan CGroups untuk membatasi penggunaan sumber daya dan mencegah masalah seperti itu: https://en.wikipedia.org/wiki/Cgroups
sumber
Selalu ada
xkill
perintah klasik (dari xorg-x11-apps-7.4-14.fc14.src.rpm di sistem saya). Saya kira seharusnya tidak terlalu sulit untuk membuat klon yang mengirim SIGSTOP daripada membunuh jendela target.sumber