Disk yang penuh membuat layanan berhenti mendadak: database menolak menulis, aplikasi gagal membuat file sementara, dan log baru hilang entah ke mana. Berbeda dengan CPU yang hanya membuat proses mengantri, kehabisan ruang disk adalah kegagalan keras. Pemantauannya punya dua sisi yang berbeda perlakuannya: kapasitas — berapa banyak ruang dan inode yang tersisa — dan kecepatan — seberapa sibuk disk melayani baca-tulis. Chapter ini membahas keduanya dengan df, du, iostat, dan kawan-kawannya.

df: Sisa Ruang Filesystem #

Perintah df (disk free) melaporkan pemakaian setiap filesystem yang terpasang. Enam kolomnya menjawab enam pertanyaan berbeda:

KolomArti
Filesystemperangkat blok sumbernya (/dev/sda1, tmpfs, dan lain-lain)
Sizetotal kapasitas filesystem
Usedruang yang sudah ditempati data
Availruang yang masih bisa dipakai user biasa
Use%persentase pemakaian dari Used + Avail
Mounted ontitik tempat di pohon direktori

Persentase Use% dihitung dari Used/(Used+Avail), bukan dari Size — itulah sebabnya Used dan Avail kadang berjumlah kurang dari Size: sisanya adalah blok cadangan milik root (default 5% pada ext4) yang tidak dihitung agar sistem tetap bisa menyala saat disk “penuh”. Output df di tiap mesin berbeda isinya, jadi latihan parsing kita kerjakan pada fixture berformat identik dengan output asli:

bash
cat > df-output.txt <<'AKHIR'
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        46G   18G   26G  41% /
tmpfs           7.8G     0  7.8G   0% /dev/shm
/dev/sdb1       916G  781G  107G  88% /data
/dev/sdc1       916G   12G  858G   2% /backup
AKHIR

awk 'NR>1 {
  pct = $5 + 0
  if (pct >= 80)
    printf "PERINGATAN: %-9s %d%% terpakai (sisa %s di %s)\n", $6, pct, $4, $1
  else
    printf "ok: %-9s %d%%\n", $6, pct
}' df-output.txt

Output yang Dihasilkan:

text
ok: /         41%
ok: /dev/shm  0%
PERINGATAN: /data     88% terpakai (sisa 107G di /dev/sdb1)
ok: /backup   2%

Bedah potongan awk di atas:

  1. Baris 9 (awk 'NR>1 { ...): syarat NR>1 meloloskan semua baris kecuali baris pertama — cara paling murah melewati header tabel df.
  2. Baris 10 (pct = $5 + 0): kolom Use% berbentuk teks seperti 88%; penjumlahan + 0 memaksa awk mengekstrak angkanya menjadi 88 — trik konversi yang lebih aman daripada membuang tanda % secara manual.
  3. Baris 11–14 (tangga if): skrip hanya melaporkan mount point yang sudah melewati ambang 80%. Format %-9s meratakan kolom nama agar baris OK dan PERINGATAN tetap sejajar. Mount /data pada 88% adalah satu-satunya yang menuntut tindakan — misalnya mengaktifkan kompresi atau rotasi log dari Chapter Logs dan Log Rotation .

Di mesin nyata, perintah df -h menampilkan tabel yang sama dengan satuan yang sudah dibulatkan, dan df -h /data memeriksa satu mount point saja. Ambang 80% bukan angka sakral, tetapi posisi yang enak: masih menyisakan waktu bertindak sebelum data benar-benar tidak muat.

df -i: Habis Inode Padahal Space Tersisa #

Setiap file dan direktori menghabiskan satu inode — slot metadata yang menyimpan pemilik, izin, dan lokasi blok datanya. Jumlah inode ditentukan saat filesystem dibuat, dan bisa habis lebih cepat daripada ruangnya bila sistem menyimpan sangat banyak file kecil: cache renderer, file session aplikasi web, atau antrean email yang menumpuk. Gejalanya membingungkan: aplikasi melaporkan No space left on device padahal df -h menunjukkan ruang tersisa cukup. Perintah df -i membongkar keadaan sebenarnya:

bash
cat > df-i-output.txt <<'AKHIR'
Filesystem       Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1       3055616  412003 2643613   14% /
/dev/sdb1      61054976 61041600  13376  100% /data
AKHIR

awk 'NR>1 {
  printf "%-9s inode terpakai: %3d%% (%s dari %s)\n", $6, $5+0, $3, $2
}' df-i-output.txt

Output yang Dihasilkan:

text
/         inode terpakai:  14% (412003 dari 3055616)
/data     inode terpakai: 100% (61041600 dari 61054976)

Kedua kolom kiri adalah cermin dari df: Inodes total slot, IUsed yang terpakai, IFree sisa, IUse% persentasenya. Pada fixture di atas, /data memang hanya memakai 88% ruang byte-nya, tetapi inode-nya sudah 100% — tidak ada file baru yang bisa dibuat di sana sampai jutaan file lama dibersihkan. Operasi du -sh --inodes (coreutils modern) atau find . -xdev -type f | wc -l membantu menemukan direktori pemilik file terbanyak.

du: Menemukan Konsumen Terbesar #

Ketika df sudah menunjuk mount point yang penuh, du (disk usage) menggali lebih dalam: siapa yang paling banyak makan ruang. Trik klasiknya adalah menggabungkan du, sort, dan head — dan karena du menghitung blok disk yang benar-benar teralokasi, hasilnya bisa kita uji dengan file berukuran pasti buatan dd:

bash
mkdir -p proyek-lama
dd if=/dev/zero of=proyek-lama/video.mp4  bs=1M count=50 status=none
dd if=/dev/zero of=proyek-lama/arsip.tar bs=1M count=20 status=none
dd if=/dev/zero of=proyek-lama/catatan.txt bs=1K count=4 status=none

du -sk proyek-lama
du -sk proyek-lama/* | sort -rn

Output yang Dihasilkan:

text
71688	proyek-lama
51200	proyek-lama/video.mp4
20480	proyek-lama/arsip.tar
4	proyek-lama/catatan.txt

Mari kita telaah blok di atas:

  1. Baris 2–4 (dd if=/dev/zero ...): dd menulis byte nol sebanyak bs × count — bs=1M count=50 menghasilkan file tepat 50 MiB. Opsi status=none meredam laporan statistik dd agar output blok tetap bersih.
  2. Baris 6 (du -sk proyek-lama): opsi -k menampilkan ukuran dalam KiB — satuan yang stabil untuk skrip, berbeda dengan -h yang membulatkan menurut selera du. Total 71688 KiB terdiri dari isi file (71684 KiB) ditambah entri direktori itu sendiri (4 KiB).
  3. Baris 7 (du -sk .../* | sort -rn): satu tanda bintang meminta du mengukur setiap isi folder, sort -rn mengurutkan angka dari terbesar, dan head tinggal ditambahkan bila daftarnya panjang. Hasilnya langsung menunjukkan video.mp4 sebagai konsumen terbesar (51200 KiB), disusul arsip.tar (20480 KiB).

Untuk menyisir mesin sungguhan, pola yang sama dipakai berjenjang: du -sh /var/* | sort -rh | head, lalu turun ke subfolder terbesar sampai pelakunya ketemu. Ingat bahwa du menghitung blok yang dialokasikan — file 1 byte tetap memakan 4 KiB — sehingga total du per folder bisa sedikit lebih besar daripada ukuran logis file di dalamnya.

iostat dan iotop: Sisi Kecepatan #

Kapasitas hanyalah separuh cerita; separuh lainnya adalah kecepatan. Disk yang jenuh membuat semua operasi terasa lambat meski ruangnya masih tersisa banyak. Alat iostat dari paket sysstat mengukur laju baca-tulis per perangkat; mesin latihan kita tidak memasangnya, jadi berikut contoh tampilan iostat -x 2 1 dengan kolom-kolom kuncinya (output aslinya memuat beberapa kolom lagi):

text
Linux 6.1.0-18-amd64 (server-kantor)  14/05/26  _x86_64_  (4 CPU)

Device     r/s     rkB/s    w/s    wkB/s   aqu-sz   await  %util
sda       12.50    640.00   8.30   120.50     0.08    3.90  14.20
sdb       98.20   5020.10   4.10    80.20     1.65   16.10  81.30

Kolom r/s dan w/s adalah jumlah operasi baca/tulis per detik, aqu-sz panjang antrean rata-rata, await rata-rata waktu tunggu satu operasi dalam milidetik, dan %util persentase waktu perangkat benar-benar sibuk. Bacaan di atas menunjukkan sdb hampir jenuh (%util 81.30) dengan antrean 1.65 dan await yang memburuk — tanda disk ini menjadi bottleneck, sementara sda masih santai. Alat pendampingnya, iotop, memecah I/O per proses layaknya top (umumnya butuh hak root); alternatif tanpa paket tambahan adalah vmstat -d yang mencatat totalan statistik per disk sejak boot. Penjelasan kolom lengkap ada di iostat(1) .

SMART: Kesehatan Fisik Perangkat #

Kapasitas dan kecepatan menggambarkan kinerja hari ini; SMART (Self-Monitoring, Analysis and Reporting Technology) memprediksi esok. Sensor di dalam disk mencatat suhu, sektor rusak yang direalokasi, dan usia mekanis — data yang bisa menandakan kegagalan sebelum terjadi. Pembacaannya lewat smartctl dan interpretasinya kita bedah tuntas di Chapter Disk Health Monitoring .

Ruang, inode, laju I/O, dan kesehatan fisik kini terbaca semua. Satu sumber daya terakhir belum kita sentuh — yang paling sulit diduga karena melibatkan pihak luar: jaringan. Kita lanjutkan ke Chapter Network Monitoring .