ceph: add metadata perf metric support
Add a new "r_ended" field to struct ceph_mds_request and use that to maintain the average latency of MDS requests. URL: https://tracker.ceph.com/issues/43215 Signed-off-by: Xiubo Li <xiubli@redhat.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
Родитель
97e27aaa9a
Коммит
70c948206f
|
@ -171,6 +171,16 @@ static int metric_show(struct seq_file *s, void *p)
|
|||
spin_unlock(&m->write_latency_lock);
|
||||
CEPH_METRIC_SHOW("write", total, avg, min, max, sq);
|
||||
|
||||
spin_lock(&m->metadata_latency_lock);
|
||||
total = m->total_metadatas;
|
||||
sum = m->metadata_latency_sum;
|
||||
avg = total > 0 ? DIV64_U64_ROUND_CLOSEST(sum, total) : 0;
|
||||
min = m->metadata_latency_min;
|
||||
max = m->metadata_latency_max;
|
||||
sq = m->metadata_latency_sq_sum;
|
||||
spin_unlock(&m->metadata_latency_lock);
|
||||
CEPH_METRIC_SHOW("metadata", total, avg, min, max, sq);
|
||||
|
||||
seq_printf(s, "\n");
|
||||
seq_printf(s, "item total miss hit\n");
|
||||
seq_printf(s, "-------------------------------------------------\n");
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/seq_file.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/bits.h>
|
||||
#include <linux/ktime.h>
|
||||
|
||||
#include "super.h"
|
||||
#include "mds_client.h"
|
||||
|
@ -2201,6 +2202,7 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op, int mode)
|
|||
mutex_init(&req->r_fill_mutex);
|
||||
req->r_mdsc = mdsc;
|
||||
req->r_started = jiffies;
|
||||
req->r_start_latency = ktime_get();
|
||||
req->r_resend_mds = -1;
|
||||
INIT_LIST_HEAD(&req->r_unsafe_dir_item);
|
||||
INIT_LIST_HEAD(&req->r_unsafe_target_item);
|
||||
|
@ -2547,6 +2549,8 @@ out:
|
|||
static void complete_request(struct ceph_mds_client *mdsc,
|
||||
struct ceph_mds_request *req)
|
||||
{
|
||||
req->r_end_latency = ktime_get();
|
||||
|
||||
if (req->r_callback)
|
||||
req->r_callback(mdsc, req);
|
||||
complete_all(&req->r_completion);
|
||||
|
@ -3155,6 +3159,9 @@ out_err:
|
|||
|
||||
/* kick calling process */
|
||||
complete_request(mdsc, req);
|
||||
|
||||
ceph_update_metadata_latency(&mdsc->metric, req->r_start_latency,
|
||||
req->r_end_latency, err);
|
||||
out:
|
||||
ceph_mdsc_put_request(req);
|
||||
return;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/ktime.h>
|
||||
|
||||
#include <linux/ceph/types.h>
|
||||
#include <linux/ceph/messenger.h>
|
||||
|
@ -299,6 +300,8 @@ struct ceph_mds_request {
|
|||
|
||||
unsigned long r_timeout; /* optional. jiffies, 0 is "wait forever" */
|
||||
unsigned long r_started; /* start time to measure timeout against */
|
||||
unsigned long r_start_latency; /* start time to measure latency */
|
||||
unsigned long r_end_latency; /* finish time to measure latency */
|
||||
unsigned long r_request_started; /* start time for mds request only,
|
||||
used to measure lease durations */
|
||||
|
||||
|
|
|
@ -44,6 +44,13 @@ int ceph_metric_init(struct ceph_client_metric *m)
|
|||
m->total_writes = 0;
|
||||
m->write_latency_sum = 0;
|
||||
|
||||
spin_lock_init(&m->metadata_latency_lock);
|
||||
m->metadata_latency_sq_sum = 0;
|
||||
m->metadata_latency_min = KTIME_MAX;
|
||||
m->metadata_latency_max = 0;
|
||||
m->total_metadatas = 0;
|
||||
m->metadata_latency_sum = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
err_i_caps_mis:
|
||||
|
@ -123,3 +130,19 @@ void ceph_update_write_latency(struct ceph_client_metric *m,
|
|||
&m->write_latency_sq_sum, lat);
|
||||
spin_unlock(&m->write_latency_lock);
|
||||
}
|
||||
|
||||
void ceph_update_metadata_latency(struct ceph_client_metric *m,
|
||||
ktime_t r_start, ktime_t r_end,
|
||||
int rc)
|
||||
{
|
||||
ktime_t lat = ktime_sub(r_end, r_start);
|
||||
|
||||
if (unlikely(rc && rc != -ENOENT))
|
||||
return;
|
||||
|
||||
spin_lock(&m->metadata_latency_lock);
|
||||
__update_latency(&m->total_metadatas, &m->metadata_latency_sum,
|
||||
&m->metadata_latency_min, &m->metadata_latency_max,
|
||||
&m->metadata_latency_sq_sum, lat);
|
||||
spin_unlock(&m->metadata_latency_lock);
|
||||
}
|
||||
|
|
|
@ -28,6 +28,13 @@ struct ceph_client_metric {
|
|||
ktime_t write_latency_sq_sum;
|
||||
ktime_t write_latency_min;
|
||||
ktime_t write_latency_max;
|
||||
|
||||
spinlock_t metadata_latency_lock;
|
||||
u64 total_metadatas;
|
||||
ktime_t metadata_latency_sum;
|
||||
ktime_t metadata_latency_sq_sum;
|
||||
ktime_t metadata_latency_min;
|
||||
ktime_t metadata_latency_max;
|
||||
};
|
||||
|
||||
extern int ceph_metric_init(struct ceph_client_metric *m);
|
||||
|
@ -49,4 +56,7 @@ extern void ceph_update_read_latency(struct ceph_client_metric *m,
|
|||
extern void ceph_update_write_latency(struct ceph_client_metric *m,
|
||||
ktime_t r_start, ktime_t r_end,
|
||||
int rc);
|
||||
extern void ceph_update_metadata_latency(struct ceph_client_metric *m,
|
||||
ktime_t r_start, ktime_t r_end,
|
||||
int rc);
|
||||
#endif /* _FS_CEPH_MDS_METRIC_H */
|
||||
|
|
Загрузка…
Ссылка в новой задаче