2020년 4월 7일 화요일

du와 df가 서로 다른 사용량을 보여주는 경우에 대한 설명


du (disk usage)와 df (disk free)에서 측정하는 filesystem의 사용률/사용량에 차이가 발생하는 경우가 많습니다.   이는 du는 fsstat을 이용하고 df는 statfs를 이용하기 때문입니다.  즉, df는 filesystem level에서의 metadata 값을 보기 때문에, 어떤 파일을 지우더라도 만약 어떤 process에서 어떤 방법으로든 아직 그 파일을 쥐고 있다면, disk를 아직 그 파일이 차지하고 있는 것으로 보입니다.

가장 대표적인 케이스가 아래와 같이 tail -f 등으로 파일을 read하고 있는 경우입니다.

먼저, /에 12G가 차있고 실제로 12G의 파일들이 있다는 것을 확인합니다.

bash-4.2# cd /

bash-4.2# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        94G   12G   78G  14% /

bash-4.2# du -sh .
12G     .

다음으로 1G짜리 파일을 하나 만듭니다.

bash-4.2# dd if=/dev/zero of=/home/cecuser/111 bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.324121 s, 3.2 GB/s

그 다음에 다시 df와 du로 크기를 확인합니다.

bash-4.2# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        94G   13G   77G  15% /

bash-4.2# du -sh .
13G     .

이제 이렇게 만들어진 111이라는 파일에 tail -f 를 백그라운드로 걸어 read를 하도록 합니다.

bash-4.2# tail -f /home/cecuser/111 &
[1] 8624

그리고 111을 삭제합니다.  

bash-4.2# rm /home/cecuser/111

그래도 아까 백그라운드로 걸었던 tail -f 는 아직 살아있음을 보실 수 있습니다.  즉, 111 파일은 아직 열려 있습니다.

bash-4.2# jobs
[1]+  Running                 tail -f /home/cecuser/111 &

이제 df와 du로 filesystem의 사용량을 확인합니다.

bash-4.2# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        94G   13G   77G  15% /

bash-4.2# du -sh .
12G     .

즉, 여전히 df로는 13G 사용 중인 것으로 나오지만 du는 12G로 줄어든 것을 정확하게 보여줍니다.

이제 아까 걸어둔 tail -f를 kill 하겠습니다.

bash-4.2# jobs
[1]+  Running                 tail -f /home/cecuser/111 &

bash-4.2# kill %1
bash-4.2#
[1]+  Terminated              tail -f /home/cecuser/111


그러면 이제 df도 제대로 된 값인 12G를 보여줍니다.

bash-4.2# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        94G   12G   78G  14% /

bash-4.2# du -sh .
12G     .


댓글 없음:

댓글 쓰기