나는 (raid가 없는) btrfs 디스크를 가지고 있는데 이것은 du와 df 사이에 큰 차이를 줍니다:
$ df -h /pgdata
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-pgdata 85G 77G 7.1G 92% /pgdata
$ du -sh /pgdata
56G /pgdata
btrfs 명령은 동일한 결과를 제공합니다.
$ btrfs fi df -h /pgdata/
Data, single: total=82.94GiB, used=75.63GiB
System, DUP: total=32.00MiB, used=16.00KiB
Metadata, DUP: total=1.00GiB, used=365.73MiB
GlobalReserve, single: total=228.33MiB, used=0.00B
$ btrfs fi du -s /pgdata/
Total Exclusive Set shared Filename
55.84GiB 55.36GiB 491.34MiB /pgdata/
하위 볼륨이 없고(제 생각에는) btrfs subvolume list /pgdata
비어 있습니다. 나는 달렸 btrfs balance start /pgdata/ -dusage=66
지만 별로 달라진 것은 없었다.
$ btrfs fi usage /pgdata/
Overall:
Device size: 85.00GiB
Device allocated: 85.00GiB
Device unallocated: 1.00MiB
Device missing: 0.00B
Used: 76.50GiB
Free (estimated): 7.15GiB (min: 7.15GiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 228.52MiB (used: 0.00B)
Data,single: Size:82.94GiB, Used:75.79GiB (91.38%)
/dev/mapper/ubuntu--vg-pgdata 82.94GiB
Metadata,DUP: Size:1.00GiB, Used:365.78MiB (35.72%)
/dev/mapper/ubuntu--vg-pgdata 2.00GiB
System,DUP: Size:32.00MiB, Used:16.00KiB (0.05%)
/dev/mapper/ubuntu--vg-pgdata 64.00MiB
Unallocated:
/dev/mapper/ubuntu--vg-pgdata 1.00MiB
문제는 삭제된 inode가 아니며(머신이 3시간 전에 다시 시작됨) 다음과 같습니다.
$ lsof /pgdata |grep deleted
postgres 4107 postgres 4u REG 0,58 16777216 238658 /pgdata/postgresql/13/main/pg_wal/00000001000001E40000008A (deleted)
postgres 5589 postgres 45u REG 0,58 16777216 238753 /pgdata/postgresql/13/main/pg_wal/00000001000001E50000000E (deleted)
postgres 5590 postgres 45u REG 0,58 16777216 222523 /pgdata/postgresql/13/main/pg_wal/00000001000001E40000006A (deleted)
postgres 5591 postgres 26u REG 0,58 16777216 238992 /pgdata/postgresql/13/main/pg_wal/00000001000001E4000000F3 (deleted)
postgres 5592 postgres 52u REG 0,58 16777216 238986 /pgdata/postgresql/13/main/pg_wal/00000001000001E4000000ED (deleted)
postgres 5595 postgres 28u REG 0,58 16777216 238995 /pgdata/postgresql/13/main/pg_wal/00000001000001E4000000F6 (deleted)
postgres 5596 postgres 19u REG 0,58 16777216 222523 /pgdata/postgresql/13/main/pg_wal/00000001000001E40000006A (deleted)
postgres 5597 postgres 44u REG 0,58 16777216 222523 /pgdata/postgresql/13/main/pg_wal/00000001000001E40000006A (deleted)
postgres 5598 postgres 12u REG 0,58 16777216 238986 /pgdata/postgresql/13/main/pg_wal/00000001000001E4000000ED (deleted)
postgres 5604 postgres 85u REG 0,58 16777216 238988 /pgdata/postgresql/13/main/pg_wal/00000001000001E4000000EF (deleted)
postgres 5605 postgres 61u REG 0,58 16777216 238986 /pgdata/postgresql/13/main/pg_wal/00000001000001E4000000ED (deleted)
postgres 12936 postgres 58u REG 0,58 16777216 238995 /pgdata/postgresql/13/main/pg_wal/00000001000001E4000000F6 (deleted)
이 문제에 대한 다른 게시물을 찾았지만 그다지 큰 차이는 없었고(예상했던 것보다 사용량이 약 40% 더 많음) 항상 메타데이터나 스냅샷이었습니다. 여기는 그렇지 않은 것 같습니다.
여유 공간에 20GiB가 누락된 이유를 아는 사람이 있습니까?
답변1
보이는 것보다 더 많은 Btrfs 공간이 데이터에 할당되는 한 가지 가능한 이유는 익스텐트(덮어쓴 이전 버전의 파일 내용을 포함하는 익스텐트의 데이터)의 액세스할 수 없는 부분 때문입니다.
이러한 문제를 분석하기 위해 btrfs용 디스크 사용량 분석기인 btdu를 만들었습니다.
https://github.com/CyberShadow/btdu
이 도구는 불일치의 실제 원인을 식별합니다.