From: David Sterba <dsterba@suse.cz>
To: fdmanana@kernel.org
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 00/18] btrfs: make send scale and perform better with shared extents
Date: Wed, 2 Nov 2022 17:01:09 +0100 [thread overview]
Message-ID: <20221102160108.GH5824@twin.jikos.cz> (raw)
In-Reply-To: <cover.1667315100.git.fdmanana@suse.com>
On Tue, Nov 01, 2022 at 04:15:36PM +0000, fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
>
> There are two problems with send regarding cloned extents:
>
> 1) Sometimes it ends up not cloning whole extents, but only a section of
> the extents, reducing in less extent sharing at the receiver and extra
> IO on the send side (reading data, issuing write commands) and on the
> receiver side too (writing more data). This is not only not optimal
> but it also surprises users and often gets reported (such as in the
> thread referenced in patch 09/18);
>
> 2) When we find that a data extent is directly shared more than 64 times,
> we don't attempt to clone it, because that requires backref walking to
> determine from which inode and range we should clone from and for
> extents with many backreferences, that can be too slow, specially if
> we have many thousands of extents with a huge amount of sharing each.
>
> This patchset solves the first problem completely (patch 09/18), and for
> the second issue while not fully eliminated, it's significantly improved.
> In a test scenario with 50 000 files where each file is reflinked 50 times,
> there's a performance improvement of ~70% to ~75% for both full and
> incremental send operations. This test and results are in the changelog
> of patch 17/18.
>
> After this we can now bump the limit from 64 max references to 1024, which
> is still a conservative value, but the goal is to get rid of such limit in
> the future (some more work required for that, but we're getting there).
>
> There's also a nice and simple performance optimization when processing
> extents that are not shared and we are using only one clone source (the
> send root itself, very common), with gains varying between ~9% to ~18%
> in some small scale tests where there are no shared extents or the majority
> of the extents are not shared. That's patch 08/18.
>
> The rest is just refactoring and cleanups in preparation for the optimization
> work for send, and a few bug fixes for error paths in the backref walking
> code and qgroup self tests. In particular the error paths for backref walking
> are important because with the latest patches they are triggered not just in
> case an error happens but also when the backref walking callbacks tell the
> backref walking code to stop early.
>
> More details in the changelogs of the patches.
>
> I've also left this in a git tree at:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/fdmanana/linux.git/log/?h=send_clone_performance_scalability
>
> Filipe Manana (18):
> btrfs: fix inode list leak during backref walking at resolve_indirect_refs()
> btrfs: fix inode list leak during backref walking at find_parent_nodes()
> btrfs: fix ulist leaks in error paths of qgroup self tests
> btrfs: remove pointless and double ulist frees in error paths of qgroup tests
> btrfs: send: avoid unnecessary path allocations when finding extent clone
> btrfs: send: update comment at find_extent_clone()
> btrfs: send: drop unnecessary backref context field initializations
> btrfs: send: avoid unnecessary backref lookups when finding clone source
> btrfs: send: optimize clone detection to increase extent sharing
> btrfs: use a single argument for extent offset in backref walking functions
> btrfs: use a structure to pass arguments to backref walking functions
> btrfs: reuse roots ulist on each leaf iteration for iterate_extent_inodes()
> btrfs: constify ulist parameter of ulist_next()
> btrfs: send: cache leaf to roots mapping during backref walking
> btrfs: send: skip unnecessary backref iterations
> btrfs: send: avoid double extent tree search when finding clone source
> btrfs: send: skip resolution of our own backref when finding clone source
> btrfs: send: bump the extent reference count limit for backref walking
Thanks a lot, the improvements look great. Added to misc-next.
prev parent reply other threads:[~2022-11-02 16:01 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-01 16:15 [PATCH 00/18] btrfs: make send scale and perform better with shared extents fdmanana
2022-11-01 16:15 ` [PATCH 01/18] btrfs: fix inode list leak during backref walking at resolve_indirect_refs() fdmanana
2022-11-01 16:15 ` [PATCH 02/18] btrfs: fix inode list leak during backref walking at find_parent_nodes() fdmanana
2022-11-01 16:15 ` [PATCH 03/18] btrfs: fix ulist leaks in error paths of qgroup self tests fdmanana
2022-11-01 16:15 ` [PATCH 04/18] btrfs: remove pointless and double ulist frees in error paths of qgroup tests fdmanana
2022-11-01 16:15 ` [PATCH 05/18] btrfs: send: avoid unnecessary path allocations when finding extent clone fdmanana
2022-11-01 16:15 ` [PATCH 06/18] btrfs: send: update comment at find_extent_clone() fdmanana
2022-11-01 16:15 ` [PATCH 07/18] btrfs: send: drop unnecessary backref context field initializations fdmanana
2022-11-01 16:15 ` [PATCH 08/18] btrfs: send: avoid unnecessary backref lookups when finding clone source fdmanana
2022-11-01 16:15 ` [PATCH 09/18] btrfs: send: optimize clone detection to increase extent sharing fdmanana
2022-11-01 16:15 ` [PATCH 10/18] btrfs: use a single argument for extent offset in backref walking functions fdmanana
2022-11-01 16:15 ` [PATCH 11/18] btrfs: use a structure to pass arguments to " fdmanana
2022-11-01 16:15 ` [PATCH 12/18] btrfs: reuse roots ulist on each leaf iteration for iterate_extent_inodes() fdmanana
2022-11-01 16:15 ` [PATCH 13/18] btrfs: constify ulist parameter of ulist_next() fdmanana
2022-11-01 16:15 ` [PATCH 14/18] btrfs: send: cache leaf to roots mapping during backref walking fdmanana
2022-11-01 16:15 ` [PATCH 15/18] btrfs: send: skip unnecessary backref iterations fdmanana
2022-11-01 16:15 ` [PATCH 16/18] btrfs: send: avoid double extent tree search when finding clone source fdmanana
2022-11-01 16:15 ` [PATCH 17/18] btrfs: send: skip resolution of our own backref " fdmanana
2022-11-01 16:15 ` [PATCH 18/18] btrfs: send: bump the extent reference count limit for backref walking fdmanana
2022-11-02 16:01 ` David Sterba [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221102160108.GH5824@twin.jikos.cz \
--to=dsterba@suse.cz \
--cc=fdmanana@kernel.org \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox