1a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#ifndef FIO_STAT_H 2a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_STAT_H 3a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 4ec41265e81c70d8573d1359e27876c37c30c7d9dJens Axboe#include "iolog.h" 5ec41265e81c70d8573d1359e27876c37c30c7d9dJens Axboe 6a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct group_run_stats { 76eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li uint64_t max_run[DDIR_RWDIR_CNT], min_run[DDIR_RWDIR_CNT]; 86eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li uint64_t max_bw[DDIR_RWDIR_CNT], min_bw[DDIR_RWDIR_CNT]; 96eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li uint64_t io_kb[DDIR_RWDIR_CNT]; 106eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li uint64_t agg[DDIR_RWDIR_CNT]; 11a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint32_t kb_base; 12ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan uint32_t unit_base; 13a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint32_t groupid; 14771e58befea806d2d881953050c4e65329eee382Jens Axboe uint32_t unified_rw_rep; 15a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe}; 16a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 17a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe/* 18a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * How many depth levels to log 19a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe */ 20a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_MAP_NR 7 21a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_LAT_U_NR 10 22a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_LAT_M_NR 12 23a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 24a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe/* 25a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * Aggregate clat samples to report percentile(s) of them. 26a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 27a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * EXECUTIVE SUMMARY 28a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 29a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * FIO_IO_U_PLAT_BITS determines the maximum statistical error on the 30a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * value of resulting percentiles. The error will be approximately 31a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 1/2^(FIO_IO_U_PLAT_BITS+1) of the value. 32a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 33a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * FIO_IO_U_PLAT_GROUP_NR and FIO_IO_U_PLAT_BITS determine the maximum 34a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * range being tracked for latency samples. The maximum value tracked 35a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * accurately will be 2^(GROUP_NR + PLAT_BITS -1) microseconds. 36a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 37a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * FIO_IO_U_PLAT_GROUP_NR and FIO_IO_U_PLAT_BITS determine the memory 38a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * requirement of storing those aggregate counts. The memory used will 39a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * be (FIO_IO_U_PLAT_GROUP_NR * 2^FIO_IO_U_PLAT_BITS) * sizeof(int) 40a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * bytes. 41a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 42a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * FIO_IO_U_PLAT_NR is the total number of buckets. 43a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 44a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * DETAILS 45a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 46a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * Suppose the clat varies from 0 to 999 (usec), the straightforward 47a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * method is to keep an array of (999 + 1) buckets, in which a counter 48a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * keeps the count of samples which fall in the bucket, e.g., 49a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * {[0],[1],...,[999]}. However this consumes a huge amount of space, 50a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * and can be avoided if an approximation is acceptable. 51a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 52a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * One such method is to let the range of the bucket to be greater 53a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * than one. This method has low accuracy when the value is small. For 54a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * example, let the buckets be {[0,99],[100,199],...,[900,999]}, and 55a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * the represented value of each bucket be the mean of the range. Then 56a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * a value 0 has an round-off error of 49.5. To improve on this, we 57a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * use buckets with non-uniform ranges, while bounding the error of 58a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * each bucket within a ratio of the sample value. A simple example 59a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * would be when error_bound = 0.005, buckets are { 60a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * {[0],[1],...,[99]}, {[100,101],[102,103],...,[198,199]},.., 61a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * {[900,909],[910,919]...} }. The total range is partitioned into 62a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * groups with different ranges, then buckets with uniform ranges. An 63a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * upper bound of the error is (range_of_bucket/2)/value_of_bucket 64a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 65a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * For better efficiency, we implement this using base two. We group 66a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * samples by their Most Significant Bit (MSB), extract the next M bit 67a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * of them as an index within the group, and discard the rest of the 68a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * bits. 69a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 70a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * E.g., assume a sample 'x' whose MSB is bit n (starting from bit 0), 71a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * and use M bit for indexing 72a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 73a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * | n | M bits | bit (n-M-1) ... bit 0 | 74a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 75a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * Because x is at least 2^n, and bit 0 to bit (n-M-1) is at most 76a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * (2^(n-M) - 1), discarding bit 0 to (n-M-1) makes the round-off 77a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * error 78a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 79a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 2^(n-M)-1 2^(n-M) 1 80a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * e <= --------- <= ------- = --- 81a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 2^n 2^n 2^M 82a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 83a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * Furthermore, we use "mean" of the range to represent the bucket, 84a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * the error e can be lowered by half to 1 / 2^(M+1). By using M bits 85a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * as the index, each group must contains 2^M buckets. 86a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 87a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * E.g. Let M (FIO_IO_U_PLAT_BITS) be 6 88a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * Error bound is 1/2^(6+1) = 0.0078125 (< 1%) 89a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 90a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * Group MSB #discarded range of #buckets 91a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * error_bits value 92a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * ---------------------------------------------------------------- 93a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 0* 0~5 0 [0,63] 64 94a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 1* 6 0 [64,127] 64 95a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 2 7 1 [128,255] 64 96a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 3 8 2 [256,511] 64 97a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 4 9 3 [512,1023] 64 98a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * ... ... ... [...,...] ... 99a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 18 23 17 [8838608,+inf]** 64 100a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 101a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * * Special cases: when n < (M-1) or when n == (M-1), in both cases, 102a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * the value cannot be rounded off. Use all bits of the sample as 103a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * index. 104a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 105a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * ** If a sample's MSB is greater than 23, it will be counted as 23. 106a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe */ 107a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 108a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_PLAT_BITS 6 109a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_PLAT_VAL (1 << FIO_IO_U_PLAT_BITS) 110a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_PLAT_GROUP_NR 19 111a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_PLAT_NR (FIO_IO_U_PLAT_GROUP_NR * FIO_IO_U_PLAT_VAL) 112a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_LIST_MAX_LEN 20 /* The size of the default and user-specified 113a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe list of percentiles */ 114a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 115a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define MAX_PATTERN_SIZE 512 116a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_JOBNAME_SIZE 128 1174e59d0f3a3ff569bddb31fe6927a9faf204ae9bfJens Axboe#define FIO_JOBDESC_SIZE 256 118a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_VERROR_SIZE 128 119a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 120a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct thread_stat { 121a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe char name[FIO_JOBNAME_SIZE]; 122a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe char verror[FIO_VERROR_SIZE]; 123ddcc0b69aa4ed04c8681f447a1a6274bb8837a14Jens Axboe uint32_t error; 1242f122b135b7319ff8dd04dadf31ff28b301051a3Jens Axboe uint32_t thread_number; 125ddcc0b69aa4ed04c8681f447a1a6274bb8837a14Jens Axboe uint32_t groupid; 126a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint32_t pid; 1274e59d0f3a3ff569bddb31fe6927a9faf204ae9bfJens Axboe char description[FIO_JOBDESC_SIZE]; 128a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint32_t members; 129771e58befea806d2d881953050c4e65329eee382Jens Axboe uint32_t unified_rw_rep; 130a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 131a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe /* 132a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * bandwidth and latency stats 133a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe */ 1346eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li struct io_stat clat_stat[DDIR_RWDIR_CNT]; /* completion latency */ 1356eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li struct io_stat slat_stat[DDIR_RWDIR_CNT]; /* submission latency */ 1366eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li struct io_stat lat_stat[DDIR_RWDIR_CNT]; /* total latency */ 1376eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li struct io_stat bw_stat[DDIR_RWDIR_CNT]; /* bandwidth stats */ 1386eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li struct io_stat iops_stat[DDIR_RWDIR_CNT]; /* IOPS stats */ 139a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 140a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe /* 141a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * fio system usage accounting 142a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe */ 143a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t usr_time; 144a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t sys_time; 145a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t ctx; 146a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t minf, majf; 147a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 148a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe /* 149a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * IO depth and latency stats 150a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe */ 151a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t clat_percentiles; 152435d195a9da120c5a618129cdb73418f4748c20aVincent Kang Fu uint64_t percentile_precision; 153802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe fio_fp64_t percentile_list[FIO_IO_U_LIST_MAX_LEN]; 154a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 155a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint32_t io_u_map[FIO_IO_U_MAP_NR]; 156a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint32_t io_u_submit[FIO_IO_U_MAP_NR]; 157a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint32_t io_u_complete[FIO_IO_U_MAP_NR]; 158a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint32_t io_u_lat_u[FIO_IO_U_LAT_U_NR]; 159a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint32_t io_u_lat_m[FIO_IO_U_LAT_M_NR]; 1606eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li uint32_t io_u_plat[DDIR_RWDIR_CNT][FIO_IO_U_PLAT_NR]; 161a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t total_io_u[3]; 162a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t short_io_u[3]; 163a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t total_submit; 164a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t total_complete; 165a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 1666eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li uint64_t io_bytes[DDIR_RWDIR_CNT]; 1676eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li uint64_t runtime[DDIR_RWDIR_CNT]; 168a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t total_run_time; 169a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 170a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe /* 171a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * IO Error related stats 172a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe */ 173a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint16_t continue_on_error; 174a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint64_t total_err_count; 175ddcc0b69aa4ed04c8681f447a1a6274bb8837a14Jens Axboe uint32_t first_error; 176a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 177a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe uint32_t kb_base; 178ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan uint32_t unit_base; 1793e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe 1803e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe uint32_t latency_depth; 1813e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe uint64_t latency_target; 1823e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe fio_fp64_t latency_percentile; 1833e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe uint64_t latency_window; 184a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe}; 185a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 186b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboestruct jobs_eta { 187b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe uint32_t nr_running; 188b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe uint32_t nr_ramp; 189b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe uint32_t nr_pending; 190714e85f340194409d0abcf643cd2f154a7380a74Jens Axboe uint32_t nr_setting_up; 191b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe uint32_t files_open; 192d79db1222039e906dd49ae290daa59701f4e2385Jens Axboe uint32_t m_rate[DDIR_RWDIR_CNT], t_rate[DDIR_RWDIR_CNT]; 193d79db1222039e906dd49ae290daa59701f4e2385Jens Axboe uint32_t m_iops[DDIR_RWDIR_CNT], t_iops[DDIR_RWDIR_CNT]; 1946eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li uint32_t rate[DDIR_RWDIR_CNT]; 1956eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li uint32_t iops[DDIR_RWDIR_CNT]; 196b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe uint64_t elapsed_sec; 197b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe uint64_t eta_sec; 198b7f05eb03c84bdc1259d1bb1c348328b16164430Jens Axboe uint32_t is_pow2; 199ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan uint32_t unit_base; 2001d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe 2011d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe /* 2021d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe * Network 'copy' of run_str[] 2031d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe */ 2041d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe uint32_t nr_threads; 205372aecb9049618c1279a946b66f6b29066730951Jens Axboe uint8_t run_str[]; 206b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe}; 207b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe 208cef9175e52e8a240117b9f45b228fdaa0f1c0572Jens Axboeextern void stat_init(void); 209cef9175e52e8a240117b9f45b228fdaa0f1c0572Jens Axboeextern void stat_exit(void); 210cef9175e52e8a240117b9f45b228fdaa0f1c0572Jens Axboe 211952b05e00103bf45576e1860cde0626bd42ed52aCastor Fuextern struct json_object * show_thread_status(struct thread_stat *ts, struct group_run_stats *rs); 212a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void show_group_stats(struct group_run_stats *rs); 213af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboeextern int calc_thread_status(struct jobs_eta *je, int force); 214cf451d1ede3bbbd2fed3619eb43def054d5b5a5aJens Axboeextern void display_thread_status(struct jobs_eta *je); 2155b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboeextern void show_run_stats(void); 216b852e7cf097cec1c7fb92305f9c3c6b394bb39adJens Axboeextern void show_running_run_stats(void); 21706464907159baf7a1eeac654a023743e33f28d86Jens Axboeextern void check_for_running_stats(void); 2185b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboeextern void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr); 21937f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboeextern void sum_group_stats(struct group_run_stats *dst, struct group_run_stats *src); 22037f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboeextern void init_thread_stat(struct thread_stat *ts); 22137f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboeextern void init_group_run_stat(struct group_run_stats *gs); 2223e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboeextern void eta_to_str(char *str, unsigned long eta_sec); 223b29ad56266faa33326de00e315d2b34b735fb028Jens Axboeextern int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, double *mean, double *dev); 224a269790cd25788dd4226641a3ceab1b3c8fda14bJens Axboeextern unsigned int calc_clat_percentiles(unsigned int *io_u_plat, unsigned long nr, fio_fp64_t *plist, unsigned int **output, unsigned int *maxv, unsigned int *minv); 225e5bd13470beaeed9c4a6835b7b92265fb94173a9Jens Axboeextern void stat_calc_lat_m(struct thread_stat *ts, double *io_u_lat); 226e5bd13470beaeed9c4a6835b7b92265fb94173a9Jens Axboeextern void stat_calc_lat_u(struct thread_stat *ts, double *io_u_lat); 2272e33101f218a1603eeecca969f5b7a0e98696a01Jens Axboeextern void stat_calc_dist(unsigned int *map, unsigned long total, double *io_u_dist); 2286bb58215842760895071d9f331da4dc2dfc16f30Jens Axboeextern void reset_io_stats(struct thread_data *); 2292e33101f218a1603eeecca969f5b7a0e98696a01Jens Axboe 230b29ad56266faa33326de00e315d2b34b735fb028Jens Axboestatic inline int usec_to_msec(unsigned long *min, unsigned long *max, 231b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe double *mean, double *dev) 232b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe{ 233b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe if (*min > 1000 && *max > 1000 && *mean > 1000.0 && *dev > 1000.0) { 234b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe *min /= 1000; 235b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe *max /= 1000; 236b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe *mean /= 1000.0; 237b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe *dev /= 1000.0; 238b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe return 0; 239b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe } 240b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe 241b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe return 1; 242b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe} 243a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 244a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#endif 245