레이블이 difference인 게시물을 표시합니다. 모든 게시물 표시
레이블이 difference인 게시물을 표시합니다. 모든 게시물 표시

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     .