-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ZFS send should use spill block prefetched from send_reader_thread #16701
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure why tests are showing failure even though the test results seems mostly fine. |
Crashed on assertion:
|
Hmm... Edit: Ok, I think it's because we turn off zfs_send_unmodified_spill_blocks |
0c8017c
to
a12c062
Compare
Updated to prefetch also unmodified spill block in send_reader_thread. |
The CI results are looking much better. @tuxoko if you rebase on the latest master it should resolve the Fedora 41 failure. |
Currently, even though send_reader_thread prefetches spill block, do_dump() will not use it and issues its own blocking arc_read. This causes significant performance degradation when sending datasets with lots of spill blocks. For unmodified spill blocks, we also create send_range struct for them in send_reader_thread and issue prefetches for them. We piggyback them on the dnode send_range instead of enqueueing them so we don't break send_range_after check. Signed-off-by: Chunwei Chen <[email protected]>
Currently, even though send_reader_thread prefetches spill block, do_dump() will not use it and issues its own blocking arc_read. This causes significant performance degradation when sending datasets with lots of spill blocks. For unmodified spill blocks, we also create send_range struct for them in send_reader_thread and issue prefetches for them. We piggyback them on the dnode send_range instead of enqueueing them so we don't break send_range_after check. Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Alexander Motin <[email protected]> Signed-off-by: Chunwei Chen <[email protected]> Co-authored-by: david.chen <[email protected]> Closes openzfs#16701
Motivation and Context
Currently, even though send_reader_thread prefetches spill block, do_dump() will not use it and issues its own blocking arc_read. This may cause significant performance degradation when sending datasets with lots of spill blocks.
For unmodified spill blocks, we also create send_range struct for them in send_reader_thread and issue prefetches for them. We piggyback them on the dnode send_range instead of enqueueing them so we don't break send_range_after check.
On one of our setup, we see at least 5x difference during affected areas.
Description
How Has This Been Tested?
Manual send/recv on dataset with spill block.
Manual raw send/recv on encrypted dataset with spill block.
Types of changes
Checklist:
Signed-off-by
.