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:
| Kolom | Arti |
|---|---|
Filesystem | perangkat blok sumbernya (/dev/sda1, tmpfs, dan lain-lain) |
Size | total kapasitas filesystem |
Used | ruang yang sudah ditempati data |
Avail | ruang yang masih bisa dipakai user biasa |
Use% | persentase pemakaian dari Used + Avail |
Mounted on | titik 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:
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.txtOutput yang Dihasilkan:
ok: / 41%
ok: /dev/shm 0%
PERINGATAN: /data 88% terpakai (sisa 107G di /dev/sdb1)
ok: /backup 2%Bedah potongan awk di atas:
- Baris 9 (
awk 'NR>1 { ...): syaratNR>1meloloskan semua baris kecuali baris pertama — cara paling murah melewati header tabeldf. - Baris 10 (
pct = $5 + 0): kolomUse%berbentuk teks seperti88%; penjumlahan+ 0memaksaawkmengekstrak angkanya menjadi88— trik konversi yang lebih aman daripada membuang tanda%secara manual. - Baris 11–14 (tangga
if): skrip hanya melaporkan mount point yang sudah melewati ambang 80%. Format%-9smeratakan kolom nama agar baris OK dan PERINGATAN tetap sejajar. Mount/datapada 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:
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.txtOutput yang Dihasilkan:
/ 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:
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 -rnOutput yang Dihasilkan:
71688 proyek-lama
51200 proyek-lama/video.mp4
20480 proyek-lama/arsip.tar
4 proyek-lama/catatan.txtMari kita telaah blok di atas:
- Baris 2–4 (
dd if=/dev/zero ...):ddmenulis byte nol sebanyakbs × count—bs=1M count=50menghasilkan file tepat 50 MiB. Opsistatus=nonemeredam laporan statistikddagar output blok tetap bersih. - Baris 6 (
du -sk proyek-lama): opsi-kmenampilkan ukuran dalam KiB — satuan yang stabil untuk skrip, berbeda dengan-hyang membulatkan menurut seleradu. Total 71688 KiB terdiri dari isi file (71684 KiB) ditambah entri direktori itu sendiri (4 KiB). - Baris 7 (
du -sk .../* | sort -rn): satu tanda bintang memintadumengukur setiap isi folder,sort -rnmengurutkan angka dari terbesar, danheadtinggal ditambahkan bila daftarnya panjang. Hasilnya langsung menunjukkanvideo.mp4sebagai konsumen terbesar (51200 KiB), disusularsip.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):
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.30Kolom 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 .