Keluar dari swap - apa yang terjadi?

8

Di mesin Debian VM saya dengan RAM 512 MB dan swap 348 MB, apa yang akan terjadi jika saya membuka file 1 GB di editor dan keluar dari memori?

Apakah akan merusak sistem? Atau jika tidak, bagaimana Linux akan menangani ini?

Bukankah lebih bijaksana untuk menginstal Swapspace jadi jika diperlukan di sana akan dibuat cukup swap secara otomatis dan dinamis?

sudo apt-get install swapspace
rubo77
sumber
Mengapa Anda tidak memberinya lebih banyak Swap?
guntbert
Ruang HDD mahal pada VM saya
rubo77
1
Catatan beberapa editor hanya mem-memetakan file dan tidak memuat semuanya di muka, ini memperbaiki masalah sepenuhnya karena mereka menggunakan file sumber itu sendiri sebagai 'swap'.
Vality

Jawaban:

17

Itu tergantung pada pengaturan yang Anda jalankan, dalam overcommit memori tertentu ( /proc/sys/vm/overcommit_memory; lihat man 5 procdetailnya).

Jika memory overcommit dinonaktifkan, editor (dan mungkin program lain yang mencoba pada saat yang bersamaan) berupaya mengalokasikan memori akan gagal. Mereka akan mendapatkan hasil kegagalan dari panggilan sistem. Terserah masing-masing program untuk menangani ini, meskipun sayangnya hasil yang umum adalah untuk crash. Editor juga dapat, misalnya, menolak untuk membuka file.

Jika memory overcommit diaktifkan, maka panggilan sistem yang meminta memori mungkin berhasil. Dalam hal ini, ketika memori benar-benar diakses, kernel akan melihat kehabisan memori, dan mematikan proses untuk merebut kembali memori. Proses itu mungkin atau mungkin bukan editor. Pilihannya diatur oleh oom_score(hasil dari beberapa heuristik kernel) dan oom_score_adj(dikonfigurasi) dari setiap proses pada sistem. Itu juga ada di halaman proc (5) itu.

derobert
sumber
5

Ada masalah besar di Linux dalam hal ini jika Anda mendekati kondisi kehabisan memori - Anda akan melihat bahwa seluruh sistem Anda menjadi benar-benar tidak responsif karena mulai banyak bertukar. Bahkan kursor mouse Anda mungkin menjadi sangat 'lambat' sehingga Anda tidak dapat memulai terminal dan mematikan proses pemakan memori yang menyinggung secara manual. Ini karena sejumlah besar operasi disk.

Untuk menghindari situasi ini, saya pribadi biasanya menonaktifkan swap sepenuhnya, sehingga kernel Linux selalu responsif dan dalam kasus terburuk pembunuh kehabisan memori (OOM) akan mematikan beberapa proses. Logika yang prosesnya dimatikan oleh OOM tergantung pada versi kernel.

Jadi jawabannya tidak - jangan aktifkan alokasi swap dinamis. Anda akan menghadapi hang mesin.

Sangat mudah untuk mencobanya dengan program yang secara konstan mengalokasikan sebagian memori dalam satu lingkaran. Simpan program ini ke file teks, memeater.c:

#include <stdlib.h>

int main() {
    for (;;) {char* mem=malloc(4096); mem[0]=1;};
}

Kemudian kompilasi:

$ gcc memeater.c -o memeater

dan lari:

$ ./memeater

Cobalah dengan swap, tanpa swap, dan dengan alokasi swap dinamis Anda.

Juga, perlu diingat bahwa dalam kebanyakan kasus kondisi OOM ini terjadi karena bug dalam perangkat lunak (kebocoran memori) atau Anda melakukan sesuatu yang salah seperti 'memuat file 10 GB ini di editor' atau 'menjalankan terlalu banyak ukuran file grafis secara paralel' dan lakukan kesimpulannya: Apakah Anda perlu swap atau tidak?

gena2x
sumber
1
+1 untuk menyarankan metode sederhana untuk mengujinya sendiri
rubo77
1
Ini menjawab pertanyaan kedua "apakah ide yang baik untuk menggunakan alokasi swap dinamis".
gena2x
@ gena2x Ya, itu ide yang sangat bagus, karena itu membuat sistem Anda lebih responsif dalam situasi kelebihan beban, alih-alih membunuh tugas Anda satu demi satu. -1. Meskipun yang terbaik jika Anda memiliki partisi swap yang besar dan tetap, tetapi memiliki penyebab lain (fragmentasi swap berkurang).
peterh
Jika Anda memiliki swap tetap yang besar, sistem Anda akan menjadi tidak responsif karena akan mencoba menukar tugas aktif ke disk dan mereka menukar mereka kembali selamanya.
gena2x