Bisa.
Ada dua kondisi memori yang berbeda yang dapat Anda temui di Linux. Yang Anda temui tergantung pada nilai sysctl vm.overcommit_memory
( /proc/sys/vm/overcommit_memory
)
Pendahuluan:
Kernel dapat melakukan apa yang disebut 'memory overcommit'. Ini adalah saat kernel mengalokasikan program lebih banyak memori daripada yang sebenarnya ada dalam sistem. Ini dilakukan dengan harapan bahwa program tidak akan benar-benar menggunakan semua memori yang mereka alokasikan, karena ini adalah kejadian yang cukup umum.
overcommit_memory = 2
Ketika overcommit_memory
diatur ke 2
, kernel tidak melakukan overcommit sama sekali. Alih-alih ketika suatu program dialokasikan memori, dijamin akses untuk memiliki memori itu. Jika sistem tidak memiliki cukup memori bebas untuk memenuhi permintaan alokasi, kernel hanya akan mengembalikan kegagalan untuk permintaan tersebut. Terserah program untuk menangani situasi dengan anggun. Jika tidak memeriksa apakah alokasi berhasil ketika benar-benar gagal, aplikasi akan sering menemui segfault.
Dalam kasus segfault, Anda harus menemukan garis seperti ini di output dmesg
:
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
The at 0
berarti bahwa aplikasi mencoba mengakses pointer diinisiasi, yang dapat hasil dari gagal panggilan alokasi memori (tetapi bukan satu-satunya cara).
overcommit_memory = 0 dan 1
Ketika overcommit_memory
diatur ke 0
atau 1
, overcommit diaktifkan, dan program diizinkan untuk mengalokasikan lebih banyak memori daripada yang sebenarnya tersedia.
Namun, ketika sebuah program ingin menggunakan memori yang telah dialokasikan, tetapi kernel menemukan bahwa itu sebenarnya tidak memiliki cukup memori untuk memenuhinya, itu perlu mendapatkan beberapa memori kembali. Pertama mencoba untuk melakukan berbagai tugas pembersihan memori, seperti pembilasan cache, tetapi jika ini tidak cukup maka akan menghentikan proses. Pemutusan ini dilakukan oleh OOM-Killer. OOM-Killer melihat sistem untuk melihat program apa yang menggunakan memori apa, berapa lama mereka telah berjalan, siapa yang menjalankannya, dan sejumlah faktor lain untuk menentukan mana yang terbunuh.
Setelah proses itu terbunuh, memori yang digunakannya dibebaskan, dan program yang hanya menyebabkan kondisi kehabisan memori sekarang memiliki memori yang dibutuhkan.
Namun, bahkan dalam mode ini, program masih dapat ditolak permintaan alokasi. Ketika overcommit_memory
adalah 0
, kernel mencoba untuk mengambil perkiraan terbaik ketika harus mulai menyangkal permintaan alokasi. Ketika diatur ke 1
, saya tidak yakin tekad apa yang digunakannya untuk menentukan kapan harus menolak permintaan tetapi bisa menolak permintaan yang sangat besar.
Anda dapat melihat apakah Pembunuh OOM terlibat dengan melihat output dari dmesg
, dan menemukan pesan seperti:
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB