GNU/Linux >> Belajar Linux >  >> Linux

Pembunuh Kehabisan Memori Linux

Setiap distribusi Linux® memiliki proses Pembunuh Out-of-Memory (OOM) yang disertakan di dalamnya, tetapi apakah itu? Sederhananya, ini adalah proses pelestarian diri server. Untuk memahami sepenuhnya apa artinya, pertimbangkan bagaimana Linux mengalokasikan memori.

Alokasi memori Linux

Kernel Linux mengalokasikan memori berdasarkan permintaan untuk semua aplikasi yang sedang berjalan di server. Karena ini biasanya terjadi di awal, aplikasi biasanya tidak menggunakan semua memori yang ditetapkan. Hal ini memungkinkan kernel untuk melakukan over-commit memori, membuat memori lebih efisien. Komitmen berlebihan ini memungkinkan kernel untuk melakukan lebih banyak memori daripada yang sebenarnya tersedia secara fisik. Biasanya, ini bukan masalah. Masalah terjadi ketika terlalu banyak aplikasi mulai menggunakan memori yang dialokasikan untuk mereka sekaligus. Server menjalankan risiko crash karena kehabisan memori. Untuk mencegah server mencapai keadaan kritis itu, kernel juga berisi proses yang dikenal sebagai OOM Killer . Kernel menggunakan proses ini untuk memulai mematikan proses yang tidak penting sehingga server dapat tetap beroperasi.

Meskipun Anda mungkin berpikir ini seharusnya tidak menjadi masalah, OOM Killerkills memproses yang server anggap tidak penting, bukan pengguna. Misalnya, dua aplikasi yang biasanya dibunuh oleh OOM Killer terlebih dahulu adalah Apache® dan MySQL® karena menggunakan memori yang besar. Siapa pun yang memiliki situs web segera tahu bahwa itu adalah masalah besar. Jika Pembunuh OOM membunuh salah satunya, situs web sering langsung mogok.

Mengapa proses tertentu dimatikan?

Saat mencoba mencari tahu mengapa pembunuh OOM membunuh aplikasi atau proses, Anda dapat mencari beberapa hal yang dapat membantu mengungkapkan bagaimana dan mengapa proses itu dimatikan. Tempat pertama yang harus dilihat adalah di syslog dengan menjalankan perintah berikut:

$ grep -i kill /var/log/messages*
host kernel: Out of Memory: Killed process 5123 (exampleprocess)

Anda harus mendapatkan output yang mirip dengan contoh sebelumnya. Ibukota K diDibunuh memberi tahu Anda bahwa proses dihentikan dengan -9 sinyal, dan ini biasanya merupakan indikator yang baik bahwa Pembunuh OOM yang harus disalahkan.

Selain itu, Anda dapat menjalankan perintah berikut untuk memeriksa statistik memori tinggi dan rendah server:

$ free -lh

-l switch menunjukkan statistik memori tinggi dan rendah, dan -h switch menempatkan output ke gigabyte agar lebih mudah dibaca manusia. Anda dapat mengubah ini menjadi -m beralih jika Anda lebih suka output dalam megabyte. Manfaat tambahan dari perintah ini adalah memberi Anda informasi penggunaan memori Swap juga. Satu peringatan adalah bahwa free command hanya menyediakan snapshot saat ini, jadi Anda perlu memeriksanya beberapa kali untuk mendapatkan gambaran tentang apa yang terjadi.

Untungnya, vmstat perintah memperoleh keluaran memori selama periode waktu tertentu, dan bahkan memiliki opsi untuk tabel yang mudah dibaca:

$ vmstat -SM 10 20

Perintah sebelumnya mengeluarkan informasi memori sistem dua puluh kali pada interval 10 detik. Itulah yang dimaksud dengan 10 dan 20 dalam contoh sebelumnya. Anda dapat mengubah kedua angka ini agar sesuai dengan frekuensi dan jumlah yang lebih sesuai dengan kebutuhan Anda. -S switch menampilkan output dalam format tabel, dan -M switch menunjukkan output dalam megabyte. Gunakan perintah ini untuk menunjukkan apa yang aktif terjadi sepanjang parameter waktu yang Anda tentukan.

Alat lain yang bagus untuk digunakan adalah, tentu saja, top memerintah. top memerintahkan output oleh variabel CPU secara default, tetapi jika Anda mengklik shift + M setelah menjalankan top perintah, Anda bisa mendapatkan pembaruan waktu nyata untuk penggunaan memori alih-alih penggunaan CPU.

Konfigurasikan Pembunuh OOM

Karena OOM Killer adalah sebuah proses, Anda dapat mengonfigurasinya agar sesuai dengan kebutuhan Anda dengan lebih baik. Faktanya, OOM Killer sudah memiliki beberapa opsi konfigurasi yang memungkinkan administrator dan pengembang server untuk memilih bagaimana mereka ingin proses OOM Killer berperilaku ketika dihadapkan dengan memori-is-mendapatkan-berbahaya-situasi rendah. Ingatlah bahwa opsi ini dapat bervariasi tergantung pada faktor seperti lingkungan dan aplikasi yang berjalan.

Seperti apa pun yang melibatkan perubahan konfigurasi, selalu lebih baik untuk menguji perubahan yang diusulkan dalam lingkungan pengembangan atau pementasan sebelum membuat perubahan tersebut dalam lingkungan produksi langsung. Dengan cara ini, Anda tahu bagaimana sistem bereaksi terhadap perubahan tersebut. Terakhir, meskipun Anda yakin dengan rencana Anda, selalu buat cadangan sebelum membuat perubahan apa pun. Untuk opsi konfigurasi berikut, Anda harus menjadi root pengguna.

Opsi 1:Mulai ulang

Opsi pertama melibatkan pengeditan sysctl konfigurasi(/etc/sysctl.conf ), yang memungkinkan perubahan Anda tetap ada di antara reboot:

sysctl vm.panic_on_oom=1
sysctl kernel.panic=X
echo “vm.panic_on_oom=1” >> /etc/sysctl.conf
echo “kernel.panic=X” >> /etc/sysctl.conf

X pada perintah sebelumnya adalah jumlah detik yang Anda inginkan agar sistem menunggu sebelum reboot.

Dalam kebanyakan situasi, tidak mungkin untuk mem-boot ulang setiap kali sistem kehabisan memori. Meskipun pendekatan ini mungkin diperlukan untuk beberapa situasi, sebagian besar tidak memerlukan atau menjamin seluruh sistem di-boot ulang untuk mengatasi masalah tersebut.

Opsi 2:Lindungi atau korbankan proses

Opsi khusus ini membutuhkan pendekatan yang lebih tajam. Anda dapat (a) melindungi proses tertentu dengan membuatnya lebih kecil kemungkinannya untuk dibunuh oleh Pembunuh OOM atau (b) mengatur proses tertentu agar lebih mungkin untuk dibunuh. Anda dapat melakukannya dengan perintah berikut:

echo -15 > /proc/(PID)/oom_adj			(less likely)
echo 10 > /proc/(PID)/oom_adj			(more likely)

Ganti (PID) placeholder dalam perintah sampel dengan ID proses tertentu (atau PID) yang Anda minati. Untuk melindungi atau mengorbankan suatu proses, Anda perlu menemukan proses induk (asli). Gunakan perintah berikut untuk menemukan PPID (atau ID proses induk), tempat Anda mengganti proses dengan proses Anda (seperti Apache, MySQL, dan sebagainya):

pstree -p | grep "process" | head -1

Anda dapat melihat bahwa opsi ini sedikit lebih baik daripada opsi nuklir dari seluruh sistem reboot. Namun, bagaimana jika Anda memiliki proses yang sangat penting dan tidak dapat dihentikan?

Opsi 3:Mengecualikan proses

Opsi ini dilengkapi dengan catatan peringatan. Pengecualian proses dapat, dalam beberapa keadaan, menyebabkan perubahan perilaku yang tidak diinginkan, yang sebagian besar bergantung pada sistem dan konfigurasi sumber daya. Jika kernel tidak dapat menghentikan proses yang menggunakan memori dalam jumlah besar, kernel akan mulai mematikan proses lain yang tersedia. Ini dapat mencakup proses yang mungkin juga merupakan proses sistem operasi yang penting. Akibatnya, sistem berpotensi downcompletely. Cukuplah untuk mengatakan, gunakan opsi ini dengan sangat hati-hati.

Karena rentang yang valid untuk penyesuaian OOM Killer adalah antara -16 dan +15 , pengaturan -17 mengecualikan proses sepenuhnya karena berada di luar cakupan bilangan bulat yang dapat diterima untuk skala penyesuaian OOM Killer. Aturan umumnya adalah:semakin tinggi nilai numerik, semakin besar kemungkinan sebuah proses dipilih untuk dibunuh. Oleh karena itu, perintah untuk sepenuhnya mengecualikan proses adalah:

echo -17 > /proc/(PID)/oom_adj

Opsi 4:Opsi berisiko

Peringatan :Rackspace tidak merekomendasikan ini untuk lingkungan produksi.

Jika mem-boot ulang dan melindungi, mengorbankan, atau membebaskan proses saja tidak cukup baik, ada opsi terakhir yang berisiko:nonaktifkan OOM Killer sepenuhnya pilihan.

Opsi ini dapat menyebabkan salah satu hasil berikut:

  • kepanikan kernel yang serius
  • penghentian sistem
  • kerusakan sistem penuh

Mengapa? Ini mencegah server dari menjaga dirinya dari kehabisan sumber daya. Jika Anda menonaktifkan Pembunuh OOM sepenuhnya, maka tidak ada yang melindungi server dari kehabisan memori. Gunakan pengekangan dan kehati-hatian yang ekstrem saat mempertimbangkan opsi ini.

Untuk menjalankan opsi ini, jalankan perintah berikut:

sysctl vm.overcommit_memory=2
echo “vm.overcommit_memory=2” >> /etc/sysctl.conf

Sekarang setelah Anda mempelajari tentang OOM Killer, Anda tahu bagaimana menyesuaikan proses dengan kebutuhan lingkungan dan sistem Anda. Sebagai aturan umum, berhati-hatilah setiap kali Anda mengedit proses kernel. Pembunuh OOM tidak terkecuali dengan aturan itu.


Linux
  1. Linux – Penggunaan Memori Nyata?

  2. Linux – Bagaimana Pembunuh Oom Memutuskan Proses Mana Yang Harus Dibunuh Pertama?

  3. Terima Sinyal Sebelum Proses Dibunuh Oleh Oom Killer / Cgroups?

  1. Menemukan proses mana yang dibunuh oleh pembunuh OOM Linux

  2. Memori tidak aktif Linux

  3. Hindari pembongkaran aplikasi kehabisan memori linux

  1. Cara Menghapus Cache Memori di Linux

  2. Kali Linux 2018.1 Rilis

  3. Apakah alokasi memori di linux tidak memblokir?