Home >> Articles

Mengapa hasil df dan du berbeda?

Kalau Anda bekerja pada Linux Server, kemungkinan anda pernah berhadapan dengan situasi seperti ini. Anda ingin mengalokasikan free disk dengan menghapus file-file yang tidak diperlukan lagi, tetapi hasil dari perintah df -k tidak menunjukkan perubahan yang signifikan.
Kemudian Anda mencoba perintah du -k dan melihat jumlah disk space yang dialokasikan untuk direktori yang Anda perlukan tidak terlalu besar dan Anda dapat melakukan apa pun yang Anda ingin lakukan.

Misalkan

$ df -h /tmp/
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/hda3    500M     22M    478M     4%    /tmp
$
$
$ du -h /tmp
40M /tmp

Jadi mengapa, hasil df dan du ini berbeda?
Jawabannya adalah karena perbedaan file deskriptor yang sedang digunakan.
df menggunakan file deskriptor yang sedang digunakan (open file descriptor) untuk menghitung free disk space, sedangkan du menghitung alokasi disk pada file yang ada.

Pada saat suatu proses membuka/menggunakan file, file deskriptor terhadap file tersebut akan dialokasikan. Hal tersebut dapat dilihat menggunakan perintah lsof.
Kemudian, apabila file tersebut dihapus pada saat proses masih menggunakan file tersebut, file deskriptor pada file tersebut akan tetap terbuka, dan menjadi target dalam penghitungan free disk space oleh perintah df. Sedangkan, perintah du tidak menghitung file tersebut, karena file tersebut dianggap sudah tidak ada lagi.
Inilah yang mengakibatkan perbedaan hasil perintah df dan du.

Kemudian bagaimana cara menyamakan hasil tersebut?
Mudah saja, kita tinggal menutup file deskriptor yang menggunakan file-file yang sudah dihapus tersebut.
Cari proses ID yang menggunakan file tersebut, lalu gunakan kill -HUP untuk mengulang proses
tersebut menggunakan file lain, yang belum dihapus.

$ lsof | grep "deleted" | head -1
COMMAND     PID      USER   FD      TYPE     DEVICE     SIZE       NODE NAME
gnome-key  2911      root  txt       REG        3,2    92328     519005 /usr/bin/gnome-keyring-daemon.#prelink#.4aAELN (deleted)

$ kill -HUP 2911

Pastikan Anda mencoba di testing environment sebelum mencobanya di production environment ya.
Selamat mencoba

Leave a Reply