free -m, melihat kolom free tinggal beberapa ratus MB dari total beberapa GB, lalu menyimpulkan server butuh upgrade RAM. Reaksi ini wajar, karena kolomnya memang bernama free. Masalahnya, di Linux kolom itu hampir tidak pernah jadi angka yang tepat untuk menilai apakah memori cukup. Gambaran yang lebih jujur ada di kolom available, ditambah beberapa tanda lain seperti aktivitas swap dan log OOM.
Artikel ini membahas empat anggapan yang sering muncul soal memori Linux. Untuk tiap anggapan, kita lihat kenapa terasa benar dan apa yang sebenarnya terjadi di kernel.
Kolom free kecil bukan berarti RAM hampir habis
/proc/meminfo. Di versi free yang lebih lama, kolom ini belum ada dan perannya diwakili baris -/+ buffers/cache.
Di meja support, pertanyaan ini sering muncul setelah orang melihat grafik monitoring yang menghitung cache sebagai memori terpakai. Grafiknya tampak merah, padahal available masih lega. Langkah pertama yang biasanya kita cek adalah kolom available, bukan free.
Tidak semua buff/cache bisa dilepas begitu saja
- Shared memory dan isi tmpfs, misalnya
/dev/shmatau/tmpyang di-mount sebagai tmpfs. Datanya hidup di RAM dan tidak punya salinan di disk, jadi kernel tidak bisa membuangnya. Paling jauh, kernel bisa memindahkannya ke swap. Nilainya terlihat di kolom shared padafreedan field Shmem di/proc/meminfo. - Dirty page, yaitu cache yang isinya sudah diubah tapi belum ditulis ke disk. Halaman ini harus di-flush dulu sebelum bisa dilepas, dan proses flush butuh waktu serta I/O.
- Cache yang sedang sering dipakai. Secara teknis cache ini bisa dibuang, tapi kalau dibuang, file yang sama akan langsung dibaca ulang dari disk. Ujungnya server malah lambat.
Membersihkan cache tidak membuat server lebih lega
/proc/sys/vm/drop_caches, kadang lewat cron. Hasilnya langsung terlihat. Kolom free melonjak dan grafik jadi hijau, jadi wajar kalau orang menganggap masalahnya selesai.
Yang sebenarnya terjadi, kernel membuang cache yang bersih, termasuk cache yang masih berguna. Setelah itu, setiap file yang dibutuhkan website harus dibaca ulang dari disk. Selama cache terisi kembali, response time biasanya naik dan beban I/O meningkat. Dalam beberapa jam atau hari, kolom free akan kecil lagi, karena kernel memang dirancang untuk mengisi RAM kosong dengan cache.
Langkah ini juga tidak menolong kalau masalah aslinya ada di aplikasi. Contohnya proses PHP yang terus membengkak atau worker yang jumlahnya terlalu banyak. Memori milik proses tidak tersentuh oleh drop_caches. Dokumentasi kernel sendiri memposisikan fitur ini untuk keperluan testing dan debugging, bukan untuk perawatan rutin. Kalau ada cron seperti ini di server, biasanya lebih aman dinonaktifkan, lalu cari tahu proses mana yang sebenarnya rakus memori.
Swap terpakai belum tentu RAM kurang
vm.swappiness, dan nilainya bisa berbeda antar distro atau image.
Jadi angka swap used yang diam di satu nilai biasanya bukan masalah. Yang perlu diwaspadai adalah aktivitas swap: halaman terus-menerus dipindah ke swap lalu dibaca balik ke RAM. Kondisi ini disebut thrashing. Saat thrashing, CPU banyak menunggu disk dan aplikasi terasa macet, padahal penggunaan CPU-nya tidak tinggi. Di vmstat, aktivitas ini terlihat di kolom si (swap in) dan so (swap out). Kalau kedua kolom itu terus bernilai di atas nol selama beberapa detik berturut-turut, server memang sedang kekurangan memori.
Tanda memori benar-benar kurang dan cara mengeceknya
- Kolom available kecil dibanding total dan terus menurun dari waktu ke waktu, bukan hanya turun sesaat saat ada lonjakan.
- Kolom si dan so di
vmstataktif terus-menerus, bukan sesekali. - Kernel log mencatat OOM killer. OOM killer adalah mekanisme kernel yang membunuh proses saat memori benar-benar habis. Gejala yang sering terlihat: MySQL atau PHP-FPM mati tiba-tiba tanpa error jelas di log aplikasinya.
- Kolom wa (I/O wait) di
vmstatnaik bersamaan dengan aktivitas swap.
BASH
# Ringkasan memori; fokus ke kolom available
free -m
# Lima sampel tiap 1 detik; perhatikan kolom si, so, dan wa
vmstat 1 5
# Detail dari kernel: memori tersedia, shared memory, dan dirty page
grep -E 'MemAvailable|Shmem:|Dirty' /proc/meminfo
# Jejak OOM killer di kernel log (sistem dengan systemd)
journalctl -k | grep -iE 'out of memory|oom-kill'
# Alternatif jika journalctl tidak tersedia
dmesg -T | grep -iE 'out of memory|oom-kill'
# Proses dengan pemakaian RAM terbesar
ps aux --sort=-rss | head -n 10free bisa mengikuti limit container atau perhitungan host, tergantung platform. Kalau angkanya terlihat janggal, bandingkan dengan grafik di panel penyedia dan cek dokumentasi mereka soal cara memori dihitung.
Yang perlu diingat saat melihat free -m berikutnya
vmstat tenang, cache besar adalah tanda server bekerja dengan benar, bukan tanda kehabisan RAM. Jangan bersihkan cache secara paksa. Mulai khawatir saat available terus menyusut, swap aktif bolak-balik, atau OOM killer muncul di kernel log. Di titik itu, cari dulu proses atau konfigurasi yang memakan memori sebelum memutuskan upgrade.