HomeFreeBSD

7303 dynamic metaslab selection

Description

7303 dynamic metaslab selection

illumos/illumos-gate@8363e80ae72609660f6090766ca8c2c18aa53f0c
https://github.com/illumos/illumos-gate/commit/8363e80ae72609660f6090766ca8c2c18aa53f0

https://www.illumos.org/issues/7303

This change introduces a new weighting algorithm to improve metaslab selection.
The new weighting algorithm relies on the SPACEMAP_HISTOGRAM feature. As a result,
the metaslab weight now encodes the type of weighting algorithm used
(size-based vs segment-based).

This also introduce a new allocation tracing facility and two new dcmds to help
debug allocation problems. Each zio now contains a zio_alloc_list_t structure
that is populated as the zio goes through the allocations stage. Here's an
example of how to use the tracing facility:

c5ec000::print zio_t io_alloc_list | ::walk list | ::metaslab_trace

MSID    DVA    ASIZE      WEIGHT             RESULT               VDEV
   -      0      400           0    NOT_ALLOCATABLE           ztest.0a
   -      0      400           0    NOT_ALLOCATABLE           ztest.0a
   -      0      400           0             ENOSPC           ztest.0a
   -      0      200           0    NOT_ALLOCATABLE           ztest.0a
   -      0      200           0    NOT_ALLOCATABLE           ztest.0a
   -      0      200           0             ENOSPC           ztest.0a
   1      0      400      1 x 8M            17b1a00           ztest.0a

1ff2400::print zio_t io_alloc_list | ::walk list | ::metaslab_trace

MSID    DVA    ASIZE      WEIGHT             RESULT               VDEV
   -      0      200           0    NOT_ALLOCATABLE           mirror-2
   -      0      200           0    NOT_ALLOCATABLE           mirror-0
   1      0      200      1 x 4M            112ae00           mirror-1
   -      1      200           0    NOT_ALLOCATABLE           mirror-2
   -      1      200           0    NOT_ALLOCATABLE           mirror-0
   1      1      200      1 x 4M            112b000           mirror-1
   -      2      200           0    NOT_ALLOCATABLE           mirror-2

If the metaslab is using segment-based weighting then the WEIGHT column will
display the number of segments available in the bucket where the allocation
attempt was made.

Author: George Wilson <george.wilson@delphix.com>
Reviewed by: Alex Reece <alex@delphix.com>
Reviewed by: Chris Siden <christopher.siden@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Paul Dagnelie <paul.dagnelie@delphix.com>
Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Don Brady <don.brady@intel.com>
Approved by: Richard Lowe <richlowe@richlowe.net>

Details

Provenance
jpaetzelAuthored on
Reviewer
matthew
Parents
rS315289: When draining a callout, don't clear CALLOUT_ACTIVE while it is running.
Branches
Unknown
Tags
Unknown