Btrfs - 缺少空间 - du 和 df 之间有 40% 的差异

Btrfs - 缺少空间 - du 和 df 之间有 40% 的差异

我有一个 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/Cyber​​Shadow/btdu

该工具将识别差异的真正原因。

相关内容