Beberapa perilaku tak terduga di sisi server terkadang disebabkan oleh keterbatasan sumber daya sistem. Linux dengan desainnya bertujuan untuk menggunakan semua memori fisik yang tersedia seefisien mungkin, dalam praktiknya, kernel Linux mengikuti aturan dasar bahwa halaman RAM kosong adalah RAM yang terbuang. Sistem ini menyimpan lebih banyak RAM daripada sekadar data aplikasi, yang terpenting adalah mencerminkan data dari drive penyimpanan untuk akses yang lebih cepat. Panduan proses debug ini bertujuan untuk menjelaskan cara mengidentifikasi berapa banyak sumber daya yang sebenarnya digunakan, dan cara mengenali masalah pemadaman sumber daya yang sebenarnya.
Proses berhenti secara tidak terduga
Tugas yang terhenti secara tiba-tiba sering kali disebabkan oleh sistem yang kehabisan memori, yang kemudian disebut sebagai pembunuh Kehabisan Memori (OOM) yang masuk. Jika suatu tugas dihentikan untuk menghemat memori, tugas tersebut akan masuk ke berbagai file log disimpan di /var/log/
Anda dapat mencari log untuk pesan peringatan kehabisan memori.
sudo grep -i -r 'out of memory' /var/log/
Grep memeriksa semua log di bawah direktori dan oleh karena itu akan menampilkan setidaknya perintah yang baru saja dijalankan dari file /var/log/auth.log
. Tanda log sebenarnya dari proses yang dihentikan OOM akan terlihat seperti berikut.
kernel: Out of memory: Kill process 9163 (mysqld) score 511 or sacrifice child
Catatan log di sini menunjukkan proses yang dimatikan adalah mysqld dengan pid 9163 dan skor OOM 511 pada saat dimatikan. Pesan log Anda mungkin berbeda tergantung pada distribusi Linux dan konfigurasi sistem.
Jika misalnya suatu proses penting untuk aplikasi web Anda terhenti akibat situasi kehabisan memori, Anda memiliki beberapa opsi, kurangi jumlah memori yang diminta oleh proses tersebut, larang proses untuk melakukan overcommit memori, atau cukup tambahkan lebih banyak memori untuk konfigurasi server Anda.
Penggunaan sumber daya saat ini
Linux hadir dengan beberapa alat praktis untuk melacak proses yang dapat membantu mengidentifikasi kemungkinan pemadaman sumber daya. Anda dapat melacak penggunaan memori misalnya dengan perintah di bawah ini.
free -h
Perintah tersebut mencetak statistik memori saat ini, misalnya dalam sistem 1 GB, outputnya sesuai dengan contoh di bawah ini.
total used free shared buffers cached
Mem: 993M 738M 255M 5.7M 64M 439M
-/+ buffers/cache: 234M 759M
Swap: 0B 0B 0B
Di sini penting untuk membedakan antara memori yang digunakan aplikasi, buffer, dan cache. Pada baris Mem keluarannya, akan tampak hampir 75% RAM kita sedang digunakan, tetapi lebih dari separuh memori yang digunakan ditempati oleh data cache.
Perbedaannya adalah meskipun aplikasi mencadangkan memori untuk digunakan sendiri, cache hanyalah data hard drive yang biasa digunakan yang disimpan sementara oleh kernel di ruang RAM untuk akses lebih cepat, yang pada tingkat aplikasi dianggap sebagai memori bebas.
Dengan mengingat hal itu, lebih mudah untuk memahami mengapa memori terpakai dan memori bebas dicantumkan dua kali, pada baris kedua dengan mudah dihitung penggunaan memori sebenarnya ketika memperhitungkan jumlah memori yang ditempati oleh buffer dan cache.
Dalam contoh ini, sistem hanya menggunakan 234 MB dari total 993 MB yang tersedia, dan tidak ada proses yang terancam dihentikan untuk menghemat sumber daya.
Alat lain yang berguna untuk memantau memori adalah ‘top’, yang menampilkan informasi berguna yang terus diperbarui tentang memori proses dan penggunaan CPU, runtime, dan statistik lainnya. Hal ini sangat berguna untuk mengidentifikasi tugas-tugas yang menghabiskan banyak sumber daya.
top
Anda dapat menggulir daftar menggunakan tombol Page Up dan Page Down pada keyboard Anda. Program berjalan di latar depan hingga dibatalkan dengan menekan ‘q’ untuk keluar. Penggunaan sumber daya ditampilkan dalam persentase dan memberikan gambaran mudah tentang beban kerja sistem Anda.
top - 17:33:10 up 6 days, 1:22, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 72 total, 2 running, 70 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 1017800 total, 722776 used, 295024 free, 66264 buffers
KiB Swap: 0 total, 0 used, 0 free. 484748 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 33448 2784 1448 S 0.0 0.3 0:02.91 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:01.92 kworker/u2:0
7 root 20 0 0 0 0 S 0.0 0.0 0:05.48 rcu_sched
Dalam contoh output yang ditunjukkan di atas, sistem dalam keadaan idle dan penggunaan memori nominal.
Periksa apakah proses Anda berisiko
Jika memori server Anda digunakan hingga dapat mengancam stabilitas sistem, pembunuh kehabisan memori akan memilih proses mana yang akan dihilangkan berdasarkan banyak variabel seperti jumlah pekerjaan yang dilakukan yang akan hilang dan total memori yang dibebaskan. Linux menyimpan skor untuk setiap proses yang berjalan, yang mewakili kemungkinan proses tersebut akan dihentikan dalam situasi OOM.
Skor ini disimpan dalam file di /proc//oom_score, dimana pid adalah nomor identifikasi untuk proses yang Anda cari. Pid dapat dengan mudah ditemukan menggunakan perintah berikut.
ps aux | grep <process name>
Output dari perintah saat mencari mysql misalnya akan mirip dengan contoh di bawah ini.
mysql 5872 0.0 5.0 623912 51236 ? Ssl Jul16 2:42 /usr/sbin/mysqld
Di sini ID proses adalah nomor pertama pada baris, dalam hal ini 5872, yang kemudian dapat digunakan untuk mendapatkan informasi lebih lanjut mengenai tugas khusus ini.
cat /proc/5872/oom_score
Pembacaan ini memberi kita nilai numerik tunggal untuk kemungkinan proses dihentikan oleh OOM killer. Semakin tinggi angkanya, semakin besar kemungkinan tugas tersebut dipilih jika situasi kehabisan memori muncul.
Jika proses penting Anda memiliki skor OOM yang sangat tinggi, mungkin proses tersebut membuang-buang memori dan harus diperhatikan. Namun skor OOM yang tinggi, jika penggunaan memori tetap nominal, tidak perlu dikhawatirkan. Pembunuh OOM dapat dinonaktifkan, namun hal ini tidak disarankan karena dapat menyebabkan pengecualian yang tidak tertangani dalam situasi kehabisan memori, yang mungkin menyebabkan kepanikan kernel atau bahkan penghentian sistem.
Nonaktifkan over commit
Di distribusi Linux utama, kernel secara default mengizinkan proses meminta lebih banyak memori daripada yang saat ini tersedia di sistem untuk meningkatkan pemanfaatan memori. Hal ini didasarkan pada heuristik bahwa proses tidak pernah benar-benar menggunakan semua memori yang diminta. Namun, jika sistem Anda berisiko kehabisan memori, dan Anda ingin mencegah hilangnya tugas karena OOM killer, Anda dapat melarang overcommit memori.
Untuk mengubah cara sistem menangani panggilan overcommit, Linux memiliki aplikasi bernama ‘sysctl’ yang digunakan untuk mengubah parameter kernel saat runtime. Anda dapat membuat daftar semua parameter yang dikontrol sysctl menggunakan yang berikut ini.
sudo sysctl -a
Parameter tertentu yang mengontrol memori diberi nama yang sangat imajinatif vm.overcommit_memory dan vm.overcommit_ratio. Untuk mengubah mode overcommit, gunakan perintah di bawah ini.
sudo sysctl -w vm.overcommit_memory=2
Parameter ini memiliki 3 nilai berbeda:
- 0 artinya “Perkirakan apakah kita mempunyai cukup RAM”
- 1 sama dengan “Selalu izinkan”
- 2 yang digunakan di sini memberitahu kernel untuk “Katakan tidak jika sistem tidak memiliki memori”
Bagian penting dalam mengubah mode overcommit adalah mengingat juga mengubah overcommit_ratio. Ketika overcommit_memory diatur ke 2, ruang alamat yang dikomit tidak boleh melebihi ruang swap ditambah persentase RAM fisik ini. Untuk dapat menggunakan seluruh memori sistem gunakan perintah selanjutnya.
sudo sysctl -w vm.overcommit_ratio=100
Perubahan ini segera diterapkan tetapi hanya akan bertahan hingga sistem di-boot ulang berikutnya. Agar perubahan tetap permanen, nilai parameter yang sama perlu ditambahkan ke file sysctl.conf. Buka file konfigurasi untuk diedit.
sudo nano /etc/sysctl.conf
Tambahkan baris yang sama ke akhir file.
vm.overcommit_memory=2
vm.overcommit_ratio=100
Simpan perubahan (ctrl + O) dan keluar (ctrl + X) editor. Server Anda akan membaca konfigurasi setiap kali boot, dan mencegah aplikasi melakukan overcommitting memori.