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);
|
spin_unlock(&m->write_latency_lock);
|
||||||
CEPH_METRIC_SHOW("write", total, avg, min, max, sq);
|
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, "\n");
|
||||||
seq_printf(s, "item total miss hit\n");
|
seq_printf(s, "item total miss hit\n");
|
||||||
seq_printf(s, "-------------------------------------------------\n");
|
seq_printf(s, "-------------------------------------------------\n");
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/ratelimit.h>
|
#include <linux/ratelimit.h>
|
||||||
#include <linux/bits.h>
|
#include <linux/bits.h>
|
||||||
|
#include <linux/ktime.h>
|
||||||
|
|
||||||
#include "super.h"
|
#include "super.h"
|
||||||
#include "mds_client.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);
|
mutex_init(&req->r_fill_mutex);
|
||||||
req->r_mdsc = mdsc;
|
req->r_mdsc = mdsc;
|
||||||
req->r_started = jiffies;
|
req->r_started = jiffies;
|
||||||
|
req->r_start_latency = ktime_get();
|
||||||
req->r_resend_mds = -1;
|
req->r_resend_mds = -1;
|
||||||
INIT_LIST_HEAD(&req->r_unsafe_dir_item);
|
INIT_LIST_HEAD(&req->r_unsafe_dir_item);
|
||||||
INIT_LIST_HEAD(&req->r_unsafe_target_item);
|
INIT_LIST_HEAD(&req->r_unsafe_target_item);
|
||||||
|
@ -2547,6 +2549,8 @@ out:
|
||||||
static void complete_request(struct ceph_mds_client *mdsc,
|
static void complete_request(struct ceph_mds_client *mdsc,
|
||||||
struct ceph_mds_request *req)
|
struct ceph_mds_request *req)
|
||||||
{
|
{
|
||||||
|
req->r_end_latency = ktime_get();
|
||||||
|
|
||||||
if (req->r_callback)
|
if (req->r_callback)
|
||||||
req->r_callback(mdsc, req);
|
req->r_callback(mdsc, req);
|
||||||
complete_all(&req->r_completion);
|
complete_all(&req->r_completion);
|
||||||
|
@ -3155,6 +3159,9 @@ out_err:
|
||||||
|
|
||||||
/* kick calling process */
|
/* kick calling process */
|
||||||
complete_request(mdsc, req);
|
complete_request(mdsc, req);
|
||||||
|
|
||||||
|
ceph_update_metadata_latency(&mdsc->metric, req->r_start_latency,
|
||||||
|
req->r_end_latency, err);
|
||||||
out:
|
out:
|
||||||
ceph_mdsc_put_request(req);
|
ceph_mdsc_put_request(req);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/refcount.h>
|
#include <linux/refcount.h>
|
||||||
#include <linux/utsname.h>
|
#include <linux/utsname.h>
|
||||||
|
#include <linux/ktime.h>
|
||||||
|
|
||||||
#include <linux/ceph/types.h>
|
#include <linux/ceph/types.h>
|
||||||
#include <linux/ceph/messenger.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_timeout; /* optional. jiffies, 0 is "wait forever" */
|
||||||
unsigned long r_started; /* start time to measure timeout against */
|
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,
|
unsigned long r_request_started; /* start time for mds request only,
|
||||||
used to measure lease durations */
|
used to measure lease durations */
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,13 @@ int ceph_metric_init(struct ceph_client_metric *m)
|
||||||
m->total_writes = 0;
|
m->total_writes = 0;
|
||||||
m->write_latency_sum = 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;
|
return 0;
|
||||||
|
|
||||||
err_i_caps_mis:
|
err_i_caps_mis:
|
||||||
|
@ -123,3 +130,19 @@ void ceph_update_write_latency(struct ceph_client_metric *m,
|
||||||
&m->write_latency_sq_sum, lat);
|
&m->write_latency_sq_sum, lat);
|
||||||
spin_unlock(&m->write_latency_lock);
|
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_sq_sum;
|
||||||
ktime_t write_latency_min;
|
ktime_t write_latency_min;
|
||||||
ktime_t write_latency_max;
|
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);
|
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,
|
extern void ceph_update_write_latency(struct ceph_client_metric *m,
|
||||||
ktime_t r_start, ktime_t r_end,
|
ktime_t r_start, ktime_t r_end,
|
||||||
int rc);
|
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 */
|
#endif /* _FS_CEPH_MDS_METRIC_H */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче