Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ceph: include average/stdev r/w/m latency in mds metrics

stdev is computed in `cephfs-top` tool - clients forward
square of sums and IO count required to calculate stdev.

Signed-off-by: Venky Shankar <vshankar@redhat.com>
Reviewed-by: Xiubo Li <xiubli@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>

authored by

Venky Shankar and committed by
Ilya Dryomov
54d7b821 367290e6

+47 -17
+12 -3
fs/ceph/metric.c
··· 64 64 /* encode the read latency metric */ 65 65 read = (struct ceph_metric_read_latency *)(cap + 1); 66 66 read->header.type = cpu_to_le32(CLIENT_METRIC_TYPE_READ_LATENCY); 67 - read->header.ver = 1; 67 + read->header.ver = 2; 68 68 read->header.compat = 1; 69 69 read->header.data_len = cpu_to_le32(sizeof(*read) - header_len); 70 70 sum = m->metric[METRIC_READ].latency_sum; 71 71 ktime_to_ceph_timespec(&read->lat, sum); 72 + ktime_to_ceph_timespec(&read->avg, m->metric[METRIC_READ].latency_avg); 73 + read->sq_sum = cpu_to_le64(m->metric[METRIC_READ].latency_sq_sum); 74 + read->count = cpu_to_le64(m->metric[METRIC_READ].total); 72 75 items++; 73 76 74 77 /* encode the write latency metric */ 75 78 write = (struct ceph_metric_write_latency *)(read + 1); 76 79 write->header.type = cpu_to_le32(CLIENT_METRIC_TYPE_WRITE_LATENCY); 77 - write->header.ver = 1; 80 + write->header.ver = 2; 78 81 write->header.compat = 1; 79 82 write->header.data_len = cpu_to_le32(sizeof(*write) - header_len); 80 83 sum = m->metric[METRIC_WRITE].latency_sum; 81 84 ktime_to_ceph_timespec(&write->lat, sum); 85 + ktime_to_ceph_timespec(&write->avg, m->metric[METRIC_WRITE].latency_avg); 86 + write->sq_sum = cpu_to_le64(m->metric[METRIC_WRITE].latency_sq_sum); 87 + write->count = cpu_to_le64(m->metric[METRIC_WRITE].total); 82 88 items++; 83 89 84 90 /* encode the metadata latency metric */ 85 91 meta = (struct ceph_metric_metadata_latency *)(write + 1); 86 92 meta->header.type = cpu_to_le32(CLIENT_METRIC_TYPE_METADATA_LATENCY); 87 - meta->header.ver = 1; 93 + meta->header.ver = 2; 88 94 meta->header.compat = 1; 89 95 meta->header.data_len = cpu_to_le32(sizeof(*meta) - header_len); 90 96 sum = m->metric[METRIC_METADATA].latency_sum; 91 97 ktime_to_ceph_timespec(&meta->lat, sum); 98 + ktime_to_ceph_timespec(&meta->avg, m->metric[METRIC_METADATA].latency_avg); 99 + meta->sq_sum = cpu_to_le64(m->metric[METRIC_METADATA].latency_sq_sum); 100 + meta->count = cpu_to_le64(m->metric[METRIC_METADATA].total); 92 101 items++; 93 102 94 103 /* encode the dentry lease metric */
+35 -14
fs/ceph/metric.h
··· 19 19 CLIENT_METRIC_TYPE_OPENED_INODES, 20 20 CLIENT_METRIC_TYPE_READ_IO_SIZES, 21 21 CLIENT_METRIC_TYPE_WRITE_IO_SIZES, 22 + CLIENT_METRIC_TYPE_AVG_READ_LATENCY, 23 + CLIENT_METRIC_TYPE_STDEV_READ_LATENCY, 24 + CLIENT_METRIC_TYPE_AVG_WRITE_LATENCY, 25 + CLIENT_METRIC_TYPE_STDEV_WRITE_LATENCY, 26 + CLIENT_METRIC_TYPE_AVG_METADATA_LATENCY, 27 + CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY, 22 28 23 - CLIENT_METRIC_TYPE_MAX = CLIENT_METRIC_TYPE_WRITE_IO_SIZES, 29 + CLIENT_METRIC_TYPE_MAX = CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY, 24 30 }; 25 31 26 32 /* 27 33 * This will always have the highest metric bit value 28 34 * as the last element of the array. 29 35 */ 30 - #define CEPHFS_METRIC_SPEC_CLIENT_SUPPORTED { \ 31 - CLIENT_METRIC_TYPE_CAP_INFO, \ 32 - CLIENT_METRIC_TYPE_READ_LATENCY, \ 33 - CLIENT_METRIC_TYPE_WRITE_LATENCY, \ 34 - CLIENT_METRIC_TYPE_METADATA_LATENCY, \ 35 - CLIENT_METRIC_TYPE_DENTRY_LEASE, \ 36 - CLIENT_METRIC_TYPE_OPENED_FILES, \ 37 - CLIENT_METRIC_TYPE_PINNED_ICAPS, \ 38 - CLIENT_METRIC_TYPE_OPENED_INODES, \ 39 - CLIENT_METRIC_TYPE_READ_IO_SIZES, \ 40 - CLIENT_METRIC_TYPE_WRITE_IO_SIZES, \ 41 - \ 42 - CLIENT_METRIC_TYPE_MAX, \ 36 + #define CEPHFS_METRIC_SPEC_CLIENT_SUPPORTED { \ 37 + CLIENT_METRIC_TYPE_CAP_INFO, \ 38 + CLIENT_METRIC_TYPE_READ_LATENCY, \ 39 + CLIENT_METRIC_TYPE_WRITE_LATENCY, \ 40 + CLIENT_METRIC_TYPE_METADATA_LATENCY, \ 41 + CLIENT_METRIC_TYPE_DENTRY_LEASE, \ 42 + CLIENT_METRIC_TYPE_OPENED_FILES, \ 43 + CLIENT_METRIC_TYPE_PINNED_ICAPS, \ 44 + CLIENT_METRIC_TYPE_OPENED_INODES, \ 45 + CLIENT_METRIC_TYPE_READ_IO_SIZES, \ 46 + CLIENT_METRIC_TYPE_WRITE_IO_SIZES, \ 47 + CLIENT_METRIC_TYPE_AVG_READ_LATENCY, \ 48 + CLIENT_METRIC_TYPE_STDEV_READ_LATENCY, \ 49 + CLIENT_METRIC_TYPE_AVG_WRITE_LATENCY, \ 50 + CLIENT_METRIC_TYPE_STDEV_WRITE_LATENCY, \ 51 + CLIENT_METRIC_TYPE_AVG_METADATA_LATENCY, \ 52 + CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY, \ 53 + \ 54 + CLIENT_METRIC_TYPE_MAX, \ 43 55 } 44 56 45 57 struct ceph_metric_header { ··· 73 61 struct ceph_metric_read_latency { 74 62 struct ceph_metric_header header; 75 63 struct ceph_timespec lat; 64 + struct ceph_timespec avg; 65 + __le64 sq_sum; 66 + __le64 count; 76 67 } __packed; 77 68 78 69 /* metric write latency header */ 79 70 struct ceph_metric_write_latency { 80 71 struct ceph_metric_header header; 81 72 struct ceph_timespec lat; 73 + struct ceph_timespec avg; 74 + __le64 sq_sum; 75 + __le64 count; 82 76 } __packed; 83 77 84 78 /* metric metadata latency header */ 85 79 struct ceph_metric_metadata_latency { 86 80 struct ceph_metric_header header; 87 81 struct ceph_timespec lat; 82 + struct ceph_timespec avg; 83 + __le64 sq_sum; 84 + __le64 count; 88 85 } __packed; 89 86 90 87 /* metric dentry lease header */