Skip to content
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

ZIL: Improve next log block size prediction. #14909

Closed
wants to merge 1 commit into from

Conversation

amotin
Copy link
Member

@amotin amotin commented May 27, 2023

Detect single-threaded workloads by checking the previous block is fully written and flushed. It allows to make size prediction logic much more precise and skip commit delays, since we can give up on write aggregation in that case.

Since single-threaded workloads are no longer delayed, increase zfs_commit_timeout_pct from 5 to 10%. Parallel workloads should less care about it, and it should provide more aggregation.

Remove zil_min_commit_timeout tunable, since very fast ZILs should detect most of workloads as single-threaded. And when not, not delaying writes wastes extra block space allocated for aggregation.

Track history in context of bursts, not individual log blocks. It allows to not blow away all the history by single large burst of many block, and same time allows optimizations covering multiple blocks in a burst and even predicted following burst. For each burst account its optimal block size and minimal first block size. Use that statistics from the last 8 bursts to predict first block size of the next burst.

Remove predefined set of block sizes. Allocate any size we see fit, multiple of 4KB, as required by ZIL now. With compression enabled by default, ZFS already writes pretty random block sizes, so this should not surprise space allocator any more.

Allow zio_alloc_zil() to allocate bigger blocks if predicted size does not align well with pool's minimum allocation size. ZIL can make a good use of whatever block size it is given.

Reduce max_waste_space from 12 to 6% and max_copied_data from 63KB to 8KB. It allows prediction to be more precise on large bursts, improve space efficiency and reduce extra memory copying.

How Has This Been Tested?

Manual single-threaded workload tests show expected new behavior. Heavily multi-threaded workload of VMware vMotion shows improvement of ZIL space efficiency from 67 to 86%.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Performance enhancement (non-breaking change which improves efficiency)
  • Code cleanup (non-breaking change which makes code smaller or more readable)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Library ABI change (libzfs, libzfs_core, libnvpair, libuutil and libzfsbootenv)
  • Documentation (a change to man pages or other documentation)

Checklist:

@amotin amotin added Status: Code Review Needed Ready for review and testing Status: Design Review Needed Architecture or design is under discussion labels May 27, 2023
@amotin amotin force-pushed the zil_predict branch 2 times, most recently from 2172b27 to 1b3816c Compare May 27, 2023 20:07
@amotin amotin requested review from prakashsurya and ryao May 28, 2023 01:23
@amotin
Copy link
Member Author

amotin commented Jun 8, 2023

Just rebased to a new master. Would appreciate a review.

Detect single-threaded workloads by checking the previous block is
fully written and flushed.  It allows to make size prediction logic
much more precise and skip commit delays, since we can give up on
write aggregation in that case.

Since single-threaded workloads are no longer delayed, increase
zfs_commit_timeout_pct from 5 to 10%.  Parallel workloads should
less care about it, and it should provide more aggregation.

Remove zil_min_commit_timeout tunable, since very fast ZILs should
detect most of workloads as single-threaded.  And when not, not
delaying writes wastes extra block space allocated for aggregation.

Track history in context of bursts, not individual log blocks.  It
allows to not blow away all the history by single large burst of
many block, and same time allows optimizations covering multiple
blocks in a burst and even predicted following burst.  For each
burst account its optimal block size and minimal first block size.
Use that statistics from the last 8 bursts to predict first block
size of the next burst.

Remove predefined set of block sizes.  Allocate any size we see fit,
multiple of 4KB, as required by ZIL now.  With compression enabled
by default, ZFS already writes pretty random block sizes, so this
should not surprise space allocator any more.

Allow zio_alloc_zil() to allocate bigger blocks if predicted size
does not align well with pool's minimum allocation size.  ZIL can
make a good use of whatever block size it is given.

Reduce max_waste_space from 12 to 6% and max_copied_data from 63KB
to 8KB.  It allows prediction to be more precise on large bursts,
improve space efficiency and reduce extra memory copying.

Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
@amotin amotin mentioned this pull request Jul 13, 2023
13 tasks
@amotin amotin marked this pull request as draft August 16, 2023 18:16
@amotin amotin removed Status: Code Review Needed Ready for review and testing Status: Design Review Needed Architecture or design is under discussion labels Aug 16, 2023
@amotin
Copy link
Member Author

amotin commented Aug 16, 2023

This needs rework on top of newer master. I'll return to it later.

@amotin amotin closed this Dec 5, 2023
@amotin amotin deleted the zil_predict branch December 5, 2023 21:09
amotin added a commit to amotin/zfs that referenced this pull request Jan 2, 2024
While picking parts from openzfs#14909 I've missed Linux tracing specific
ones, that went unnoticed in default configurations, but breaks the
build in some.

Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
@amotin amotin mentioned this pull request Jan 2, 2024
13 tasks
amotin added a commit to amotin/zfs that referenced this pull request Jan 2, 2024
While picking parts from openzfs#14909 I've missed Linux tracing specific
ones, that went unnoticed in default configurations, but breaks the
build in some.

Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
ixhamza pushed a commit to ixhamza/zfs that referenced this pull request Jan 3, 2024
While picking parts from openzfs#14909 I've missed Linux tracing specific
ones, that went unnoticed in default configurations, but breaks the
build in some.

Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
behlendorf pushed a commit that referenced this pull request Jan 9, 2024
While picking parts from #14909 I've missed Linux tracing specific
ones, that went unnoticed in default configurations, but breaks the
build in some.

Reviewed-by: Ameer Hamza <[email protected]>
Reviewed-by: Brian Atkinson <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
Closes #15730
ixhamza pushed a commit to ixhamza/zfs that referenced this pull request Mar 11, 2024
While picking parts from openzfs#14909 I've missed Linux tracing specific
ones, that went unnoticed in default configurations, but breaks the
build in some.

Reviewed-by: Ameer Hamza <[email protected]>
Reviewed-by: Brian Atkinson <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
Closes openzfs#15730
lundman pushed a commit to openzfsonwindows/openzfs that referenced this pull request Mar 13, 2024
While picking parts from openzfs#14909 I've missed Linux tracing specific
ones, that went unnoticed in default configurations, but breaks the
build in some.

Reviewed-by: Ameer Hamza <[email protected]>
Reviewed-by: Brian Atkinson <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
Closes openzfs#15730
lundman pushed a commit to openzfsonwindows/openzfs that referenced this pull request Mar 13, 2024
While picking parts from openzfs#14909 I've missed Linux tracing specific
ones, that went unnoticed in default configurations, but breaks the
build in some.

Reviewed-by: Ameer Hamza <[email protected]>
Reviewed-by: Brian Atkinson <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
Closes openzfs#15730
amotin added a commit to amotin/zfs that referenced this pull request Apr 17, 2024
While picking parts from openzfs#14909 I've missed Linux tracing specific
ones, that went unnoticed in default configurations, but breaks the
build in some.

Reviewed-by: Ameer Hamza <[email protected]>
Reviewed-by: Brian Atkinson <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
Closes openzfs#15730
behlendorf pushed a commit that referenced this pull request Apr 19, 2024
While picking parts from #14909 I've missed Linux tracing specific
ones, that went unnoticed in default configurations, but breaks the
build in some.

Reviewed-by: Ameer Hamza <[email protected]>
Reviewed-by: Brian Atkinson <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by:	Alexander Motin <[email protected]>
Sponsored by:	iXsystems, Inc.
Closes #15730
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant