Re: Inconsistency between space used by ZFS snapshots reported by zfs list
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 03 Aug 2024 14:15:55 UTC
On 02/08/2024 23:29, Eric Borisch wrote:
> On Fri, Aug 2, 2024 at 4:05 PM Miroslav Lachman <000.fbsd@quip.cz
> <mailto:000.fbsd@quip.cz>> wrote:
>
> Many times it happened to me that I was looking for where the used
> space
> in the pool were allocated and I couldn't get the right result. Listing
> "zfs list -o space" lists info that snapshots are taking up the most
> space, but when I list the snapshots for a given filesystem (zfs
> list -r
> -t snapshot), the sum of the occupied space does not match previously
> reported used size.
>
> # zfs list -o space ssdtank1/vol1/db/postgres
> NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV
> USEDCHILD
> ank1/vol1/db/postgres 21.8G 169G 102G 67.0G 0B
> 0B
>
> # zfs list -H -p -r -t snapshot tank1/vol1/db/postgres | awk 'BEGIN {
> used=0 } { used=used+$2 } END { print used/1024/1024/1024"GB" }'
> 41.9309GB
>
> USEDSNAP from zfs list -o space: 102 G
> sum of snapshots sizes: 41.9309 GB
>
> Why it doesn't match?
> What is the real space used by snapshots? zfs list -o space or the sum
> of snapshots sizes listed by zfs list -r -t snapshot?
>
> The machine is FreeBSD 13.3-p4 amd64.
>
>
> Kind regards
> Miroslav Lachman
>
>
> From zfsprops(7):
>
> The used space of a snapshot (see the Snapshots section of
> zfsconcepts(7)) is
> space that is *referenced exclusively by this snapshot*. If this
> snapshot is
> destroyed, the amount of used space will be freed. *Space that is
> shared by
> multiple snapshots isn't accounted for in this metric.* When a
> snapshot is
> destroyed, space that was previously shared with this snapshot ca*n
> become*
> *unique to snapshots adjacent to it, thus changing the used space of
> those*
> *snapshots*. The used space of the latest snapshot can also be
> affected by
> changes in the file system. Note that the used space of a snapshot
> is a subset
>
> of the written space of the snapshot.
>
>
> So you have roughly 102-42 = 60GB of space that is referenced by /*more
> than one*/ snapshot, *and not* by the current (live filesystem) dataset.
>
> When you ask "what is the real space", it depends on what you're asking.
> All of the snapshots together take up 102G. For how much space you would
> recover for removing a given snapshot /now/, the /used/ property
> provides that, but note that each snapshot's /used/ property may
> increase as other snapshots are deleted. If you were to delete snapshots
> one by one, and check the /used/ property of the to-be-deleted snapshot
> just before deleting each one, adding those up should total close to 102G.
My problem is mainly in the following case. At 21:47 the Postgres
database deletion was started. After the internal cleanup job (vaccum)
runs, the FREE on the pool drops from 61GB to 15GB - so 46GB of raw
space is gone.
zfs list showed AVAIL 29GB before deletion, after delete & vaccum only
7.6GB AVAIL.
In the meantime, snapshots are created from cron every 15 minutes, and
that's where I would expect to see the 21GB or so that the available
space has changed by.
(I shortened the path to avoid line wrapping)
NAME USED AVAIL REFER
vol1/db/postgres@zfsnapsg_2024-08-02_21.00.00--M 40.8M - 66.4G
vol1/db/postgres@zfsnapsg_2024-08-02_21.02.00--H 53.8M - 66.4G
vol1/db/postgres@zfsnapsg_2024-08-02_21.15.00--M 496M - 66.4G
vol1/db/postgres@zfsnapsg_2024-08-02_21.30.00--M 379M - 66.5G
vol1/db/postgres@zfsnapsg_2024-08-02_21.45.00--M 454M - 66.5G
vol1/db/postgres@zfsnapsg_2024-08-02_22.00.00--M 1.13G - 67.0G
vol1/db/postgres@zfsnapsg_2024-08-02_22.02.00--H 613M - 66.8G
vol1/db/postgres@zfsnapsg_2024-08-02_22.15.00--M 2.29G - 66.8G
vol1/db/postgres@zfsnapsg_2024-08-02_22.30.00--M 6.12G - 67.0G
vol1/db/postgres@zfsnapsg_2024-08-02_22.45.00--M 1012M - 66.9G
vol1/db/postgres@zfsnapsg_2024-08-02_23.00.00--M 30.2M - 66.8G
vol1/db/postgres@zfsnapsg_2024-08-02_23.02.00--H 18.8M - 66.8G
vol1/db/postgres@zfsnapsg_2024-08-02_23.15.00--M 129M - 66.6G
Deletion and cleanup happened between 21:45 and 22:45.
So if this "zfs list-t snapshot" shows only exclusive "not shared" data
in snapshots, then you can never estimate how many snapshots together
contain space. If snapshot A takes up 3GB, snapshot B takes up 5GB, but
they have 2GB of shared data, then snapshot A will show 1GB and snapshot
B will show 3GB, which adds up to only 4GB, even though the total space
taken up by both snapshots (after including the shared space) will be 1
+ 2 + 3 = 6GB. Do I get it right?
> (Side note: awk, auto-initializes variables to 0, so you don't need the
> BEGIN clause.)
Yeah, I normally don't use BEGIN, I put it there by coincidence :)
Kind regards
Miroslav Lachman