stat.c revision c551f65a0a2a972c19f9c274f3cf24f4b6d98680
13c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <stdio.h> 23c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <string.h> 33c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <sys/time.h> 43c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <sys/types.h> 55c4e1dbc4ec6ee963220c5f4e64a04cd6130dc81Jens Axboe#include <sys/stat.h> 63c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <dirent.h> 73c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <libgen.h> 83c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <math.h> 93c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 103c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include "fio.h" 117c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe#include "diskutil.h" 12c7c6cb4cb3114ec4ce3107e15c184e161b50122eJens Axboe#include "lib/ieee754.h" 133c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 143c39a379542fd819dbc5cf6daf59380911c39141Jens Axboevoid update_rusage_stat(struct thread_data *td) 153c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 16756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe struct thread_stat *ts = &td->ts; 173c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 18c8aaba193fd910f89486ba4caab0c023306fffaeJens Axboe getrusage(RUSAGE_SELF, &td->ru_end); 19079ad09b1ef22fa0d47c2cd2673908c5619aa41aJens Axboe 20c8aaba193fd910f89486ba4caab0c023306fffaeJens Axboe ts->usr_time += mtime_since(&td->ru_start.ru_utime, 21c8aaba193fd910f89486ba4caab0c023306fffaeJens Axboe &td->ru_end.ru_utime); 22c8aaba193fd910f89486ba4caab0c023306fffaeJens Axboe ts->sys_time += mtime_since(&td->ru_start.ru_stime, 23c8aaba193fd910f89486ba4caab0c023306fffaeJens Axboe &td->ru_end.ru_stime); 24c8aaba193fd910f89486ba4caab0c023306fffaeJens Axboe ts->ctx += td->ru_end.ru_nvcsw + td->ru_end.ru_nivcsw 25c8aaba193fd910f89486ba4caab0c023306fffaeJens Axboe - (td->ru_start.ru_nvcsw + td->ru_start.ru_nivcsw); 26c8aaba193fd910f89486ba4caab0c023306fffaeJens Axboe ts->minf += td->ru_end.ru_minflt - td->ru_start.ru_minflt; 27c8aaba193fd910f89486ba4caab0c023306fffaeJens Axboe ts->majf += td->ru_end.ru_majflt - td->ru_start.ru_majflt; 285ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe 29c8aaba193fd910f89486ba4caab0c023306fffaeJens Axboe memcpy(&td->ru_start, &td->ru_end, sizeof(td->ru_end)); 303c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 313c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 32833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong/* 33833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong * Given a latency, return the index of the corresponding bucket in 34833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong * the structure tracking percentiles. 35833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong * 36833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong * (1) find the group (and error bits) that the value (latency) 37833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong * belongs to by looking at its MSB. (2) find the bucket number in the 38833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong * group by looking at the index bits. 39833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong * 40833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong */ 41833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hongstatic unsigned int plat_val_to_idx(unsigned int val) 42833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong{ 43833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong unsigned int msb, error_bits, base, offset, idx; 44833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 45833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong /* Find MSB starting from bit 0 */ 46833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong if (val == 0) 47833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong msb = 0; 48833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong else 49833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong msb = (sizeof(val)*8) - __builtin_clz(val) - 1; 50833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 51716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe /* 52716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe * MSB <= (FIO_IO_U_PLAT_BITS-1), cannot be rounded off. Use 53716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe * all bits of the sample as index 54716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe */ 55833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong if (msb <= FIO_IO_U_PLAT_BITS) 56833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong return val; 57833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 58833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong /* Compute the number of error bits to discard*/ 59833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong error_bits = msb - FIO_IO_U_PLAT_BITS; 60833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 61833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong /* Compute the number of buckets before the group */ 62833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong base = (error_bits + 1) << FIO_IO_U_PLAT_BITS; 63833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 64716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe /* 65716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe * Discard the error bits and apply the mask to find the 66716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe * index for the buckets in the group 67716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe */ 68833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong offset = (FIO_IO_U_PLAT_VAL - 1) & (val >> error_bits); 69833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 70833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong /* Make sure the index does not exceed (array size - 1) */ 71833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong idx = (base + offset) < (FIO_IO_U_PLAT_NR - 1)? 72833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong (base + offset) : (FIO_IO_U_PLAT_NR - 1); 73833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 74833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong return idx; 75833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong} 76833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 77833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong/* 78833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong * Convert the given index of the bucket array to the value 79833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong * represented by the bucket 80833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong */ 81833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hongstatic unsigned int plat_idx_to_val(unsigned int idx) 82833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong{ 83833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong unsigned int error_bits, k, base; 84833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 85833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong assert(idx < FIO_IO_U_PLAT_NR); 86833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 87833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong /* MSB <= (FIO_IO_U_PLAT_BITS-1), cannot be rounded off. Use 88833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong * all bits of the sample as index */ 89833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong if (idx < (FIO_IO_U_PLAT_VAL << 1) ) 90833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong return idx; 91833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 92833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong /* Find the group and compute the minimum value of that group */ 93833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong error_bits = (idx >> FIO_IO_U_PLAT_BITS) -1; 94833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong base = 1 << (error_bits + FIO_IO_U_PLAT_BITS); 95833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 96833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong /* Find its bucket number of the group */ 97833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong k = idx % FIO_IO_U_PLAT_VAL; 98833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 99833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong /* Return the mean of the range of the bucket */ 100833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong return base + ((k + 0.5) * (1 << error_bits)); 101833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong} 102833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 103833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hongstatic int double_cmp(const void *a, const void *b) 104833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong{ 105802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe const fio_fp64_t fa = *(const fio_fp64_t *) a; 106802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe const fio_fp64_t fb = *(const fio_fp64_t *) b; 107833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong int cmp = 0; 108833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 109802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe if (fa.u.f > fb.u.f) 110833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong cmp = 1; 111802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe else if (fa.u.f < fb.u.f) 112833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong cmp = -1; 113833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 114833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong return cmp; 115833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong} 116833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 117a269790cd25788dd4226641a3ceab1b3c8fda14bJens Axboeunsigned int calc_clat_percentiles(unsigned int *io_u_plat, unsigned long nr, 118a269790cd25788dd4226641a3ceab1b3c8fda14bJens Axboe fio_fp64_t *plist, unsigned int **output, 119a269790cd25788dd4226641a3ceab1b3c8fda14bJens Axboe unsigned int *maxv, unsigned int *minv) 120833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong{ 121833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong unsigned long sum = 0; 1221db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe unsigned int len, i, j = 0; 1231db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe unsigned int oval_len = 0; 1241db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe unsigned int *ovals = NULL; 1251db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe int is_last; 1261db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe 1271db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe *minv = -1U; 1281db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe *maxv = 0; 129833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 130802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe len = 0; 131802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe while (len < FIO_IO_U_LIST_MAX_LEN && plist[len].u.f != 0.0) 132802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe len++; 133716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe 134351de8de68623375d2693192047cef7411f16442Jens Axboe if (!len) 1351db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe return 0; 136351de8de68623375d2693192047cef7411f16442Jens Axboe 137716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe /* 138802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe * Sort the percentile list. Note that it may already be sorted if 139802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe * we are using the default values, but since it's a short list this 140802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe * isn't a worry. Also note that this does not work for NaN values. 141716050f2a0b858835d7836ad74e8b680973e08e8Jens Axboe */ 142802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe if (len > 1) 143802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe qsort((void*)plist, len, sizeof(plist[0]), double_cmp); 144833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 1454f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe /* 1464f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe * Calculate bucket values, note down max and min values 1474f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe */ 14807511a632ef219eb578d8c7f12825a275c640bcfJens Axboe is_last = 0; 14907511a632ef219eb578d8c7f12825a275c640bcfJens Axboe for (i = 0; i < FIO_IO_U_PLAT_NR && !is_last; i++) { 150833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong sum += io_u_plat[i]; 151802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe while (sum >= (plist[j].u.f / 100.0 * nr)) { 152802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe assert(plist[j].u.f <= 100.0); 153833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 1544f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe if (j == oval_len) { 1554f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe oval_len += 100; 1564f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe ovals = realloc(ovals, oval_len * sizeof(unsigned int)); 1574f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe } 1584f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe 1594f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe ovals[j] = plat_idx_to_val(i); 1601db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe if (ovals[j] < *minv) 1611db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe *minv = ovals[j]; 1621db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe if (ovals[j] > *maxv) 1631db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe *maxv = ovals[j]; 16407511a632ef219eb578d8c7f12825a275c640bcfJens Axboe 16507511a632ef219eb578d8c7f12825a275c640bcfJens Axboe is_last = (j == len - 1); 16607511a632ef219eb578d8c7f12825a275c640bcfJens Axboe if (is_last) 16707511a632ef219eb578d8c7f12825a275c640bcfJens Axboe break; 16807511a632ef219eb578d8c7f12825a275c640bcfJens Axboe 1694f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe j++; 1704f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe } 1714f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe } 172833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 1731db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe *output = ovals; 1741db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe return len; 1751db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe} 1761db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe 1771db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe/* 1781db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe * Find and display the p-th percentile of clat 1791db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe */ 1801db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboestatic void show_clat_percentiles(unsigned int *io_u_plat, unsigned long nr, 1811db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe fio_fp64_t *plist) 1821db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe{ 1831db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe unsigned int len, j = 0, minv, maxv; 1841db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe unsigned int *ovals; 1851db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe int is_last, scale_down; 1861db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe 1871db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe len = calc_clat_percentiles(io_u_plat, nr, plist, &ovals, &maxv, &minv); 1881db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe if (!len) 1891db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe goto out; 1901db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe 1914f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe /* 1924f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe * We default to usecs, but if the value range is such that we 1934f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe * should scale down to msecs, do that. 1944f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe */ 1954f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe if (minv > 2000 && maxv > 99999) { 1964f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe scale_down = 1; 1974f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe log_info(" clat percentiles (msec):\n |"); 1984f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe } else { 1994f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe scale_down = 0; 2004f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe log_info(" clat percentiles (usec):\n |"); 2014f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe } 202833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 2034f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe for (j = 0; j < len; j++) { 2044f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe char fbuf[8]; 20581ab0b3ab4db39033e020a1e611197fe04df6c3eJens Axboe 2064f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe /* for formatting */ 2074f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe if (j != 0 && (j % 4) == 0) 2084f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe log_info(" |"); 209833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 2104f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe /* end of the list */ 2114f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe is_last = (j == len - 1); 212833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 2134f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe if (plist[j].u.f < 10.0) 2144f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe sprintf(fbuf, " %2.2f", plist[j].u.f); 2154f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe else 2164f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe sprintf(fbuf, "%2.2f", plist[j].u.f); 2174f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe 2184f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe if (scale_down) 2194f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe ovals[j] = (ovals[j] + 999) / 1000; 2204f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe 2214f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe log_info(" %sth=[%5u]%c", fbuf, ovals[j], is_last ? '\n' : ','); 2224f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe 2234f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe if (is_last) 2244f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe break; 2254f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe 2264f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe if (j % 4 == 3) /* for formatting */ 2274f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe log_info("\n"); 228833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong } 2294f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe 2301db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboeout: 2314f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe if (ovals) 2324f6f8298a2d3f19cec0ba65525930a62eee3967fJens Axboe free(ovals); 233833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong} 234833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 235b29ad56266faa33326de00e315d2b34b735fb028Jens Axboeint calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, 236b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe double *mean, double *dev) 2373c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 238687040842bf56502d33b6c0cb5d2af6da27d080cJens Axboe double n = is->samples; 2393c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 2403c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe if (is->samples == 0) 2413c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe return 0; 2423c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 2433c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe *min = is->min_val; 2443c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe *max = is->max_val; 2453c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 2463c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe n = (double) is->samples; 247802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe *mean = is->mean.u.f; 248e6d276f2c07cc35f3d57210713e8288bb44daf97Jens Axboe 249687040842bf56502d33b6c0cb5d2af6da27d080cJens Axboe if (n > 1.0) 250802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe *dev = sqrt(is->S.u.f / (n - 1.0)); 251ef9c5c40a9f4b0ce3be9f13cedaaf7e2a90d47a6Jens Axboe else 2524b43f54ed7dece502350658bee10eba551aeb4a4Jens Axboe *dev = 0; 253ef9c5c40a9f4b0ce3be9f13cedaaf7e2a90d47a6Jens Axboe 2543c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe return 1; 2553c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 2563c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 257a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboevoid show_group_stats(struct group_run_stats *rs) 2583c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 259dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe char *p1, *p2, *p3, *p4; 260dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe const char *ddir_str[] = { " READ", " WRITE" }; 261dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe int i; 262dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe 2637e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe log_info("\nRun status group %d (all jobs):\n", rs->groupid); 2643c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 265dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe for (i = 0; i <= DDIR_WRITE; i++) { 26690fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe const int i2p = is_power_of_2(rs->kb_base); 26790fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe 268dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe if (!rs->max_run[i]) 269dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe continue; 270dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe 27190fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe p1 = num2str(rs->io_kb[i], 6, rs->kb_base, i2p); 27290fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe p2 = num2str(rs->agg[i], 6, rs->kb_base, i2p); 27390fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe p3 = num2str(rs->min_bw[i], 6, rs->kb_base, i2p); 27490fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe p4 = num2str(rs->max_bw[i], 6, rs->kb_base, i2p); 275dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe 276b22989b9f9349b3c1d1c41846ab27ff0914bd6deJens Axboe log_info("%s: io=%sB, aggrb=%sB/s, minb=%sB/s, maxb=%sB/s," 2775ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " mint=%llumsec, maxt=%llumsec\n", ddir_str[i], p1, p2, 2785ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p3, p4, rs->min_run[i], 2795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe rs->max_run[i]); 280dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe 281dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe free(p1); 282dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe free(p2); 283dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe free(p3); 284dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe free(p4); 285dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe } 2863c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 2873c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 288b3605062146bce0136918763bb8eb584478ae042Jens Axboe#define ts_total_io_u(ts) \ 289b3605062146bce0136918763bb8eb584478ae042Jens Axboe ((ts)->total_io_u[0] + (ts)->total_io_u[1]) 290b3605062146bce0136918763bb8eb584478ae042Jens Axboe 291838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboestatic void stat_calc_dist(unsigned int *map, unsigned long total, 292838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe double *io_u_dist) 2932270890cef8d98ab97f87d348d16dce6454e631fJens Axboe{ 2942270890cef8d98ab97f87d348d16dce6454e631fJens Axboe int i; 2952270890cef8d98ab97f87d348d16dce6454e631fJens Axboe 2962270890cef8d98ab97f87d348d16dce6454e631fJens Axboe /* 2972270890cef8d98ab97f87d348d16dce6454e631fJens Axboe * Do depth distribution calculations 2982270890cef8d98ab97f87d348d16dce6454e631fJens Axboe */ 2992270890cef8d98ab97f87d348d16dce6454e631fJens Axboe for (i = 0; i < FIO_IO_U_MAP_NR; i++) { 300838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe if (total) { 301838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_dist[i] = (double) map[i] / (double) total; 302838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_dist[i] *= 100.0; 303838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe if (io_u_dist[i] < 0.1 && map[i]) 304838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_dist[i] = 0.1; 305838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe } else 306838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_dist[i] = 0.0; 3072270890cef8d98ab97f87d348d16dce6454e631fJens Axboe } 3082270890cef8d98ab97f87d348d16dce6454e631fJens Axboe} 3092270890cef8d98ab97f87d348d16dce6454e631fJens Axboe 31004a0feae73ca50d05914cc3c425b2a6949523204Jens Axboestatic void stat_calc_lat(struct thread_stat *ts, double *dst, 31104a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe unsigned int *src, int nr) 3122270890cef8d98ab97f87d348d16dce6454e631fJens Axboe{ 313838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe unsigned long total = ts_total_io_u(ts); 3142270890cef8d98ab97f87d348d16dce6454e631fJens Axboe int i; 3152270890cef8d98ab97f87d348d16dce6454e631fJens Axboe 3162270890cef8d98ab97f87d348d16dce6454e631fJens Axboe /* 3172270890cef8d98ab97f87d348d16dce6454e631fJens Axboe * Do latency distribution calculations 3182270890cef8d98ab97f87d348d16dce6454e631fJens Axboe */ 31904a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe for (i = 0; i < nr; i++) { 320838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe if (total) { 321838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe dst[i] = (double) src[i] / (double) total; 322838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe dst[i] *= 100.0; 323838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe if (dst[i] < 0.01 && src[i]) 324838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe dst[i] = 0.01; 325838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe } else 326838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe dst[i] = 0.0; 3272270890cef8d98ab97f87d348d16dce6454e631fJens Axboe } 3282270890cef8d98ab97f87d348d16dce6454e631fJens Axboe} 3292270890cef8d98ab97f87d348d16dce6454e631fJens Axboe 33004a0feae73ca50d05914cc3c425b2a6949523204Jens Axboestatic void stat_calc_lat_u(struct thread_stat *ts, double *io_u_lat) 33104a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe{ 33204a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe stat_calc_lat(ts, io_u_lat, ts->io_u_lat_u, FIO_IO_U_LAT_U_NR); 33304a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe} 33404a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe 33504a0feae73ca50d05914cc3c425b2a6949523204Jens Axboestatic void stat_calc_lat_m(struct thread_stat *ts, double *io_u_lat) 33604a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe{ 33704a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe stat_calc_lat(ts, io_u_lat, ts->io_u_lat_m, FIO_IO_U_LAT_M_NR); 33804a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe} 33904a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe 340b29ad56266faa33326de00e315d2b34b735fb028Jens Axboestatic void display_lat(const char *name, unsigned long min, unsigned long max, 341b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe double mean, double dev) 342ea2accc50fe911f7c24f08e62db55de4d2386b71Jens Axboe{ 343b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe const char *base = "(usec)"; 344b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe char *minp, *maxp; 345ea2accc50fe911f7c24f08e62db55de4d2386b71Jens Axboe 346b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe if (!usec_to_msec(&min, &max, &mean, &dev)) 347b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe base = "(msec)"; 348b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe 349b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe minp = num2str(min, 6, 1, 0); 350b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe maxp = num2str(max, 6, 1, 0); 351b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe 352b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe log_info(" %s %s: min=%s, max=%s, avg=%5.02f," 353b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe " stdev=%5.02f\n", name, base, minp, maxp, mean, dev); 354b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe 355b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe free(minp); 356b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe free(maxp); 357ea2accc50fe911f7c24f08e62db55de4d2386b71Jens Axboe} 358ea2accc50fe911f7c24f08e62db55de4d2386b71Jens Axboe 359756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboestatic void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts, 3603c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe int ddir) 3613c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 3623c9b60c1fb144950ca51220ffa18f485672c3ba6Jens Axboe const char *ddir_str[] = { "read ", "write" }; 3638879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe unsigned long min, max, runt; 364b3605062146bce0136918763bb8eb584478ae042Jens Axboe unsigned long long bw, iops; 3653c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe double mean, dev; 366b3605062146bce0136918763bb8eb584478ae042Jens Axboe char *io_p, *bw_p, *iops_p; 36790fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe int i2p; 3683c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 369ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe assert(ddir_rw(ddir)); 370ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe 371756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe if (!ts->runtime[ddir]) 3723c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe return; 3733c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 37490fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe i2p = is_power_of_2(rs->kb_base); 3758879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe runt = ts->runtime[ddir]; 3768879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe 3778879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe bw = (1000 * ts->io_bytes[ddir]) / runt; 37890fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe io_p = num2str(ts->io_bytes[ddir], 6, 1, i2p); 37990fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe bw_p = num2str(bw, 6, 1, i2p); 3808879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe 3810aacc50c2fa41e44512ce8eacfd3d679cb016d86Bruce Cran iops = (1000 * (uint64_t)ts->total_io_u[ddir]) / runt; 382b3605062146bce0136918763bb8eb584478ae042Jens Axboe iops_p = num2str(iops, 6, 1, 0); 383dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe 384cda99fa0fcca41fc0d54ecaa2fd600162a8de5d3Signed-off-by Steven Pratt log_info(" %s: io=%sB, bw=%sB/s, iops=%s, runt=%6llumsec\n", 3855ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ddir_str[ddir], io_p, bw_p, iops_p, 3865ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ts->runtime[ddir]); 387dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe 388dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe free(io_p); 389dbe1125e9c53b2a0b1fc2fd9c6cfd0b3fbddda8bJens Axboe free(bw_p); 390b3605062146bce0136918763bb8eb584478ae042Jens Axboe free(iops_p); 3913c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 392b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe if (calc_lat(&ts->slat_stat[ddir], &min, &max, &mean, &dev)) 393b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe display_lat("slat", min, max, mean, dev); 394b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe if (calc_lat(&ts->clat_stat[ddir], &min, &max, &mean, &dev)) 395b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe display_lat("clat", min, max, mean, dev); 396b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe if (calc_lat(&ts->lat_stat[ddir], &min, &max, &mean, &dev)) 397b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe display_lat(" lat", min, max, mean, dev); 39802af09886db695e5ea2b7fd2a632733955f3c03fJens Axboe 399833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong if (ts->clat_percentiles) { 400833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong show_clat_percentiles(ts->io_u_plat[ddir], 401833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong ts->clat_stat[ddir].samples, 402833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong ts->percentile_list); 403833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong } 404079ad09b1ef22fa0d47c2cd2673908c5619aa41aJens Axboe if (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) { 40519d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe double p_of_agg = 100.0; 406b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe const char *bw_str = "KB"; 4073c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 4082f2c69242ba72508fb5429d12e1fd72c3cc1e76cJens Axboe if (rs->agg[ddir]) { 40919d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe p_of_agg = mean * 100 / (double) rs->agg[ddir]; 41019d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe if (p_of_agg > 100.0) 41119d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe p_of_agg = 100.0; 41219d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe } 413b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe 414b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe if (mean > 999999.9) { 415b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe min /= 1000.0; 416b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe max /= 1000.0; 417b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe mean /= 1000.0; 418b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe dev /= 1000.0; 419b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe bw_str = "MB"; 420b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe } 421b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe 4227e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe log_info(" bw (%s/s) : min=%5lu, max=%5lu, per=%3.2f%%," 423b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe " avg=%5.02f, stdev=%5.02f\n", bw_str, min, max, 424b7017e324de0484b5b4db881bdb280611523cf7eJens Axboe p_of_agg, mean, dev); 4253c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe } 4263c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 4273c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 4287e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboestatic int show_lat(double *io_u_lat, int nr, const char **ranges, 4297e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe const char *msg) 43004a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe{ 4317e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe int new_line = 1, i, line = 0, shown = 0; 43204a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe 43304a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe for (i = 0; i < nr; i++) { 43404a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe if (io_u_lat[i] <= 0.0) 43504a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe continue; 4367e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe shown = 1; 43704a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe if (new_line) { 4384539ed73159735c20cf6c2808eea84d0cc25a608Jens Axboe if (line) 4394539ed73159735c20cf6c2808eea84d0cc25a608Jens Axboe log_info("\n"); 4407e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe log_info(" lat (%s) : ", msg); 44104a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe new_line = 0; 44204a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe line = 0; 44304a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe } 44404a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe if (line) 44504a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe log_info(", "); 44604a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe log_info("%s%3.2f%%", ranges[i], io_u_lat[i]); 44704a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe line++; 44804a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe if (line == 5) 44904a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe new_line = 1; 45004a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe } 4517e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe 4527e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe if (shown) 4537e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe log_info("\n"); 4547e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe 4557e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe return shown; 45604a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe} 45704a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe 45804a0feae73ca50d05914cc3c425b2a6949523204Jens Axboestatic void show_lat_u(double *io_u_lat_u) 45904a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe{ 46004a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe const char *ranges[] = { "2=", "4=", "10=", "20=", "50=", "100=", 46104a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe "250=", "500=", "750=", "1000=", }; 46204a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe 46304a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe show_lat(io_u_lat_u, FIO_IO_U_LAT_U_NR, ranges, "usec"); 46404a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe} 46504a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe 46604a0feae73ca50d05914cc3c425b2a6949523204Jens Axboestatic void show_lat_m(double *io_u_lat_m) 46704a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe{ 46804a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe const char *ranges[] = { "2=", "4=", "10=", "20=", "50=", "100=", 46904a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe "250=", "500=", "750=", "1000=", "2000=", 47004a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe ">=2000=", }; 47104a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe 47204a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe show_lat(io_u_lat_m, FIO_IO_U_LAT_M_NR, ranges, "msec"); 47304a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe} 47404a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe 475c551f65a0a2a972c19f9c274f3cf24f4b6d98680Jens Axboestatic void show_latencies(struct thread_stat *ts) 47604a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe{ 477c551f65a0a2a972c19f9c274f3cf24f4b6d98680Jens Axboe double io_u_lat_u[FIO_IO_U_LAT_U_NR]; 478c551f65a0a2a972c19f9c274f3cf24f4b6d98680Jens Axboe double io_u_lat_m[FIO_IO_U_LAT_M_NR]; 479c551f65a0a2a972c19f9c274f3cf24f4b6d98680Jens Axboe 4805a18988ebd18598bf93cfc76ce1e954f2eede438Jens Axboe stat_calc_lat_u(ts, io_u_lat_u); 4815a18988ebd18598bf93cfc76ce1e954f2eede438Jens Axboe stat_calc_lat_m(ts, io_u_lat_m); 4825a18988ebd18598bf93cfc76ce1e954f2eede438Jens Axboe 48304a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe show_lat_u(io_u_lat_u); 48404a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe show_lat_m(io_u_lat_m); 48504a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe} 48604a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe 487a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboevoid show_thread_status(struct thread_stat *ts, struct group_run_stats *rs) 4883c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 4893c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe double usr_cpu, sys_cpu; 490690089990d051d86b4ef2b6fd5c1972c0dd4897bJens Axboe unsigned long runtime; 49171619dc28506f7b7b40905b942e992b02f0d5b96Jens Axboe double io_u_dist[FIO_IO_U_MAP_NR]; 4923c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 493b4c5e1acb5a7964f858e2b41c1ae07b1afc0f4eaJens Axboe if (!(ts->io_bytes[0] + ts->io_bytes[1]) && 494b4c5e1acb5a7964f858e2b41c1ae07b1afc0f4eaJens Axboe !(ts->total_io_u[0] + ts->total_io_u[1])) 4953c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe return; 4963c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 4975ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (!ts->error) { 4985ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_info("%s: (groupid=%d, jobs=%d): err=%2d: pid=%d\n", 4995ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ts->name, ts->groupid, ts->members, 5005921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe ts->error, (int) ts->pid); 5015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } else { 5025ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_info("%s: (groupid=%d, jobs=%d): err=%2d (%s): pid=%d\n", 5035ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ts->name, ts->groupid, ts->members, 5045921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe ts->error, ts->verror, (int) ts->pid); 5055ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 5063c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 507259e47dea8db94a372a73b07b5245d43d4f9ab92Jens Axboe if (strlen(ts->description)) 5086d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info(" Description : [%s]\n", ts->description); 5097bdce1bde82e37c8876270853840c1d09d760b67Jens Axboe 510756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe if (ts->io_bytes[DDIR_READ]) 511756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe show_ddir_status(rs, ts, DDIR_READ); 512756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe if (ts->io_bytes[DDIR_WRITE]) 513756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe show_ddir_status(rs, ts, DDIR_WRITE); 5143c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 515c551f65a0a2a972c19f9c274f3cf24f4b6d98680Jens Axboe show_latencies(ts); 5167e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe 517756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe runtime = ts->total_run_time; 518690089990d051d86b4ef2b6fd5c1972c0dd4897bJens Axboe if (runtime) { 5191e97cce9f5a87a67293a05ec4533ed6968698b2eJens Axboe double runt = (double) runtime; 5203c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 521756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe usr_cpu = (double) ts->usr_time * 100 / runt; 522756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe sys_cpu = (double) ts->sys_time * 100 / runt; 5233c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe } else { 5243c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe usr_cpu = 0; 5253c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe sys_cpu = 0; 5263c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe } 5273c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 5285ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_info(" cpu : usr=%3.2f%%, sys=%3.2f%%, ctx=%lu, majf=%lu," 5295ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " minf=%lu\n", usr_cpu, sys_cpu, ts->ctx, ts->majf, ts->minf); 53071619dc28506f7b7b40905b942e992b02f0d5b96Jens Axboe 531838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe stat_calc_dist(ts->io_u_map, ts_total_io_u(ts), io_u_dist); 5325ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_info(" IO depths : 1=%3.1f%%, 2=%3.1f%%, 4=%3.1f%%, 8=%3.1f%%," 5335ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " 16=%3.1f%%, 32=%3.1f%%, >=64=%3.1f%%\n", io_u_dist[0], 5345ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u_dist[1], io_u_dist[2], 5355ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u_dist[3], io_u_dist[4], 5365ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u_dist[5], io_u_dist[6]); 537838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe 538838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe stat_calc_dist(ts->io_u_submit, ts->total_submit, io_u_dist); 539838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe log_info(" submit : 0=%3.1f%%, 4=%3.1f%%, 8=%3.1f%%, 16=%3.1f%%," 540838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe " 32=%3.1f%%, 64=%3.1f%%, >=64=%3.1f%%\n", io_u_dist[0], 541838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_dist[1], io_u_dist[2], 542838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_dist[3], io_u_dist[4], 543838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_dist[5], io_u_dist[6]); 544838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe stat_calc_dist(ts->io_u_complete, ts->total_complete, io_u_dist); 545838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe log_info(" complete : 0=%3.1f%%, 4=%3.1f%%, 8=%3.1f%%, 16=%3.1f%%," 546838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe " 32=%3.1f%%, 64=%3.1f%%, >=64=%3.1f%%\n", io_u_dist[0], 547838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_dist[1], io_u_dist[2], 548838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_dist[3], io_u_dist[4], 549838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_dist[5], io_u_dist[6]); 5507e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe log_info(" issued : total=r=%lu/w=%lu/d=%lu," 5517e1773ba2033a2f70bcbb36c07dc8743c6ce05d1Jens Axboe " short=r=%lu/w=%lu/d=%lu\n", 5525ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ts->total_io_u[0], ts->total_io_u[1], 5530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ts->total_io_u[2], 5540d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ts->short_io_u[0], ts->short_io_u[1], 5550d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ts->short_io_u[2]); 556f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran if (ts->continue_on_error) { 5571ec99eea970609e63f49982f0d052a23ac18848dJens Axboe log_info(" errors : total=%lu, first_error=%d/<%s>\n", 5581ec99eea970609e63f49982f0d052a23ac18848dJens Axboe ts->total_err_count, 5591ec99eea970609e63f49982f0d052a23ac18848dJens Axboe ts->first_error, 5601ec99eea970609e63f49982f0d052a23ac18848dJens Axboe strerror(ts->first_error)); 561f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran } 5623c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 5633c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 564756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboestatic void show_ddir_status_terse(struct thread_stat *ts, 565c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe struct group_run_stats *rs, int ddir) 566c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe{ 567c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe unsigned long min, max; 568312b4af22018a73a445ae6ecf640d71f12120ab9Jens Axboe unsigned long long bw, iops; 5691db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe unsigned int *ovals = NULL; 570c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe double mean, dev; 5711db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe unsigned int len, minv, maxv; 5721db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe int i; 573c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 574ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe assert(ddir_rw(ddir)); 575ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe 576312b4af22018a73a445ae6ecf640d71f12120ab9Jens Axboe iops = bw = 0; 577312b4af22018a73a445ae6ecf640d71f12120ab9Jens Axboe if (ts->runtime[ddir]) { 578312b4af22018a73a445ae6ecf640d71f12120ab9Jens Axboe uint64_t runt = ts->runtime[ddir]; 579312b4af22018a73a445ae6ecf640d71f12120ab9Jens Axboe 580312b4af22018a73a445ae6ecf640d71f12120ab9Jens Axboe bw = ts->io_bytes[ddir] / runt; 581312b4af22018a73a445ae6ecf640d71f12120ab9Jens Axboe iops = (1000 * (uint64_t) ts->total_io_u[ddir]) / runt; 582312b4af22018a73a445ae6ecf640d71f12120ab9Jens Axboe } 583c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 584312b4af22018a73a445ae6ecf640d71f12120ab9Jens Axboe log_info(";%llu;%llu;%llu;%llu", ts->io_bytes[ddir] >> 10, bw, iops, 5855ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ts->runtime[ddir]); 586c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 587079ad09b1ef22fa0d47c2cd2673908c5619aa41aJens Axboe if (calc_lat(&ts->slat_stat[ddir], &min, &max, &mean, &dev)) 5886d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info(";%lu;%lu;%f;%f", min, max, mean, dev); 589c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe else 5906d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info(";%lu;%lu;%f;%f", 0UL, 0UL, 0.0, 0.0); 591c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 592079ad09b1ef22fa0d47c2cd2673908c5619aa41aJens Axboe if (calc_lat(&ts->clat_stat[ddir], &min, &max, &mean, &dev)) 5936d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info(";%lu;%lu;%f;%f", min, max, mean, dev); 594c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe else 5956d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info(";%lu;%lu;%f;%f", 0UL, 0UL, 0.0, 0.0); 596c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 5971db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe if (ts->clat_percentiles) { 5981db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe len = calc_clat_percentiles(ts->io_u_plat[ddir], 5991db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe ts->clat_stat[ddir].samples, 6001db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe ts->percentile_list, &ovals, &maxv, 6011db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe &minv); 6021db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe } else 6031db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe len = 0; 6041db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe 6051db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe for (i = 0; i < FIO_IO_U_LIST_MAX_LEN; i++) { 6061db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe if (i >= len) { 6071db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe log_info(";0%%=0"); 6081db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe continue; 6091db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe } 6101db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe log_info(";%2.2f%%=%u", ts->percentile_list[i].u.f, ovals[i]); 6111db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe } 6122341a37a2df4bca221d5ea25aa7d8a8307407d1aKeplar kramer 6132341a37a2df4bca221d5ea25aa7d8a8307407d1aKeplar kramer if (calc_lat(&ts->lat_stat[ddir], &min, &max, &mean, &dev)) 6142341a37a2df4bca221d5ea25aa7d8a8307407d1aKeplar kramer log_info(";%lu;%lu;%f;%f", min, max, mean, dev); 6152341a37a2df4bca221d5ea25aa7d8a8307407d1aKeplar kramer else 6162341a37a2df4bca221d5ea25aa7d8a8307407d1aKeplar kramer log_info(";%lu;%lu;%f;%f", 0UL, 0UL, 0.0, 0.0); 6172341a37a2df4bca221d5ea25aa7d8a8307407d1aKeplar kramer 6181db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe if (ovals) 6191db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe free(ovals); 6201db92cb6b3db5965a52359cb2dab7ebd3f476f53Jens Axboe 621079ad09b1ef22fa0d47c2cd2673908c5619aa41aJens Axboe if (calc_lat(&ts->bw_stat[ddir], &min, &max, &mean, &dev)) { 62219d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe double p_of_agg = 100.0; 62319d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe 62419d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe if (rs->agg[ddir]) { 62519d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe p_of_agg = mean * 100 / (double) rs->agg[ddir]; 62619d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe if (p_of_agg > 100.0) 62719d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe p_of_agg = 100.0; 62819d3e967ff31c055c1497dd67f4d7305ec1607f4Jens Axboe } 629c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 6306d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info(";%lu;%lu;%f%%;%f;%f", min, max, p_of_agg, mean, dev); 631c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe } else 6326d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info(";%lu;%lu;%f%%;%f;%f", 0UL, 0UL, 0.0, 0.0, 0.0); 633c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe} 634c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 6354d658652bac63fd72af8302e27deba5beb381906Jens Axboestatic void show_thread_status_terse_v2(struct thread_stat *ts, 6364d658652bac63fd72af8302e27deba5beb381906Jens Axboe struct group_run_stats *rs) 6374d658652bac63fd72af8302e27deba5beb381906Jens Axboe{ 6384d658652bac63fd72af8302e27deba5beb381906Jens Axboe double io_u_dist[FIO_IO_U_MAP_NR]; 6394d658652bac63fd72af8302e27deba5beb381906Jens Axboe double io_u_lat_u[FIO_IO_U_LAT_U_NR]; 6404d658652bac63fd72af8302e27deba5beb381906Jens Axboe double io_u_lat_m[FIO_IO_U_LAT_M_NR]; 6414d658652bac63fd72af8302e27deba5beb381906Jens Axboe double usr_cpu, sys_cpu; 6424d658652bac63fd72af8302e27deba5beb381906Jens Axboe int i; 6434d658652bac63fd72af8302e27deba5beb381906Jens Axboe 6444d658652bac63fd72af8302e27deba5beb381906Jens Axboe /* General Info */ 6454d658652bac63fd72af8302e27deba5beb381906Jens Axboe log_info("2;%s;%d;%d", ts->name, ts->groupid, ts->error); 6464d658652bac63fd72af8302e27deba5beb381906Jens Axboe /* Log Read Status */ 6474d658652bac63fd72af8302e27deba5beb381906Jens Axboe show_ddir_status_terse(ts, rs, 0); 6484d658652bac63fd72af8302e27deba5beb381906Jens Axboe /* Log Write Status */ 6494d658652bac63fd72af8302e27deba5beb381906Jens Axboe show_ddir_status_terse(ts, rs, 1); 6504d658652bac63fd72af8302e27deba5beb381906Jens Axboe 6514d658652bac63fd72af8302e27deba5beb381906Jens Axboe /* CPU Usage */ 6524d658652bac63fd72af8302e27deba5beb381906Jens Axboe if (ts->total_run_time) { 6534d658652bac63fd72af8302e27deba5beb381906Jens Axboe double runt = (double) ts->total_run_time; 6544d658652bac63fd72af8302e27deba5beb381906Jens Axboe 6554d658652bac63fd72af8302e27deba5beb381906Jens Axboe usr_cpu = (double) ts->usr_time * 100 / runt; 6564d658652bac63fd72af8302e27deba5beb381906Jens Axboe sys_cpu = (double) ts->sys_time * 100 / runt; 6574d658652bac63fd72af8302e27deba5beb381906Jens Axboe } else { 6584d658652bac63fd72af8302e27deba5beb381906Jens Axboe usr_cpu = 0; 6594d658652bac63fd72af8302e27deba5beb381906Jens Axboe sys_cpu = 0; 6604d658652bac63fd72af8302e27deba5beb381906Jens Axboe } 6614d658652bac63fd72af8302e27deba5beb381906Jens Axboe 6624d658652bac63fd72af8302e27deba5beb381906Jens Axboe log_info(";%f%%;%f%%;%lu;%lu;%lu", usr_cpu, sys_cpu, ts->ctx, ts->majf, 6634d658652bac63fd72af8302e27deba5beb381906Jens Axboe ts->minf); 6644d658652bac63fd72af8302e27deba5beb381906Jens Axboe 6654d658652bac63fd72af8302e27deba5beb381906Jens Axboe /* Calc % distribution of IO depths, usecond, msecond latency */ 6664d658652bac63fd72af8302e27deba5beb381906Jens Axboe stat_calc_dist(ts->io_u_map, ts_total_io_u(ts), io_u_dist); 6674d658652bac63fd72af8302e27deba5beb381906Jens Axboe stat_calc_lat_u(ts, io_u_lat_u); 6684d658652bac63fd72af8302e27deba5beb381906Jens Axboe stat_calc_lat_m(ts, io_u_lat_m); 6694d658652bac63fd72af8302e27deba5beb381906Jens Axboe 6704d658652bac63fd72af8302e27deba5beb381906Jens Axboe /* Only show fixed 7 I/O depth levels*/ 6714d658652bac63fd72af8302e27deba5beb381906Jens Axboe log_info(";%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%", 6724d658652bac63fd72af8302e27deba5beb381906Jens Axboe io_u_dist[0], io_u_dist[1], io_u_dist[2], io_u_dist[3], 6734d658652bac63fd72af8302e27deba5beb381906Jens Axboe io_u_dist[4], io_u_dist[5], io_u_dist[6]); 6744d658652bac63fd72af8302e27deba5beb381906Jens Axboe 6754d658652bac63fd72af8302e27deba5beb381906Jens Axboe /* Microsecond latency */ 6764d658652bac63fd72af8302e27deba5beb381906Jens Axboe for (i = 0; i < FIO_IO_U_LAT_U_NR; i++) 6774d658652bac63fd72af8302e27deba5beb381906Jens Axboe log_info(";%3.2f%%", io_u_lat_u[i]); 6784d658652bac63fd72af8302e27deba5beb381906Jens Axboe /* Millisecond latency */ 6794d658652bac63fd72af8302e27deba5beb381906Jens Axboe for (i = 0; i < FIO_IO_U_LAT_M_NR; i++) 6804d658652bac63fd72af8302e27deba5beb381906Jens Axboe log_info(";%3.2f%%", io_u_lat_m[i]); 6814d658652bac63fd72af8302e27deba5beb381906Jens Axboe /* Additional output if continue_on_error set - default off*/ 6824d658652bac63fd72af8302e27deba5beb381906Jens Axboe if (ts->continue_on_error) 6834d658652bac63fd72af8302e27deba5beb381906Jens Axboe log_info(";%lu;%d", ts->total_err_count, ts->first_error); 6844d658652bac63fd72af8302e27deba5beb381906Jens Axboe log_info("\n"); 6854d658652bac63fd72af8302e27deba5beb381906Jens Axboe 6864d658652bac63fd72af8302e27deba5beb381906Jens Axboe /* Additional output if description is set */ 6874d658652bac63fd72af8302e27deba5beb381906Jens Axboe if (ts->description) 6884d658652bac63fd72af8302e27deba5beb381906Jens Axboe log_info(";%s", ts->description); 6894d658652bac63fd72af8302e27deba5beb381906Jens Axboe 6904d658652bac63fd72af8302e27deba5beb381906Jens Axboe log_info("\n"); 6914d658652bac63fd72af8302e27deba5beb381906Jens Axboe} 6924d658652bac63fd72af8302e27deba5beb381906Jens Axboe 693312b4af22018a73a445ae6ecf640d71f12120ab9Jens Axboe#define FIO_TERSE_VERSION "3" 694c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 6954d658652bac63fd72af8302e27deba5beb381906Jens Axboestatic void show_thread_status_terse_v3(struct thread_stat *ts, 6964d658652bac63fd72af8302e27deba5beb381906Jens Axboe struct group_run_stats *rs) 697c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe{ 6982270890cef8d98ab97f87d348d16dce6454e631fJens Axboe double io_u_dist[FIO_IO_U_MAP_NR]; 69904a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe double io_u_lat_u[FIO_IO_U_LAT_U_NR]; 70004a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe double io_u_lat_m[FIO_IO_U_LAT_M_NR]; 701c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe double usr_cpu, sys_cpu; 70204a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe int i; 703c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 704562c2d2f25ae829c812a58c10bc1a03ab6f6f52bDavid Nellans /* General Info */ 7055e726d0a29b815f526f835e44afe3225522c6c20Jens Axboe log_info("%s;%s;%s;%d;%d", FIO_TERSE_VERSION, fio_version_string, 7065e726d0a29b815f526f835e44afe3225522c6c20Jens Axboe ts->name, ts->groupid, ts->error); 707562c2d2f25ae829c812a58c10bc1a03ab6f6f52bDavid Nellans /* Log Read Status */ 708756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe show_ddir_status_terse(ts, rs, 0); 709562c2d2f25ae829c812a58c10bc1a03ab6f6f52bDavid Nellans /* Log Write Status */ 710756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe show_ddir_status_terse(ts, rs, 1); 711c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 712562c2d2f25ae829c812a58c10bc1a03ab6f6f52bDavid Nellans /* CPU Usage */ 713756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe if (ts->total_run_time) { 714756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe double runt = (double) ts->total_run_time; 715c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 716756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe usr_cpu = (double) ts->usr_time * 100 / runt; 717756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe sys_cpu = (double) ts->sys_time * 100 / runt; 718c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe } else { 719c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe usr_cpu = 0; 720c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe sys_cpu = 0; 721c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe } 722c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe 7235ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_info(";%f%%;%f%%;%lu;%lu;%lu", usr_cpu, sys_cpu, ts->ctx, ts->majf, 7245ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe ts->minf); 7252270890cef8d98ab97f87d348d16dce6454e631fJens Axboe 726562c2d2f25ae829c812a58c10bc1a03ab6f6f52bDavid Nellans /* Calc % distribution of IO depths, usecond, msecond latency */ 727838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe stat_calc_dist(ts->io_u_map, ts_total_io_u(ts), io_u_dist); 72804a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe stat_calc_lat_u(ts, io_u_lat_u); 72904a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe stat_calc_lat_m(ts, io_u_lat_m); 7302270890cef8d98ab97f87d348d16dce6454e631fJens Axboe 731562c2d2f25ae829c812a58c10bc1a03ab6f6f52bDavid Nellans /* Only show fixed 7 I/O depth levels*/ 7325ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_info(";%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%;%3.1f%%", 7335ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u_dist[0], io_u_dist[1], io_u_dist[2], io_u_dist[3], 7345ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u_dist[4], io_u_dist[5], io_u_dist[6]); 7352270890cef8d98ab97f87d348d16dce6454e631fJens Axboe 736562c2d2f25ae829c812a58c10bc1a03ab6f6f52bDavid Nellans /* Microsecond latency */ 73704a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe for (i = 0; i < FIO_IO_U_LAT_U_NR; i++) 73804a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe log_info(";%3.2f%%", io_u_lat_u[i]); 739562c2d2f25ae829c812a58c10bc1a03ab6f6f52bDavid Nellans /* Millisecond latency */ 74004a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe for (i = 0; i < FIO_IO_U_LAT_M_NR; i++) 74104a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe log_info(";%3.2f%%", io_u_lat_m[i]); 742f2f788dd732d97c2c3a5f5dd93223a7bfafcc410Jens Axboe 743f2f788dd732d97c2c3a5f5dd93223a7bfafcc410Jens Axboe /* disk util stats, if any */ 744f2f788dd732d97c2c3a5f5dd93223a7bfafcc410Jens Axboe show_disk_util(1); 745f2f788dd732d97c2c3a5f5dd93223a7bfafcc410Jens Axboe 746562c2d2f25ae829c812a58c10bc1a03ab6f6f52bDavid Nellans /* Additional output if continue_on_error set - default off*/ 747f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran if (ts->continue_on_error) 748f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran log_info(";%lu;%d", ts->total_err_count, ts->first_error); 74904a0feae73ca50d05914cc3c425b2a6949523204Jens Axboe log_info("\n"); 7502270890cef8d98ab97f87d348d16dce6454e631fJens Axboe 751562c2d2f25ae829c812a58c10bc1a03ab6f6f52bDavid Nellans /* Additional output if description is set */ 7524b0f22588568035952ea4c4673fdb1d7f5444eedJens Axboe if (strlen(ts->description)) 7536d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info(";%s", ts->description); 754756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe} 755756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 7564d658652bac63fd72af8302e27deba5beb381906Jens Axboestatic void show_thread_status_terse(struct thread_stat *ts, 7574d658652bac63fd72af8302e27deba5beb381906Jens Axboe struct group_run_stats *rs) 7584d658652bac63fd72af8302e27deba5beb381906Jens Axboe{ 7594d658652bac63fd72af8302e27deba5beb381906Jens Axboe if (terse_version == 2) 7604d658652bac63fd72af8302e27deba5beb381906Jens Axboe show_thread_status_terse_v2(ts, rs); 7614d658652bac63fd72af8302e27deba5beb381906Jens Axboe else if (terse_version == 3) 7624d658652bac63fd72af8302e27deba5beb381906Jens Axboe show_thread_status_terse_v3(ts, rs); 7634d658652bac63fd72af8302e27deba5beb381906Jens Axboe else 7644d658652bac63fd72af8302e27deba5beb381906Jens Axboe log_err("fio: bad terse version!? %d\n", terse_version); 7654d658652bac63fd72af8302e27deba5beb381906Jens Axboe} 7664d658652bac63fd72af8302e27deba5beb381906Jens Axboe 767197574e43bea5ac00f7b64d4731173c177041de0Jens Axboestatic void sum_stat(struct io_stat *dst, struct io_stat *src, int nr) 768756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe{ 769756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe double mean, S; 770756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 771e09231c214906b4ff8cbc3dc202c39755fbf6afdZheng Liu if (src->samples == 0) 772e09231c214906b4ff8cbc3dc202c39755fbf6afdZheng Liu return; 773e09231c214906b4ff8cbc3dc202c39755fbf6afdZheng Liu 774756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe dst->min_val = min(dst->min_val, src->min_val); 775756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe dst->max_val = max(dst->max_val, src->max_val); 776756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 777756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe /* 778cdcac5cf0e9262105e676874d11c4639a80574ebYu-ju Hong * Compute new mean and S after the merge 779cdcac5cf0e9262105e676874d11c4639a80574ebYu-ju Hong * <http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance 780cdcac5cf0e9262105e676874d11c4639a80574ebYu-ju Hong * #Parallel_algorithm> 781756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe */ 782756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe if (nr == 1) { 783802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe mean = src->mean.u.f; 784802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe S = src->S.u.f; 785756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe } else { 786802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe double delta = src->mean.u.f - dst->mean.u.f; 787cdcac5cf0e9262105e676874d11c4639a80574ebYu-ju Hong 788802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe mean = ((src->mean.u.f * src->samples) + 789802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe (dst->mean.u.f * dst->samples)) / 790cdcac5cf0e9262105e676874d11c4639a80574ebYu-ju Hong (dst->samples + src->samples); 791cdcac5cf0e9262105e676874d11c4639a80574ebYu-ju Hong 792802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe S = src->S.u.f + dst->S.u.f + pow(delta, 2.0) * 793cdcac5cf0e9262105e676874d11c4639a80574ebYu-ju Hong (dst->samples * src->samples) / 794cdcac5cf0e9262105e676874d11c4639a80574ebYu-ju Hong (dst->samples + src->samples); 795756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe } 796756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 797cdcac5cf0e9262105e676874d11c4639a80574ebYu-ju Hong dst->samples += src->samples; 798802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe dst->mean.u.f = mean; 799802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe dst->S.u.f = S; 800756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe} 801756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 80237f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboevoid sum_group_stats(struct group_run_stats *dst, struct group_run_stats *src) 80337f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe{ 80437f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe int i; 80537f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe 80637f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe for (i = 0; i < 2; i++) { 80737f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe if (dst->max_run[i] < src->max_run[i]) 80837f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe dst->max_run[i] = src->max_run[i]; 80937f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe if (dst->min_run[i] && dst->min_run[i] > src->min_run[i]) 81037f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe dst->min_run[i] = src->min_run[i]; 81137f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe if (dst->max_bw[i] < src->max_bw[i]) 81237f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe dst->max_bw[i] = src->max_bw[i]; 81337f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe if (dst->min_bw[i] && dst->min_bw[i] > src->min_bw[i]) 81437f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe dst->min_bw[i] = src->min_bw[i]; 81537f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe 81637f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe dst->io_kb[i] += src->io_kb[i]; 81737f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe dst->agg[i] += src->agg[i]; 81837f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe } 81937f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe 82037f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe} 82137f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe 8225b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboevoid sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr) 8235b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe{ 8245b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe int l, k; 8255b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe 8265b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe for (l = 0; l <= DDIR_WRITE; l++) { 8275b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe sum_stat(&dst->clat_stat[l], &src->clat_stat[l], nr); 8285b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe sum_stat(&dst->slat_stat[l], &src->slat_stat[l], nr); 8295b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe sum_stat(&dst->lat_stat[l], &src->lat_stat[l], nr); 8305b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe sum_stat(&dst->bw_stat[l], &src->bw_stat[l], nr); 8315b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe 8325b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->io_bytes[l] += src->io_bytes[l]; 8335b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe 8345b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe if (dst->runtime[l] < src->runtime[l]) 8355b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->runtime[l] = src->runtime[l]; 8365b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe } 8375b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe 8385b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->usr_time += src->usr_time; 8395b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->sys_time += src->sys_time; 8405b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->ctx += src->ctx; 8415b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->majf += src->majf; 8425b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->minf += src->minf; 8435b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe 8445b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe for (k = 0; k < FIO_IO_U_MAP_NR; k++) 8455b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->io_u_map[k] += src->io_u_map[k]; 8465b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe for (k = 0; k < FIO_IO_U_MAP_NR; k++) 8475b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->io_u_submit[k] += src->io_u_submit[k]; 8485b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe for (k = 0; k < FIO_IO_U_MAP_NR; k++) 8495b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->io_u_complete[k] += src->io_u_complete[k]; 8505b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe for (k = 0; k < FIO_IO_U_LAT_U_NR; k++) 8515b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->io_u_lat_u[k] += src->io_u_lat_u[k]; 8525b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe for (k = 0; k < FIO_IO_U_LAT_M_NR; k++) 8535b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->io_u_lat_m[k] += src->io_u_lat_m[k]; 8545b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe 8555b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe for (k = 0; k <= 2; k++) { 8565b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->total_io_u[k] += src->total_io_u[k]; 8575b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->short_io_u[k] += src->short_io_u[k]; 8585b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe } 8595b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe 8605b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe for (k = 0; k <= DDIR_WRITE; k++) { 8615b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe int m; 8625b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe for (m = 0; m < FIO_IO_U_PLAT_NR; m++) 8635b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->io_u_plat[k][m] += src->io_u_plat[k][m]; 8645b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe } 8655b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe 8665b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->total_run_time += src->total_run_time; 8675b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->total_submit += src->total_submit; 8685b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe dst->total_complete += src->total_complete; 8695b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe} 8705b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe 87137f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboevoid init_group_run_stat(struct group_run_stats *gs) 87237f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe{ 87337f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe memset(gs, 0, sizeof(*gs)); 87437f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe gs->min_bw[0] = gs->min_run[0] = ~0UL; 87537f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe gs->min_bw[1] = gs->min_run[1] = ~0UL; 87637f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe} 87737f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe 87837f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboevoid init_thread_stat(struct thread_stat *ts) 87937f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe{ 88037f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe int j; 88137f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe 88237f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe memset(ts, 0, sizeof(*ts)); 88337f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe 88437f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe for (j = 0; j <= DDIR_WRITE; j++) { 88537f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe ts->lat_stat[j].min_val = -1UL; 88637f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe ts->clat_stat[j].min_val = -1UL; 88737f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe ts->slat_stat[j].min_val = -1UL; 88837f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe ts->bw_stat[j].min_val = -1UL; 88937f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe } 89037f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe ts->groupid = -1; 89137f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe} 89237f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe 8933c39a379542fd819dbc5cf6daf59380911c39141Jens Axboevoid show_run_stats(void) 8943c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 8953c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe struct group_run_stats *runstats, *rs; 8963c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe struct thread_data *td; 897756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe struct thread_stat *threadstats, *ts; 8985b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe int i, j, nr_ts, last_ts, idx; 89990fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe int kb_base_warned = 0; 9003c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 9013c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe runstats = malloc(sizeof(struct group_run_stats) * (groupid + 1)); 9023c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 90337f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe for (i = 0; i < groupid + 1; i++) 90437f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe init_group_run_stat(&runstats[i]); 9053c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 906756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe /* 907756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe * find out how many threads stats we need. if group reporting isn't 908756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe * enabled, it's one-per-td. 909756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe */ 910756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe nr_ts = 0; 911756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe last_ts = -1; 912756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe for_each_td(td, i) { 9132dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (!td->o.group_reporting) { 914756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe nr_ts++; 915756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe continue; 916756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe } 917756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe if (last_ts == td->groupid) 918756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe continue; 919756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 920756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe last_ts = td->groupid; 921756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe nr_ts++; 922756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe } 923756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 924756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe threadstats = malloc(nr_ts * sizeof(struct thread_stat)); 925756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 92637f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe for (i = 0; i < nr_ts; i++) 92737f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboe init_thread_stat(&threadstats[i]); 928756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 929756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe j = 0; 930756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe last_ts = -1; 931197574e43bea5ac00f7b64d4731173c177041de0Jens Axboe idx = 0; 93234572e28f8cf45ba4e2601797f2aa4a114601fb2Jens Axboe for_each_td(td, i) { 9332dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (idx && (!td->o.group_reporting || 9342dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe (td->o.group_reporting && last_ts != td->groupid))) { 9357abd0e3a872b000aefb740028f777aae1fa6f77dJens Axboe idx = 0; 9367abd0e3a872b000aefb740028f777aae1fa6f77dJens Axboe j++; 9377abd0e3a872b000aefb740028f777aae1fa6f77dJens Axboe } 9387abd0e3a872b000aefb740028f777aae1fa6f77dJens Axboe 9397abd0e3a872b000aefb740028f777aae1fa6f77dJens Axboe last_ts = td->groupid; 9407abd0e3a872b000aefb740028f777aae1fa6f77dJens Axboe 941756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe ts = &threadstats[j]; 942756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 943833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong ts->clat_percentiles = td->o.clat_percentiles; 944833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong if (td->o.overwrite_plist) 945802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe memcpy(ts->percentile_list, td->o.percentile_list, sizeof(td->o.percentile_list)); 946833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong else 947802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe memcpy(ts->percentile_list, def_percentile_list, sizeof(def_percentile_list)); 948833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 949197574e43bea5ac00f7b64d4731173c177041de0Jens Axboe idx++; 9506586ee8992b30e81334d83d10480bdc4f6c8cc1aJens Axboe ts->members++; 951756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 9527abd0e3a872b000aefb740028f777aae1fa6f77dJens Axboe if (ts->groupid == -1) { 9532dc84ba74186eb9ef4dde0f08dc20571c62e001eJens Axboe /* 9542dc84ba74186eb9ef4dde0f08dc20571c62e001eJens Axboe * These are per-group shared already 9552dc84ba74186eb9ef4dde0f08dc20571c62e001eJens Axboe */ 956f6bb5b88614073878cbbd2666a1553481720faeeJens Axboe strncpy(ts->name, td->o.name, FIO_JOBNAME_SIZE); 957a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe if (td->o.description) 958a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe strncpy(ts->description, td->o.description, 959a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe FIO_JOBNAME_SIZE); 960a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe else 961a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe memset(ts->description, 0, FIO_JOBNAME_SIZE); 962a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 963756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe ts->groupid = td->groupid; 9642dc84ba74186eb9ef4dde0f08dc20571c62e001eJens Axboe 9652dc84ba74186eb9ef4dde0f08dc20571c62e001eJens Axboe /* 9662dc84ba74186eb9ef4dde0f08dc20571c62e001eJens Axboe * first pid in group, not very useful... 9672dc84ba74186eb9ef4dde0f08dc20571c62e001eJens Axboe */ 968756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe ts->pid = td->pid; 96990fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe 97090fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe ts->kb_base = td->o.kb_base; 97190fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe } else if (ts->kb_base != td->o.kb_base && !kb_base_warned) { 97290fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe log_info("fio: kb_base differs for jobs in group, using" 97390fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe " %u as the base\n", ts->kb_base); 97490fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe kb_base_warned = 1; 9752dc84ba74186eb9ef4dde0f08dc20571c62e001eJens Axboe } 9762dc84ba74186eb9ef4dde0f08dc20571c62e001eJens Axboe 977f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran ts->continue_on_error = td->o.continue_on_error; 978f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran ts->total_err_count += td->total_err_count; 979f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran ts->first_error = td->first_error; 980f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran if (!ts->error) { 981f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran if (!td->error && td->o.continue_on_error && 982f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran td->first_error) { 983f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran ts->error = td->first_error; 984f6bb5b88614073878cbbd2666a1553481720faeeJens Axboe strcpy(ts->verror, td->verror); 985f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran } else if (td->error) { 986f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran ts->error = td->error; 987f6bb5b88614073878cbbd2666a1553481720faeeJens Axboe strcpy(ts->verror, td->verror); 988f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandran } 989756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe } 990756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 9915b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboe sum_thread_stats(ts, &td->ts, idx); 992756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe } 993756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe 994756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe for (i = 0; i < nr_ts; i++) { 99594370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe unsigned long long bw; 9963c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 997756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe ts = &threadstats[i]; 998756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe rs = &runstats[ts->groupid]; 99990fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe rs->kb_base = ts->kb_base; 10003c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 1001de64df05bb69d38b7ecf548d9e15573b9010704aJens Axboe for (j = 0; j <= DDIR_WRITE; j++) { 100294370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe if (!ts->runtime[j]) 100394370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe continue; 100494370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe if (ts->runtime[j] < rs->min_run[j] || !rs->min_run[j]) 100594370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe rs->min_run[j] = ts->runtime[j]; 100694370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe if (ts->runtime[j] > rs->max_run[j]) 100794370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe rs->max_run[j] = ts->runtime[j]; 100894370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe 100994370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe bw = 0; 10108879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe if (ts->runtime[j]) { 10118879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe unsigned long runt; 10128879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe 101390fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe runt = ts->runtime[j]; 10148879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe bw = ts->io_bytes[j] / runt; 10158879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe } 101694370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe if (bw < rs->min_bw[j]) 101794370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe rs->min_bw[j] = bw; 101894370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe if (bw > rs->max_bw[j]) 101994370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe rs->max_bw[j] = bw; 102094370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe 102190fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe rs->io_kb[j] += ts->io_bytes[j] / rs->kb_base; 102294370ac42ddee6572c434073d3c1840a513bc8f4Jens Axboe } 10233c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe } 10243c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 10253c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe for (i = 0; i < groupid + 1; i++) { 10268879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe unsigned long max_run[2]; 10278879fd15550a5edac3f4fdab6f98badb18dea18cJens Axboe 10283c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe rs = &runstats[i]; 102990fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe max_run[0] = rs->max_run[0]; 103090fef2d162fba55ad684c2c80b3b9739b8d16e72Jens Axboe max_run[1] = rs->max_run[1]; 10313c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 10323c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe if (rs->max_run[0]) 10334cf1abc34ff1cc8aaa2e02e3aaf919681b717c91Jens Axboe rs->agg[0] = (rs->io_kb[0] * 1000) / max_run[0]; 10343c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe if (rs->max_run[1]) 10354cf1abc34ff1cc8aaa2e02e3aaf919681b717c91Jens Axboe rs->agg[1] = (rs->io_kb[1] * 1000) / max_run[1]; 10363c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe } 10373c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 10383c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe /* 10393c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe * don't overwrite last signal output 10403c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe */ 1041c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe if (!terse_output) 10424ceb30d4b44957e252a75f7ee4170f36109934c3Jens Axboe log_info("\n"); 10433c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 1044756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe for (i = 0; i < nr_ts; i++) { 1045756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe ts = &threadstats[i]; 1046756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe rs = &runstats[ts->groupid]; 10473c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 1048a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe if (is_backend) 1049a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe fio_server_send_ts(ts, rs); 1050a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe else if (terse_output) 1051756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe show_thread_status_terse(ts, rs); 1052c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe else 1053756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe show_thread_status(ts, rs); 10543c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe } 10553c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 105672c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe for (i = 0; i < groupid + 1; i++) { 105772c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe rs = &runstats[i]; 10583c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 105972c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe rs->groupid = i; 1060d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe if (is_backend) 106172c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe fio_server_send_gs(rs); 106272c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe else if (!terse_output) 106372c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe show_group_stats(rs); 1064c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe } 1065eecf272f1b2d55c1e49aadd7f65b9a433ba04c15Jens Axboe 106672c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe if (is_backend) 106772c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe fio_server_send_du(); 106872c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe else if (!terse_output) 106972c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe show_disk_util(0); 107072c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe 107172c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe free_disk_util(); 107272c27ff8f2eaf945ae34776dab4da3fee753707dJens Axboe 1073eecf272f1b2d55c1e49aadd7f65b9a433ba04c15Jens Axboe free(runstats); 1074756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe free(threadstats); 10753c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 10763c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 1077687040842bf56502d33b6c0cb5d2af6da27d080cJens Axboestatic inline void add_stat_sample(struct io_stat *is, unsigned long data) 10783c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 1079687040842bf56502d33b6c0cb5d2af6da27d080cJens Axboe double val = data; 10806660cc67cb72b70d1ea0ab8c465976d715fcb976Jens Axboe double delta; 1081687040842bf56502d33b6c0cb5d2af6da27d080cJens Axboe 1082687040842bf56502d33b6c0cb5d2af6da27d080cJens Axboe if (data > is->max_val) 1083687040842bf56502d33b6c0cb5d2af6da27d080cJens Axboe is->max_val = data; 1084687040842bf56502d33b6c0cb5d2af6da27d080cJens Axboe if (data < is->min_val) 1085687040842bf56502d33b6c0cb5d2af6da27d080cJens Axboe is->min_val = data; 1086687040842bf56502d33b6c0cb5d2af6da27d080cJens Axboe 1087802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe delta = val - is->mean.u.f; 1088ef11d7376273302d22c7d013bb9c296ee27f4082Jens Axboe if (delta) { 1089802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe is->mean.u.f += delta / (is->samples + 1.0); 1090802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe is->S.u.f += delta * (val - is->mean.u.f); 1091ef11d7376273302d22c7d013bb9c296ee27f4082Jens Axboe } 10923c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 10933c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe is->samples++; 10943c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 10953c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 1096bb3884d855100fa8fa6a1d2aac79e867dfd47bf9Jens Axboestatic void __add_log_sample(struct io_log *iolog, unsigned long val, 1097306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe enum fio_ddir ddir, unsigned int bs, 10982b13e716c0921356c0930522718e00b8df34293aJens Axboe unsigned long t) 10993c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 1100306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe const int nr_samples = iolog->nr_samples; 1101306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe 1102b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe if (!iolog->nr_samples) 1103b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe iolog->avg_last = t; 1104b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe 11053c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe if (iolog->nr_samples == iolog->max_samples) { 11063c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe int new_size = sizeof(struct io_sample) * iolog->max_samples*2; 11073c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 11083c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe iolog->log = realloc(iolog->log, new_size); 11093c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe iolog->max_samples <<= 1; 11103c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe } 11113c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 1112306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe iolog->log[nr_samples].val = val; 11132b13e716c0921356c0930522718e00b8df34293aJens Axboe iolog->log[nr_samples].time = t; 1114306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe iolog->log[nr_samples].ddir = ddir; 1115306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe iolog->log[nr_samples].bs = bs; 11163c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe iolog->nr_samples++; 11173c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 11183c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 11197fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboestatic inline void reset_io_stat(struct io_stat *ios) 11207fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe{ 11217fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe ios->max_val = ios->min_val = ios->samples = 0; 11227fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe ios->mean.u.f = ios->S.u.f = 0; 11237fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe} 11247fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe 1125bb3884d855100fa8fa6a1d2aac79e867dfd47bf9Jens Axboestatic void add_log_sample(struct thread_data *td, struct io_log *iolog, 1126306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe unsigned long val, enum fio_ddir ddir, 1127306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe unsigned int bs) 1128bb3884d855100fa8fa6a1d2aac79e867dfd47bf9Jens Axboe{ 11297fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe unsigned long elapsed, this_window; 1130b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe 1131ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (!ddir_rw(ddir)) 1132ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe return; 1133ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe 1134b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe elapsed = mtime_since_now(&td->epoch); 1135b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe 1136b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe /* 1137b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe * If no time averaging, just add the log sample. 1138b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe */ 1139b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe if (!iolog->avg_msec) { 1140b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe __add_log_sample(iolog, val, ddir, bs, elapsed); 1141b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe return; 1142b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe } 1143b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe 1144b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe /* 1145b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe * Add the sample. If the time period has passed, then 1146b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe * add that entry to the log and clear. 1147b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe */ 1148b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe add_stat_sample(&iolog->avg_window[ddir], val); 1149b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe 11507fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe /* 11517fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe * If period hasn't passed, adding the above sample is all we 11527fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe * need to do. 11537fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe */ 1154b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe this_window = elapsed - iolog->avg_last; 1155b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe if (this_window < iolog->avg_msec) 1156b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe return; 1157b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe 11587fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe /* 11597fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe * Note an entry in the log. Use the mean from the logged samples, 11607fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe * making sure to properly round up. Only write a log entry if we 11617fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe * had actual samples done. 11627fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe */ 11637fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe if (iolog->avg_window[DDIR_READ].samples) { 11647fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe unsigned long mr; 1165b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe 11667fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe mr = iolog->avg_window[DDIR_READ].mean.u.f + 0.50; 1167b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe __add_log_sample(iolog, mr, DDIR_READ, 0, elapsed); 11687fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe } 11697fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe if (iolog->avg_window[DDIR_WRITE].samples) { 11707fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe unsigned long mw; 11717fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe 11727fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe mw = iolog->avg_window[DDIR_WRITE].mean.u.f + 0.50; 1173b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe __add_log_sample(iolog, mw, DDIR_WRITE, 0, elapsed); 11747fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe } 1175b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe 11767fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe reset_io_stat(&iolog->avg_window[DDIR_READ]); 11777fb28d3661a5833d8be24a014a04ee4548ec1c16Jens Axboe reset_io_stat(&iolog->avg_window[DDIR_WRITE]); 1178b8bc8cba9512c6dce4891fda86de675053605ca2Jens Axboe iolog->avg_last = elapsed; 1179bb3884d855100fa8fa6a1d2aac79e867dfd47bf9Jens Axboe} 1180bb3884d855100fa8fa6a1d2aac79e867dfd47bf9Jens Axboe 1181306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboevoid add_agg_sample(unsigned long val, enum fio_ddir ddir, unsigned int bs) 1182bb3884d855100fa8fa6a1d2aac79e867dfd47bf9Jens Axboe{ 1183ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe struct io_log *iolog; 1184bb3884d855100fa8fa6a1d2aac79e867dfd47bf9Jens Axboe 1185ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (!ddir_rw(ddir)) 1186ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe return; 1187ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe 1188ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe iolog = agg_io_log[ddir]; 1189306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe __add_log_sample(iolog, val, ddir, bs, mtime_since_genesis()); 1190bb3884d855100fa8fa6a1d2aac79e867dfd47bf9Jens Axboe} 1191bb3884d855100fa8fa6a1d2aac79e867dfd47bf9Jens Axboe 1192833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hongstatic void add_clat_percentile_sample(struct thread_stat *ts, 1193833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong unsigned long usec, enum fio_ddir ddir) 1194833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong{ 1195833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong unsigned int idx = plat_val_to_idx(usec); 1196833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong assert(idx < FIO_IO_U_PLAT_NR); 1197833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 1198833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong ts->io_u_plat[ddir][idx]++; 1199833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong} 1200833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 12011e97cce9f5a87a67293a05ec4533ed6968698b2eJens Axboevoid add_clat_sample(struct thread_data *td, enum fio_ddir ddir, 1202306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe unsigned long usec, unsigned int bs) 12033c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 1204756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe struct thread_stat *ts = &td->ts; 1205079ad09b1ef22fa0d47c2cd2673908c5619aa41aJens Axboe 1206ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (!ddir_rw(ddir)) 1207ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe return; 1208ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe 1209d85f5118c41a112c3b8a58cc6908d00294bfb78dJens Axboe add_stat_sample(&ts->clat_stat[ddir], usec); 12103c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 12117b9f733afb91a5c92f44bb6e68860f17ba14f585Jens Axboe if (td->clat_log) 12127b9f733afb91a5c92f44bb6e68860f17ba14f585Jens Axboe add_log_sample(td, td->clat_log, usec, ddir, bs); 1213833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong 1214833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong if (ts->clat_percentiles) 1215833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong add_clat_percentile_sample(ts, usec, ddir); 12163c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 12173c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 12181e97cce9f5a87a67293a05ec4533ed6968698b2eJens Axboevoid add_slat_sample(struct thread_data *td, enum fio_ddir ddir, 1219306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboe unsigned long usec, unsigned int bs) 12203c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 1221756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe struct thread_stat *ts = &td->ts; 1222079ad09b1ef22fa0d47c2cd2673908c5619aa41aJens Axboe 1223ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (!ddir_rw(ddir)) 1224ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe return; 1225ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe 1226d85f5118c41a112c3b8a58cc6908d00294bfb78dJens Axboe add_stat_sample(&ts->slat_stat[ddir], usec); 12273c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 12287b9f733afb91a5c92f44bb6e68860f17ba14f585Jens Axboe if (td->slat_log) 12297b9f733afb91a5c92f44bb6e68860f17ba14f585Jens Axboe add_log_sample(td, td->slat_log, usec, ddir, bs); 12303c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 12313c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 123202af09886db695e5ea2b7fd2a632733955f3c03fJens Axboevoid add_lat_sample(struct thread_data *td, enum fio_ddir ddir, 123302af09886db695e5ea2b7fd2a632733955f3c03fJens Axboe unsigned long usec, unsigned int bs) 123402af09886db695e5ea2b7fd2a632733955f3c03fJens Axboe{ 123502af09886db695e5ea2b7fd2a632733955f3c03fJens Axboe struct thread_stat *ts = &td->ts; 123602af09886db695e5ea2b7fd2a632733955f3c03fJens Axboe 1237ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (!ddir_rw(ddir)) 1238ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe return; 1239ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe 124002af09886db695e5ea2b7fd2a632733955f3c03fJens Axboe add_stat_sample(&ts->lat_stat[ddir], usec); 124102af09886db695e5ea2b7fd2a632733955f3c03fJens Axboe 12427b9f733afb91a5c92f44bb6e68860f17ba14f585Jens Axboe if (td->lat_log) 12437b9f733afb91a5c92f44bb6e68860f17ba14f585Jens Axboe add_log_sample(td, td->lat_log, usec, ddir, bs); 124402af09886db695e5ea2b7fd2a632733955f3c03fJens Axboe} 124502af09886db695e5ea2b7fd2a632733955f3c03fJens Axboe 1246306ddc9752eef70c3fbb111af63d197a3a6d447fJens Axboevoid add_bw_sample(struct thread_data *td, enum fio_ddir ddir, unsigned int bs, 12471e97cce9f5a87a67293a05ec4533ed6968698b2eJens Axboe struct timeval *t) 12483c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{ 1249756867bd127cfa1fb27ae2d4ba973af8cb341f13Jens Axboe struct thread_stat *ts = &td->ts; 1250ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe unsigned long spent, rate; 1251ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe 1252ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (!ddir_rw(ddir)) 1253ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe return; 12543c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 1255c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe spent = mtime_since(&td->bw_sample_time, t); 12562dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe if (spent < td->o.bw_avg_time) 12573c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe return; 12589602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe 12599602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe /* 12605daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter * Compute both read and write rates for the interval. 12615daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter */ 12625daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter for (ddir = DDIR_READ; ddir <= DDIR_WRITE; ddir++) { 12635daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter uint64_t delta; 12645daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter 12655daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter delta = td->this_io_bytes[ddir] - td->stat_io_bytes[ddir]; 12665daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter if (!delta) 12675daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter continue; /* No entries for interval */ 12683c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 12695daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter rate = delta * 1000 / spent / 1024; 12705daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter add_stat_sample(&ts->bw_stat[ddir], rate); 12713c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 12725daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter if (td->bw_log) 12735daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter add_log_sample(td, td->bw_log, rate, ddir, bs); 12745daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter 12755daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter td->stat_io_bytes[ddir] = td->this_io_bytes[ddir]; 12765daa4ebed724cb0223dac4a1386e068f59722dabJosh Carter } 12773c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe 1278c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe fio_gettime(&td->bw_sample_time, NULL); 12793c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe} 1280c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe 1281c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboevoid add_iops_sample(struct thread_data *td, enum fio_ddir ddir, 1282c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe struct timeval *t) 1283c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe{ 1284c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe struct thread_stat *ts = &td->ts; 1285c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe unsigned long spent, iops; 1286c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe 1287c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe if (!ddir_rw(ddir)) 1288c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe return; 1289c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe 1290c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe spent = mtime_since(&td->iops_sample_time, t); 1291c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe if (spent < td->o.iops_avg_time) 1292c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe return; 1293c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe 12949602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe /* 12959602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe * Compute both read and write rates for the interval. 12969602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe */ 12979602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe for (ddir = DDIR_READ; ddir <= DDIR_WRITE; ddir++) { 12989602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe uint64_t delta; 1299c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe 13009602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe delta = td->this_io_blocks[ddir] - td->stat_io_blocks[ddir]; 13019602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe if (!delta) 13029602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe continue; /* No entries for interval */ 13039602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe 13049602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe iops = (delta * 1000) / spent; 13059602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe add_stat_sample(&ts->iops_stat[ddir], iops); 1306c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe 13079602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe if (td->iops_log) 13089602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe add_log_sample(td, td->iops_log, iops, ddir, 0); 13099602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe 1310421f4a827c192e3e14bfe9973d79a2e4fa8d8792Jens Axboe td->stat_io_blocks[ddir] = td->this_io_blocks[ddir]; 13119602d8df781db46f78a25a02abc75de03a69b6a8Jens Axboe } 1312c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe 1313c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe fio_gettime(&td->iops_sample_time, NULL); 1314c8eeb9df1f52f28567a5937e141decc6a26ec30bJens Axboe} 1315