我有一个 btrfs 磁盘(没有 raid),这给了我 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 空间多于可见数据的一个可能原因是盘区的不可访问部分(盘区中的数据包含已被覆盖的旧版本文件内容)。
为了分析这样的问题,我创建了 btdu,一个 btrfs 的磁盘使用情况分析器:
https://github.com/CyberShadow/btdu
该工具将识别差异的真正原因。