ceph: track average r/w/m latency
authorVenky Shankar <vshankar@redhat.com>
Tue, 8 Mar 2022 12:42:17 +0000 (07:42 -0500)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 21 Mar 2022 12:35:16 +0000 (13:35 +0100)
Make the math a bit simpler to understand (should not
affect execution speeds).

Signed-off-by: Venky Shankar <vshankar@redhat.com>
Reviewed-by: Xiubo Li <xiubli@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/metric.c
fs/ceph/metric.h

index 454d2c9..14b6af4 100644 (file)
@@ -249,6 +249,7 @@ int ceph_metric_init(struct ceph_client_metric *m)
                metric->size_max = 0;
                metric->total = 0;
                metric->latency_sum = 0;
+               metric->latency_avg = 0;
                metric->latency_sq_sum = 0;
                metric->latency_min = KTIME_MAX;
                metric->latency_max = 0;
@@ -306,20 +307,19 @@ void ceph_metric_destroy(struct ceph_client_metric *m)
                max = new;                      \
 }
 
-static inline void __update_stdev(ktime_t total, ktime_t lsum,
-                                 ktime_t *sq_sump, ktime_t lat)
+static inline void __update_mean_and_stdev(ktime_t total, ktime_t *lavg,
+                                          ktime_t *sq_sump, ktime_t lat)
 {
-       ktime_t avg, sq;
-
-       if (unlikely(total == 1))
-               return;
-
-       /* the sq is (lat - old_avg) * (lat - new_avg) */
-       avg = DIV64_U64_ROUND_CLOSEST((lsum - lat), (total - 1));
-       sq = lat - avg;
-       avg = DIV64_U64_ROUND_CLOSEST(lsum, total);
-       sq = sq * (lat - avg);
-       *sq_sump += sq;
+       ktime_t avg;
+
+       if (unlikely(total == 1)) {
+               *lavg = lat;
+       } else {
+               /* the sq is (lat - old_avg) * (lat - new_avg) */
+               avg = *lavg + div64_s64(lat - *lavg, total);
+               *sq_sump += (lat - *lavg)*(lat - avg);
+               *lavg = avg;
+       }
 }
 
 void ceph_update_metrics(struct ceph_metric *m,
@@ -338,6 +338,7 @@ void ceph_update_metrics(struct ceph_metric *m,
        METRIC_UPDATE_MIN_MAX(m->size_min, m->size_max, size);
        m->latency_sum += lat;
        METRIC_UPDATE_MIN_MAX(m->latency_min, m->latency_max, lat);
-       __update_stdev(total, m->latency_sum, &m->latency_sq_sum, lat);
+       __update_mean_and_stdev(total, &m->latency_avg, &m->latency_sq_sum,
+                               lat);
        spin_unlock(&m->lock);
 }
index 5b2bb28..c47ba00 100644 (file)
@@ -137,6 +137,7 @@ struct ceph_metric {
        u64 size_min;
        u64 size_max;
        ktime_t latency_sum;
+       ktime_t latency_avg;
        ktime_t latency_sq_sum;
        ktime_t latency_min;
        ktime_t latency_max;