Print this page
4752 fan out read zio taskqs
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: Eric Schrock <eric.schrock@delphix.com>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Approved by: Dan McDonald <danmcd@omniti.com>


   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright (c) 2013 by Delphix. All rights reserved.
  25  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
  26  */
  27 
  28 /*
  29  * SPA: Storage Pool Allocator
  30  *
  31  * This file contains all the routines used when modifying on-disk SPA state.
  32  * This includes opening, importing, destroying, exporting a pool, and syncing a
  33  * pool.
  34  */
  35 
  36 #include <sys/zfs_context.h>
  37 #include <sys/fm/fs/zfs.h>
  38 #include <sys/spa_impl.h>
  39 #include <sys/zio.h>
  40 #include <sys/zio_checksum.h>
  41 #include <sys/dmu.h>
  42 #include <sys/dmu_tx.h>
  43 #include <sys/zap.h>
  44 #include <sys/zil.h>


 112 /*
 113  * This table defines the taskq settings for each ZFS I/O type. When
 114  * initializing a pool, we use this table to create an appropriately sized
 115  * taskq. Some operations are low volume and therefore have a small, static
 116  * number of threads assigned to their taskqs using the ZTI_N(#) or ZTI_ONE
 117  * macros. Other operations process a large amount of data; the ZTI_BATCH
 118  * macro causes us to create a taskq oriented for throughput. Some operations
 119  * are so high frequency and short-lived that the taskq itself can become a a
 120  * point of lock contention. The ZTI_P(#, #) macro indicates that we need an
 121  * additional degree of parallelism specified by the number of threads per-
 122  * taskq and the number of taskqs; when dispatching an event in this case, the
 123  * particular taskq is chosen at random.
 124  *
 125  * The different taskq priorities are to handle the different contexts (issue
 126  * and interrupt) and then to reserve threads for ZIO_PRIORITY_NOW I/Os that
 127  * need to be handled with minimum delay.
 128  */
 129 const zio_taskq_info_t zio_taskqs[ZIO_TYPES][ZIO_TASKQ_TYPES] = {
 130         /* ISSUE        ISSUE_HIGH      INTR            INTR_HIGH */
 131         { ZTI_ONE,      ZTI_NULL,       ZTI_ONE,        ZTI_NULL }, /* NULL */
 132         { ZTI_N(8),     ZTI_NULL,       ZTI_BATCH,      ZTI_NULL }, /* READ */
 133         { ZTI_BATCH,    ZTI_N(5),       ZTI_N(8),       ZTI_N(5) }, /* WRITE */
 134         { ZTI_P(12, 8), ZTI_NULL,       ZTI_ONE,        ZTI_NULL }, /* FREE */
 135         { ZTI_ONE,      ZTI_NULL,       ZTI_ONE,        ZTI_NULL }, /* CLAIM */
 136         { ZTI_ONE,      ZTI_NULL,       ZTI_ONE,        ZTI_NULL }, /* IOCTL */
 137 };
 138 
 139 static void spa_sync_version(void *arg, dmu_tx_t *tx);
 140 static void spa_sync_props(void *arg, dmu_tx_t *tx);
 141 static boolean_t spa_has_active_shared_spare(spa_t *spa);
 142 static int spa_load_impl(spa_t *spa, uint64_t, nvlist_t *config,
 143     spa_load_state_t state, spa_import_type_t type, boolean_t mosconfig,
 144     char **ereport);
 145 static void spa_vdev_resilver_done(spa_t *spa);
 146 
 147 uint_t          zio_taskq_batch_pct = 75;       /* 1 thread per cpu in pset */
 148 id_t            zio_taskq_psrset_bind = PS_NONE;
 149 boolean_t       zio_taskq_sysdc = B_TRUE;       /* use SDC scheduling class */
 150 uint_t          zio_taskq_basedc = 80;          /* base duty cycle */
 151 
 152 boolean_t       spa_create_process = B_TRUE;    /* no process ==> no sysdc */




   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
  25  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
  26  */
  27 
  28 /*
  29  * SPA: Storage Pool Allocator
  30  *
  31  * This file contains all the routines used when modifying on-disk SPA state.
  32  * This includes opening, importing, destroying, exporting a pool, and syncing a
  33  * pool.
  34  */
  35 
  36 #include <sys/zfs_context.h>
  37 #include <sys/fm/fs/zfs.h>
  38 #include <sys/spa_impl.h>
  39 #include <sys/zio.h>
  40 #include <sys/zio_checksum.h>
  41 #include <sys/dmu.h>
  42 #include <sys/dmu_tx.h>
  43 #include <sys/zap.h>
  44 #include <sys/zil.h>


 112 /*
 113  * This table defines the taskq settings for each ZFS I/O type. When
 114  * initializing a pool, we use this table to create an appropriately sized
 115  * taskq. Some operations are low volume and therefore have a small, static
 116  * number of threads assigned to their taskqs using the ZTI_N(#) or ZTI_ONE
 117  * macros. Other operations process a large amount of data; the ZTI_BATCH
 118  * macro causes us to create a taskq oriented for throughput. Some operations
 119  * are so high frequency and short-lived that the taskq itself can become a a
 120  * point of lock contention. The ZTI_P(#, #) macro indicates that we need an
 121  * additional degree of parallelism specified by the number of threads per-
 122  * taskq and the number of taskqs; when dispatching an event in this case, the
 123  * particular taskq is chosen at random.
 124  *
 125  * The different taskq priorities are to handle the different contexts (issue
 126  * and interrupt) and then to reserve threads for ZIO_PRIORITY_NOW I/Os that
 127  * need to be handled with minimum delay.
 128  */
 129 const zio_taskq_info_t zio_taskqs[ZIO_TYPES][ZIO_TASKQ_TYPES] = {
 130         /* ISSUE        ISSUE_HIGH      INTR            INTR_HIGH */
 131         { ZTI_ONE,      ZTI_NULL,       ZTI_ONE,        ZTI_NULL }, /* NULL */
 132         { ZTI_N(8),     ZTI_NULL,       ZTI_P(12, 8),   ZTI_NULL }, /* READ */
 133         { ZTI_BATCH,    ZTI_N(5),       ZTI_N(8),       ZTI_N(5) }, /* WRITE */
 134         { ZTI_P(12, 8), ZTI_NULL,       ZTI_ONE,        ZTI_NULL }, /* FREE */
 135         { ZTI_ONE,      ZTI_NULL,       ZTI_ONE,        ZTI_NULL }, /* CLAIM */
 136         { ZTI_ONE,      ZTI_NULL,       ZTI_ONE,        ZTI_NULL }, /* IOCTL */
 137 };
 138 
 139 static void spa_sync_version(void *arg, dmu_tx_t *tx);
 140 static void spa_sync_props(void *arg, dmu_tx_t *tx);
 141 static boolean_t spa_has_active_shared_spare(spa_t *spa);
 142 static int spa_load_impl(spa_t *spa, uint64_t, nvlist_t *config,
 143     spa_load_state_t state, spa_import_type_t type, boolean_t mosconfig,
 144     char **ereport);
 145 static void spa_vdev_resilver_done(spa_t *spa);
 146 
 147 uint_t          zio_taskq_batch_pct = 75;       /* 1 thread per cpu in pset */
 148 id_t            zio_taskq_psrset_bind = PS_NONE;
 149 boolean_t       zio_taskq_sysdc = B_TRUE;       /* use SDC scheduling class */
 150 uint_t          zio_taskq_basedc = 80;          /* base duty cycle */
 151 
 152 boolean_t       spa_create_process = B_TRUE;    /* no process ==> no sysdc */