summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2012-10-23 13:48:22 -0700
committerBrian Behlendorf <[email protected]>2012-11-02 15:45:56 -0700
commite95853a331529a6cb96fdf10476c53441e59f4e1 (patch)
tree30f0809324bb570d1e97ccbee054f1f0484d4668 /include
parente8fd45a0f975c6b8ae8cd644714fc21f14fac2bf (diff)
Add txgs-<pool> kstat file
Create a kstat file which contains useful statistics about the last N txgs processed. This can be helpful when analyzing pool performance. The new KSTAT_TYPE_TXG type was added for this purpose and it tracks the following statistics per-txg. txg - Unique txg number state - State (O)pen/(Q)uiescing/(S)yncing/(C)ommitted birth; - Creation time nread - Bytes read nwritten; - Bytes written reads - IOPs read writes - IOPs write open_time; - Length in nanoseconds the txg was open quiesce_time - Length in nanoseconds the txg was quiescing sync_time; - Length in nanoseconds the txg was syncing Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'include')
-rw-r--r--include/sys/dsl_pool.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/include/sys/dsl_pool.h b/include/sys/dsl_pool.h
index 99a131eec..40e96101d 100644
--- a/include/sys/dsl_pool.h
+++ b/include/sys/dsl_pool.h
@@ -65,6 +65,13 @@ typedef struct zfs_all_blkstats {
zfs_blkstat_t zab_type[DN_MAX_LEVELS + 1][DMU_OT_TOTAL + 1];
} zfs_all_blkstats_t;
+typedef struct txg_history {
+ kstat_txg_t th_kstat;
+ vdev_stat_t th_vs1;
+ vdev_stat_t th_vs2;
+ kmutex_t th_lock;
+ list_node_t th_link;
+} txg_history_t;
typedef struct dsl_pool {
/* Immutable */
@@ -76,6 +83,7 @@ typedef struct dsl_pool {
struct dsl_dataset *dp_origin_snap;
uint64_t dp_root_dir_obj;
struct taskq *dp_iput_taskq;
+ kstat_t *dp_txg_kstat;
/* No lock needed - sync context only */
blkptr_t dp_meta_rootbp;
@@ -92,6 +100,9 @@ typedef struct dsl_pool {
kmutex_t dp_lock;
uint64_t dp_space_towrite[TXG_SIZE];
uint64_t dp_tempreserved[TXG_SIZE];
+ uint64_t dp_txg_history_size;
+ list_t dp_txg_history;
+
/* Has its own locking */
tx_state_t dp_tx;
@@ -144,6 +155,10 @@ extern int dsl_pool_user_release(dsl_pool_t *dp, uint64_t dsobj,
extern void dsl_pool_clean_tmp_userrefs(dsl_pool_t *dp);
int dsl_pool_open_special_dir(dsl_pool_t *dp, const char *name, dsl_dir_t **);
+txg_history_t *dsl_pool_txg_history_add(dsl_pool_t *dp, uint64_t txg);
+txg_history_t *dsl_pool_txg_history_get(dsl_pool_t *dp, uint64_t txg);
+void dsl_pool_txg_history_put(txg_history_t *th);
+
#ifdef __cplusplus
}
#endif