* [PATCH v9 0/5] ceph: add perf metrics support
@ 2020-03-09 7:37 xiubli
2020-03-09 7:37 ` [PATCH v9 1/5] ceph: add global dentry lease metric support xiubli
` (5 more replies)
0 siblings, 6 replies; 14+ messages in thread
From: xiubli @ 2020-03-09 7:37 UTC (permalink / raw)
To: jlayton, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel, Xiubo Li
From: Xiubo Li <xiubli@redhat.com>
Changed in V9:
- add an r_ended field to the mds request struct and use that to calculate the metric
- fix some commit comments
We can get the metrics from the debugfs:
$ cat /sys/kernel/debug/ceph/0c93a60d-5645-4c46-8568-4c8f63db4c7f.client4267/metrics
item total sum_lat(us) avg_lat(us)
-----------------------------------------------------
read 13 417000 32076
write 42 131205000 3123928
metadata 104 493000 4740
item total miss hit
-------------------------------------------------
d_lease 204 0 918
caps 204 213 368218
Xiubo Li (5):
ceph: add global dentry lease metric support
ceph: add caps perf metric for each session
ceph: add global read latency metric support
ceph: add global write latency metric support
ceph: add global metadata perf metric support
fs/ceph/acl.c | 2 +-
fs/ceph/addr.c | 18 +++++++
fs/ceph/caps.c | 19 ++++++++
fs/ceph/debugfs.c | 71 ++++++++++++++++++++++++++--
fs/ceph/dir.c | 17 ++++++-
fs/ceph/file.c | 26 ++++++++++
fs/ceph/inode.c | 4 +-
fs/ceph/mds_client.c | 102 +++++++++++++++++++++++++++++++++++++++-
fs/ceph/mds_client.h | 7 ++-
fs/ceph/metric.h | 69 +++++++++++++++++++++++++++
fs/ceph/super.h | 9 ++--
fs/ceph/xattr.c | 4 +-
include/linux/ceph/osd_client.h | 1 +
net/ceph/osd_client.c | 2 +
14 files changed, 334 insertions(+), 17 deletions(-)
create mode 100644 fs/ceph/metric.h
--
1.8.3.1
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v9 1/5] ceph: add global dentry lease metric support
2020-03-09 7:37 [PATCH v9 0/5] ceph: add perf metrics support xiubli
@ 2020-03-09 7:37 ` xiubli
2020-03-09 7:37 ` [PATCH v9 2/5] ceph: add caps perf metric for each session xiubli
` (4 subsequent siblings)
5 siblings, 0 replies; 14+ messages in thread
From: xiubli @ 2020-03-09 7:37 UTC (permalink / raw)
To: jlayton, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel, Xiubo Li
From: Xiubo Li <xiubli@redhat.com>
For the dentry lease we will only count the hit/miss info triggered
from the vfs calls, for the cases like request reply handling and
perodically ceph_trim_dentries() we will ignore them.
Currently only the debugfs is support:
The output will be:
item total miss hit
-------------------------------------------------
d_lease 11 7 141
URL: https://tracker.ceph.com/issues/43215
Signed-off-by: Xiubo Li <xiubli@redhat.com>
---
fs/ceph/debugfs.c | 32 ++++++++++++++++++++++++++++----
fs/ceph/dir.c | 12 ++++++++++++
fs/ceph/mds_client.c | 37 +++++++++++++++++++++++++++++++++++--
fs/ceph/mds_client.h | 4 ++++
fs/ceph/metric.h | 11 +++++++++++
fs/ceph/super.h | 1 +
6 files changed, 91 insertions(+), 6 deletions(-)
create mode 100644 fs/ceph/metric.h
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index 481ac97..15975ba 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -124,6 +124,22 @@ static int mdsc_show(struct seq_file *s, void *p)
return 0;
}
+static int metric_show(struct seq_file *s, void *p)
+{
+ struct ceph_fs_client *fsc = s->private;
+ struct ceph_mds_client *mdsc = fsc->mdsc;
+
+ seq_printf(s, "item total miss hit\n");
+ seq_printf(s, "-------------------------------------------------\n");
+
+ seq_printf(s, "%-14s%-16lld%-16lld%lld\n", "d_lease",
+ atomic64_read(&mdsc->metric.total_dentries),
+ percpu_counter_sum(&mdsc->metric.d_lease_mis),
+ percpu_counter_sum(&mdsc->metric.d_lease_hit));
+
+ return 0;
+}
+
static int caps_show_cb(struct inode *inode, struct ceph_cap *cap, void *p)
{
struct seq_file *s = p;
@@ -222,6 +238,7 @@ static int mds_sessions_show(struct seq_file *s, void *ptr)
DEFINE_SHOW_ATTRIBUTE(mdsc);
DEFINE_SHOW_ATTRIBUTE(caps);
DEFINE_SHOW_ATTRIBUTE(mds_sessions);
+DEFINE_SHOW_ATTRIBUTE(metric);
/*
@@ -255,6 +272,7 @@ void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)
debugfs_remove(fsc->debugfs_mdsmap);
debugfs_remove(fsc->debugfs_mds_sessions);
debugfs_remove(fsc->debugfs_caps);
+ debugfs_remove(fsc->debugfs_metric);
debugfs_remove(fsc->debugfs_mdsc);
}
@@ -295,11 +313,17 @@ void ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
fsc,
&mdsc_fops);
+ fsc->debugfs_metric = debugfs_create_file("metrics",
+ 0400,
+ fsc->client->debugfs_dir,
+ fsc,
+ &metric_fops);
+
fsc->debugfs_caps = debugfs_create_file("caps",
- 0400,
- fsc->client->debugfs_dir,
- fsc,
- &caps_fops);
+ 0400,
+ fsc->client->debugfs_dir,
+ fsc,
+ &caps_fops);
}
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index d594c26..8097a86 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -38,6 +38,8 @@
static int ceph_d_init(struct dentry *dentry)
{
struct ceph_dentry_info *di;
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dentry->d_sb);
+ struct ceph_mds_client *mdsc = fsc->mdsc;
di = kmem_cache_zalloc(ceph_dentry_cachep, GFP_KERNEL);
if (!di)
@@ -48,6 +50,9 @@ static int ceph_d_init(struct dentry *dentry)
di->time = jiffies;
dentry->d_fsdata = di;
INIT_LIST_HEAD(&di->lease_list);
+
+ atomic64_inc(&mdsc->metric.total_dentries);
+
return 0;
}
@@ -1709,6 +1714,8 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)
if (flags & LOOKUP_RCU)
return -ECHILD;
+ percpu_counter_inc(&mdsc->metric.d_lease_mis);
+
op = ceph_snap(dir) == CEPH_SNAPDIR ?
CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_LOOKUP;
req = ceph_mdsc_create_request(mdsc, op, USE_ANY_MDS);
@@ -1740,6 +1747,8 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)
dout("d_revalidate %p lookup result=%d\n",
dentry, err);
}
+ } else {
+ percpu_counter_inc(&mdsc->metric.d_lease_hit);
}
dout("d_revalidate %p %s\n", dentry, valid ? "valid" : "invalid");
@@ -1782,9 +1791,12 @@ static int ceph_d_delete(const struct dentry *dentry)
static void ceph_d_release(struct dentry *dentry)
{
struct ceph_dentry_info *di = ceph_dentry(dentry);
+ struct ceph_fs_client *fsc = ceph_sb_to_client(dentry->d_sb);
dout("d_release %p\n", dentry);
+ atomic64_dec(&fsc->mdsc->metric.total_dentries);
+
spin_lock(&dentry->d_lock);
__dentry_lease_unlist(di);
dentry->d_fsdata = NULL;
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 486f91f..0e2557b 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -4321,10 +4321,31 @@ static void delayed_work(struct work_struct *work)
schedule_delayed(mdsc);
}
+static int ceph_mdsc_metric_init(struct ceph_client_metric *metric)
+{
+ int ret;
+
+ if (!metric)
+ return -EINVAL;
+
+ atomic64_set(&metric->total_dentries, 0);
+ ret = percpu_counter_init(&metric->d_lease_hit, 0, GFP_KERNEL);
+ if (ret)
+ return ret;
+ ret = percpu_counter_init(&metric->d_lease_mis, 0, GFP_KERNEL);
+ if (ret) {
+ percpu_counter_destroy(&metric->d_lease_hit);
+ return ret;
+ }
+
+ return 0;
+}
+
int ceph_mdsc_init(struct ceph_fs_client *fsc)
{
struct ceph_mds_client *mdsc;
+ int err;
mdsc = kzalloc(sizeof(struct ceph_mds_client), GFP_NOFS);
if (!mdsc)
@@ -4333,8 +4354,8 @@ int ceph_mdsc_init(struct ceph_fs_client *fsc)
mutex_init(&mdsc->mutex);
mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS);
if (!mdsc->mdsmap) {
- kfree(mdsc);
- return -ENOMEM;
+ err = -ENOMEM;
+ goto err_mdsc;
}
fsc->mdsc = mdsc;
@@ -4373,6 +4394,9 @@ int ceph_mdsc_init(struct ceph_fs_client *fsc)
init_waitqueue_head(&mdsc->cap_flushing_wq);
INIT_WORK(&mdsc->cap_reclaim_work, ceph_cap_reclaim_work);
atomic_set(&mdsc->cap_reclaim_pending, 0);
+ err = ceph_mdsc_metric_init(&mdsc->metric);
+ if (err)
+ goto err_mdsmap;
spin_lock_init(&mdsc->dentry_list_lock);
INIT_LIST_HEAD(&mdsc->dentry_leases);
@@ -4391,6 +4415,12 @@ int ceph_mdsc_init(struct ceph_fs_client *fsc)
strscpy(mdsc->nodename, utsname()->nodename,
sizeof(mdsc->nodename));
return 0;
+
+err_mdsmap:
+ kfree(mdsc->mdsmap);
+err_mdsc:
+ kfree(mdsc);
+ return err;
}
/*
@@ -4648,6 +4678,9 @@ void ceph_mdsc_destroy(struct ceph_fs_client *fsc)
ceph_mdsc_stop(mdsc);
+ percpu_counter_destroy(&mdsc->metric.d_lease_mis);
+ percpu_counter_destroy(&mdsc->metric.d_lease_hit);
+
fsc->mdsc = NULL;
kfree(mdsc);
dout("mdsc_destroy %p done\n", mdsc);
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
index 4e5be79b..ae1d01c 100644
--- a/fs/ceph/mds_client.h
+++ b/fs/ceph/mds_client.h
@@ -16,6 +16,8 @@
#include <linux/ceph/mdsmap.h>
#include <linux/ceph/auth.h>
+#include "metric.h"
+
/* The first 8 bits are reserved for old ceph releases */
enum ceph_feature_type {
CEPHFS_FEATURE_MIMIC = 8,
@@ -454,6 +456,8 @@ struct ceph_mds_client {
struct list_head dentry_leases; /* fifo list */
struct list_head dentry_dir_leases; /* lru list */
+ struct ceph_client_metric metric;
+
spinlock_t snapid_map_lock;
struct rb_root snapid_map_tree;
struct list_head snapid_map_lru;
diff --git a/fs/ceph/metric.h b/fs/ceph/metric.h
new file mode 100644
index 0000000..998fe2a
--- /dev/null
+++ b/fs/ceph/metric.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _FS_CEPH_MDS_METRIC_H
+#define _FS_CEPH_MDS_METRIC_H
+
+/* This is the global metrics */
+struct ceph_client_metric {
+ atomic64_t total_dentries;
+ struct percpu_counter d_lease_hit;
+ struct percpu_counter d_lease_mis;
+};
+#endif /* _FS_CEPH_MDS_METRIC_H */
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index 60aac3a..5c73cf1 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -128,6 +128,7 @@ struct ceph_fs_client {
struct dentry *debugfs_congestion_kb;
struct dentry *debugfs_bdi;
struct dentry *debugfs_mdsc, *debugfs_mdsmap;
+ struct dentry *debugfs_metric;
struct dentry *debugfs_mds_sessions;
#endif
--
1.8.3.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v9 2/5] ceph: add caps perf metric for each session
2020-03-09 7:37 [PATCH v9 0/5] ceph: add perf metrics support xiubli
2020-03-09 7:37 ` [PATCH v9 1/5] ceph: add global dentry lease metric support xiubli
@ 2020-03-09 7:37 ` xiubli
2020-03-09 11:51 ` Jeff Layton
2020-03-09 7:37 ` [PATCH v9 3/5] ceph: add global read latency metric support xiubli
` (3 subsequent siblings)
5 siblings, 1 reply; 14+ messages in thread
From: xiubli @ 2020-03-09 7:37 UTC (permalink / raw)
To: jlayton, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel, Xiubo Li
From: Xiubo Li <xiubli@redhat.com>
This will fulfill the cap hit/mis metric stuff per-superblock,
it will count the hit/mis counters based each inode, and if one
inode's 'issued & ~revoking == mask' will mean a hit, or a miss.
item total miss hit
-------------------------------------------------
caps 295 107 4119
URL: https://tracker.ceph.com/issues/43215
Signed-off-by: Xiubo Li <xiubli@redhat.com>
---
fs/ceph/acl.c | 2 +-
fs/ceph/caps.c | 19 +++++++++++++++++++
fs/ceph/debugfs.c | 16 ++++++++++++++++
fs/ceph/dir.c | 5 +++--
fs/ceph/inode.c | 4 ++--
fs/ceph/mds_client.c | 26 ++++++++++++++++++++++----
fs/ceph/metric.h | 13 +++++++++++++
fs/ceph/super.h | 8 +++++---
fs/ceph/xattr.c | 4 ++--
9 files changed, 83 insertions(+), 14 deletions(-)
diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
index 26be652..e046574 100644
--- a/fs/ceph/acl.c
+++ b/fs/ceph/acl.c
@@ -22,7 +22,7 @@ static inline void ceph_set_cached_acl(struct inode *inode,
struct ceph_inode_info *ci = ceph_inode(inode);
spin_lock(&ci->i_ceph_lock);
- if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 0))
+ if (__ceph_caps_issued_mask_metric(ci, CEPH_CAP_XATTR_SHARED, 0))
set_cached_acl(inode, type, acl);
else
forget_cached_acl(inode, type);
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 342a32c..efaeb67 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -912,6 +912,20 @@ int __ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, int touch)
return 0;
}
+int __ceph_caps_issued_mask_metric(struct ceph_inode_info *ci, int mask,
+ int touch)
+{
+ struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb);
+ int r;
+
+ r = __ceph_caps_issued_mask(ci, mask, touch);
+ if (r)
+ ceph_update_cap_hit(&fsc->mdsc->metric);
+ else
+ ceph_update_cap_mis(&fsc->mdsc->metric);
+ return r;
+}
+
/*
* Return true if mask caps are currently being revoked by an MDS.
*/
@@ -2680,6 +2694,11 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
if (snap_rwsem_locked)
up_read(&mdsc->snap_rwsem);
+ if (!ret)
+ ceph_update_cap_mis(&mdsc->metric);
+ else if (ret == 1)
+ ceph_update_cap_hit(&mdsc->metric);
+
dout("get_cap_refs %p ret %d got %s\n", inode,
ret, ceph_cap_string(*got));
return ret;
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index 15975ba..c83e52b 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -128,6 +128,7 @@ static int metric_show(struct seq_file *s, void *p)
{
struct ceph_fs_client *fsc = s->private;
struct ceph_mds_client *mdsc = fsc->mdsc;
+ int i, nr_caps = 0;
seq_printf(s, "item total miss hit\n");
seq_printf(s, "-------------------------------------------------\n");
@@ -137,6 +138,21 @@ static int metric_show(struct seq_file *s, void *p)
percpu_counter_sum(&mdsc->metric.d_lease_mis),
percpu_counter_sum(&mdsc->metric.d_lease_hit));
+ mutex_lock(&mdsc->mutex);
+ for (i = 0; i < mdsc->max_sessions; i++) {
+ struct ceph_mds_session *s;
+
+ s = __ceph_lookup_mds_session(mdsc, i);
+ if (!s)
+ continue;
+ nr_caps += s->s_nr_caps;
+ ceph_put_mds_session(s);
+ }
+ mutex_unlock(&mdsc->mutex);
+ seq_printf(s, "%-14s%-16d%-16lld%lld\n", "caps", nr_caps,
+ percpu_counter_sum(&mdsc->metric.i_caps_mis),
+ percpu_counter_sum(&mdsc->metric.i_caps_hit));
+
return 0;
}
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index 8097a86..10d528a 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -349,8 +349,9 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx)
!ceph_test_mount_opt(fsc, NOASYNCREADDIR) &&
ceph_snap(inode) != CEPH_SNAPDIR &&
__ceph_dir_is_complete_ordered(ci) &&
- __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1)) {
+ __ceph_caps_issued_mask_metric(ci, CEPH_CAP_FILE_SHARED, 1)) {
int shared_gen = atomic_read(&ci->i_shared_gen);
+
spin_unlock(&ci->i_ceph_lock);
err = __dcache_readdir(file, ctx, shared_gen);
if (err != -EAGAIN)
@@ -767,7 +768,7 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry,
!is_root_ceph_dentry(dir, dentry) &&
ceph_test_mount_opt(fsc, DCACHE) &&
__ceph_dir_is_complete(ci) &&
- (__ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1))) {
+ __ceph_caps_issued_mask_metric(ci, CEPH_CAP_FILE_SHARED, 1)) {
__ceph_touch_fmode(ci, mdsc, CEPH_FILE_MODE_RD);
spin_unlock(&ci->i_ceph_lock);
dout(" dir %p complete, -ENOENT\n", dir);
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index ee40ba7..b5a30ca6 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -2284,8 +2284,8 @@ int __ceph_do_getattr(struct inode *inode, struct page *locked_page,
dout("do_getattr inode %p mask %s mode 0%o\n",
inode, ceph_cap_string(mask), inode->i_mode);
- if (!force && ceph_caps_issued_mask(ceph_inode(inode), mask, 1))
- return 0;
+ if (!force && ceph_caps_issued_mask_metric(ceph_inode(inode), mask, 1))
+ return 0;
mode = (mask & CEPH_STAT_RSTAT) ? USE_AUTH_MDS : USE_ANY_MDS;
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_GETATTR, mode);
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 0e2557b..ba54fd2 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -4332,13 +4332,29 @@ static int ceph_mdsc_metric_init(struct ceph_client_metric *metric)
ret = percpu_counter_init(&metric->d_lease_hit, 0, GFP_KERNEL);
if (ret)
return ret;
+
ret = percpu_counter_init(&metric->d_lease_mis, 0, GFP_KERNEL);
- if (ret) {
- percpu_counter_destroy(&metric->d_lease_hit);
- return ret;
- }
+ if (ret)
+ goto err_d_lease_mis;
+
+ ret = percpu_counter_init(&metric->i_caps_hit, 0, GFP_KERNEL);
+ if (ret)
+ goto err_i_caps_hit;
+
+ ret = percpu_counter_init(&metric->i_caps_mis, 0, GFP_KERNEL);
+ if (ret)
+ goto err_i_caps_mis;
return 0;
+
+err_i_caps_mis:
+ percpu_counter_destroy(&metric->i_caps_hit);
+err_i_caps_hit:
+ percpu_counter_destroy(&metric->d_lease_mis);
+err_d_lease_mis:
+ percpu_counter_destroy(&metric->d_lease_hit);
+
+ return ret;
}
int ceph_mdsc_init(struct ceph_fs_client *fsc)
@@ -4678,6 +4694,8 @@ void ceph_mdsc_destroy(struct ceph_fs_client *fsc)
ceph_mdsc_stop(mdsc);
+ percpu_counter_destroy(&mdsc->metric.i_caps_mis);
+ percpu_counter_destroy(&mdsc->metric.i_caps_hit);
percpu_counter_destroy(&mdsc->metric.d_lease_mis);
percpu_counter_destroy(&mdsc->metric.d_lease_hit);
diff --git a/fs/ceph/metric.h b/fs/ceph/metric.h
index 998fe2a..f620f72 100644
--- a/fs/ceph/metric.h
+++ b/fs/ceph/metric.h
@@ -7,5 +7,18 @@ struct ceph_client_metric {
atomic64_t total_dentries;
struct percpu_counter d_lease_hit;
struct percpu_counter d_lease_mis;
+
+ struct percpu_counter i_caps_hit;
+ struct percpu_counter i_caps_mis;
};
+
+static inline void ceph_update_cap_hit(struct ceph_client_metric *m)
+{
+ percpu_counter_inc(&m->i_caps_hit);
+}
+
+static inline void ceph_update_cap_mis(struct ceph_client_metric *m)
+{
+ percpu_counter_inc(&m->i_caps_mis);
+}
#endif /* _FS_CEPH_MDS_METRIC_H */
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index 5c73cf1..47cfd89 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -645,6 +645,8 @@ static inline bool __ceph_is_any_real_caps(struct ceph_inode_info *ci)
extern int __ceph_caps_issued(struct ceph_inode_info *ci, int *implemented);
extern int __ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, int t);
+extern int __ceph_caps_issued_mask_metric(struct ceph_inode_info *ci, int mask,
+ int t);
extern int __ceph_caps_issued_other(struct ceph_inode_info *ci,
struct ceph_cap *cap);
@@ -657,12 +659,12 @@ static inline int ceph_caps_issued(struct ceph_inode_info *ci)
return issued;
}
-static inline int ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask,
- int touch)
+static inline int ceph_caps_issued_mask_metric(struct ceph_inode_info *ci,
+ int mask, int touch)
{
int r;
spin_lock(&ci->i_ceph_lock);
- r = __ceph_caps_issued_mask(ci, mask, touch);
+ r = __ceph_caps_issued_mask_metric(ci, mask, touch);
spin_unlock(&ci->i_ceph_lock);
return r;
}
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c
index 7b8a070..71ee34d 100644
--- a/fs/ceph/xattr.c
+++ b/fs/ceph/xattr.c
@@ -856,7 +856,7 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value,
if (ci->i_xattrs.version == 0 ||
!((req_mask & CEPH_CAP_XATTR_SHARED) ||
- __ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 1))) {
+ __ceph_caps_issued_mask_metric(ci, CEPH_CAP_XATTR_SHARED, 1))) {
spin_unlock(&ci->i_ceph_lock);
/* security module gets xattr while filling trace */
@@ -914,7 +914,7 @@ ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size)
ci->i_xattrs.version, ci->i_xattrs.index_version);
if (ci->i_xattrs.version == 0 ||
- !__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 1)) {
+ !__ceph_caps_issued_mask_metric(ci, CEPH_CAP_XATTR_SHARED, 1)) {
spin_unlock(&ci->i_ceph_lock);
err = ceph_do_getattr(inode, CEPH_STAT_CAP_XATTR, true);
if (err)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v9 3/5] ceph: add global read latency metric support
2020-03-09 7:37 [PATCH v9 0/5] ceph: add perf metrics support xiubli
2020-03-09 7:37 ` [PATCH v9 1/5] ceph: add global dentry lease metric support xiubli
2020-03-09 7:37 ` [PATCH v9 2/5] ceph: add caps perf metric for each session xiubli
@ 2020-03-09 7:37 ` xiubli
2020-03-09 7:37 ` [PATCH v9 4/5] ceph: add global write " xiubli
` (2 subsequent siblings)
5 siblings, 0 replies; 14+ messages in thread
From: xiubli @ 2020-03-09 7:37 UTC (permalink / raw)
To: jlayton, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel, Xiubo Li
From: Xiubo Li <xiubli@redhat.com>
It will calculate the latency for the read osd requests:
item total sum_lat(us) avg_lat(us)
-----------------------------------------------------
read 1036 848000 818
URL: https://tracker.ceph.com/issues/43215
Signed-off-by: Xiubo Li <xiubli@redhat.com>
---
fs/ceph/addr.c | 8 ++++++++
fs/ceph/debugfs.c | 11 +++++++++++
fs/ceph/file.c | 16 ++++++++++++++++
fs/ceph/mds_client.c | 14 ++++++++++++++
fs/ceph/metric.h | 15 +++++++++++++++
include/linux/ceph/osd_client.h | 1 +
net/ceph/osd_client.c | 2 ++
7 files changed, 67 insertions(+)
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 6f4678d..55008a3 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -216,6 +216,9 @@ static int ceph_sync_readpages(struct ceph_fs_client *fsc,
if (!rc)
rc = ceph_osdc_wait_request(osdc, req);
+ ceph_update_read_latency(&fsc->mdsc->metric, req->r_start_stamp,
+ req->r_end_stamp, rc);
+
ceph_osdc_put_request(req);
dout("readpages result %d\n", rc);
return rc;
@@ -299,6 +302,7 @@ static int ceph_readpage(struct file *filp, struct page *page)
static void finish_read(struct ceph_osd_request *req)
{
struct inode *inode = req->r_inode;
+ struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
struct ceph_osd_data *osd_data;
int rc = req->r_result <= 0 ? req->r_result : 0;
int bytes = req->r_result >= 0 ? req->r_result : 0;
@@ -336,6 +340,10 @@ static void finish_read(struct ceph_osd_request *req)
put_page(page);
bytes -= PAGE_SIZE;
}
+
+ ceph_update_read_latency(&fsc->mdsc->metric, req->r_start_stamp,
+ req->r_end_stamp, rc);
+
kfree(osd_data->pages);
}
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index c83e52b..d814a3a 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -129,7 +129,18 @@ static int metric_show(struct seq_file *s, void *p)
struct ceph_fs_client *fsc = s->private;
struct ceph_mds_client *mdsc = fsc->mdsc;
int i, nr_caps = 0;
+ s64 total, sum, avg = 0;
+ seq_printf(s, "item total sum_lat(us) avg_lat(us)\n");
+ seq_printf(s, "-----------------------------------------------------\n");
+
+ total = percpu_counter_sum(&mdsc->metric.total_reads);
+ sum = percpu_counter_sum(&mdsc->metric.read_latency_sum);
+ sum = jiffies_to_usecs(sum);
+ avg = total ? sum / total : 0;
+ seq_printf(s, "%-14s%-12lld%-16lld%lld\n", "read", total, sum, avg);
+
+ seq_printf(s, "\n");
seq_printf(s, "item total miss hit\n");
seq_printf(s, "-------------------------------------------------\n");
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index ba46ba74..3dce2a0 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -906,6 +906,10 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
ret = ceph_osdc_start_request(osdc, req, false);
if (!ret)
ret = ceph_osdc_wait_request(osdc, req);
+
+ ceph_update_read_latency(&fsc->mdsc->metric, req->r_start_stamp,
+ req->r_end_stamp, ret);
+
ceph_osdc_put_request(req);
i_size = i_size_read(inode);
@@ -1044,6 +1048,8 @@ static void ceph_aio_complete_req(struct ceph_osd_request *req)
struct inode *inode = req->r_inode;
struct ceph_aio_request *aio_req = req->r_priv;
struct ceph_osd_data *osd_data = osd_req_op_extent_osd_data(req, 0);
+ struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
+ struct ceph_client_metric *metric = &fsc->mdsc->metric;
BUG_ON(osd_data->type != CEPH_OSD_DATA_TYPE_BVECS);
BUG_ON(!osd_data->num_bvecs);
@@ -1051,6 +1057,11 @@ static void ceph_aio_complete_req(struct ceph_osd_request *req)
dout("ceph_aio_complete_req %p rc %d bytes %u\n",
inode, rc, osd_data->bvec_pos.iter.bi_size);
+ /* r_start_stamp == 0 means the request was not submitted */
+ if (req->r_start_stamp && !aio_req->write)
+ ceph_update_read_latency(metric, req->r_start_stamp,
+ req->r_end_stamp, rc);
+
if (rc == -EOLDSNAPC) {
struct ceph_aio_work *aio_work;
BUG_ON(!aio_req->write);
@@ -1179,6 +1190,7 @@ static void ceph_aio_retry_work(struct work_struct *work)
struct inode *inode = file_inode(file);
struct ceph_inode_info *ci = ceph_inode(inode);
struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
+ struct ceph_client_metric *metric = &fsc->mdsc->metric;
struct ceph_vino vino;
struct ceph_osd_request *req;
struct bio_vec *bvecs;
@@ -1295,6 +1307,10 @@ static void ceph_aio_retry_work(struct work_struct *work)
if (!ret)
ret = ceph_osdc_wait_request(&fsc->client->osdc, req);
+ if (!write)
+ ceph_update_read_latency(metric, req->r_start_stamp,
+ req->r_end_stamp, ret);
+
size = i_size_read(inode);
if (!write) {
if (ret == -ENOENT)
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index ba54fd2..94f6e53 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -4345,8 +4345,20 @@ static int ceph_mdsc_metric_init(struct ceph_client_metric *metric)
if (ret)
goto err_i_caps_mis;
+ ret = percpu_counter_init(&metric->total_reads, 0, GFP_KERNEL);
+ if (ret)
+ goto err_total_reads;
+
+ ret = percpu_counter_init(&metric->read_latency_sum, 0, GFP_KERNEL);
+ if (ret)
+ goto err_read_latency_sum;
+
return 0;
+err_read_latency_sum:
+ percpu_counter_destroy(&metric->total_reads);
+err_total_reads:
+ percpu_counter_destroy(&metric->i_caps_mis);
err_i_caps_mis:
percpu_counter_destroy(&metric->i_caps_hit);
err_i_caps_hit:
@@ -4694,6 +4706,8 @@ void ceph_mdsc_destroy(struct ceph_fs_client *fsc)
ceph_mdsc_stop(mdsc);
+ percpu_counter_destroy(&mdsc->metric.read_latency_sum);
+ percpu_counter_destroy(&mdsc->metric.total_reads);
percpu_counter_destroy(&mdsc->metric.i_caps_mis);
percpu_counter_destroy(&mdsc->metric.i_caps_hit);
percpu_counter_destroy(&mdsc->metric.d_lease_mis);
diff --git a/fs/ceph/metric.h b/fs/ceph/metric.h
index f620f72..0fe3eee 100644
--- a/fs/ceph/metric.h
+++ b/fs/ceph/metric.h
@@ -10,6 +10,9 @@ struct ceph_client_metric {
struct percpu_counter i_caps_hit;
struct percpu_counter i_caps_mis;
+
+ struct percpu_counter total_reads;
+ struct percpu_counter read_latency_sum;
};
static inline void ceph_update_cap_hit(struct ceph_client_metric *m)
@@ -21,4 +24,16 @@ static inline void ceph_update_cap_mis(struct ceph_client_metric *m)
{
percpu_counter_inc(&m->i_caps_mis);
}
+
+static inline void ceph_update_read_latency(struct ceph_client_metric *m,
+ unsigned long r_start,
+ unsigned long r_end,
+ int rc)
+{
+ if (rc < 0 && rc != -ENOENT && rc != -ETIMEDOUT)
+ return;
+
+ percpu_counter_inc(&m->total_reads);
+ percpu_counter_add(&m->read_latency_sum, r_end - r_start);
+}
#endif /* _FS_CEPH_MDS_METRIC_H */
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
index 9d9f745..02ff3a3 100644
--- a/include/linux/ceph/osd_client.h
+++ b/include/linux/ceph/osd_client.h
@@ -213,6 +213,7 @@ struct ceph_osd_request {
/* internal */
unsigned long r_stamp; /* jiffies, send or check time */
unsigned long r_start_stamp; /* jiffies */
+ unsigned long r_end_stamp; /* jiffies */
int r_attempts;
u32 r_map_dne_bound;
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 51810db..4106db6 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -2389,6 +2389,8 @@ static void finish_request(struct ceph_osd_request *req)
WARN_ON(lookup_request_mc(&osdc->map_checks, req->r_tid));
dout("%s req %p tid %llu\n", __func__, req, req->r_tid);
+ req->r_end_stamp = jiffies;
+
if (req->r_osd)
unlink_request(req->r_osd, req);
atomic_dec(&osdc->num_requests);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v9 4/5] ceph: add global write latency metric support
2020-03-09 7:37 [PATCH v9 0/5] ceph: add perf metrics support xiubli
` (2 preceding siblings ...)
2020-03-09 7:37 ` [PATCH v9 3/5] ceph: add global read latency metric support xiubli
@ 2020-03-09 7:37 ` xiubli
2020-03-09 7:37 ` [PATCH v9 5/5] ceph: add global metadata perf " xiubli
2020-03-09 12:09 ` [PATCH v9 0/5] ceph: add perf metrics support Jeff Layton
5 siblings, 0 replies; 14+ messages in thread
From: xiubli @ 2020-03-09 7:37 UTC (permalink / raw)
To: jlayton, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel, Xiubo Li
From: Xiubo Li <xiubli@redhat.com>
It will calculate the latency for the write osd requests:
item total sum_lat(us) avg_lat(us)
-----------------------------------------------------
write 1048 8778000 8375
URL: https://tracker.ceph.com/issues/43215
Signed-off-by: Xiubo Li <xiubli@redhat.com>
---
fs/ceph/addr.c | 10 ++++++++++
fs/ceph/debugfs.c | 6 ++++++
fs/ceph/file.c | 18 ++++++++++++++----
fs/ceph/mds_client.c | 14 ++++++++++++++
fs/ceph/metric.h | 15 +++++++++++++++
5 files changed, 59 insertions(+), 4 deletions(-)
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 55008a3..f359619 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -651,6 +651,9 @@ static int ceph_sync_writepages(struct ceph_fs_client *fsc,
if (!rc)
rc = ceph_osdc_wait_request(osdc, req);
+ ceph_update_write_latency(&fsc->mdsc->metric, req->r_start_stamp,
+ req->r_end_stamp, rc);
+
ceph_osdc_put_request(req);
if (rc == 0)
rc = len;
@@ -802,6 +805,9 @@ static void writepages_finish(struct ceph_osd_request *req)
ceph_clear_error_write(ci);
}
+ ceph_update_write_latency(&fsc->mdsc->metric, req->r_start_stamp,
+ req->r_end_stamp, rc);
+
/*
* We lost the cache cap, need to truncate the page before
* it is unlocked, otherwise we'd truncate it later in the
@@ -1860,6 +1866,10 @@ int ceph_uninline_data(struct file *filp, struct page *locked_page)
err = ceph_osdc_start_request(&fsc->client->osdc, req, false);
if (!err)
err = ceph_osdc_wait_request(&fsc->client->osdc, req);
+
+ ceph_update_write_latency(&fsc->mdsc->metric, req->r_start_stamp,
+ req->r_end_stamp, err);
+
out_put:
ceph_osdc_put_request(req);
if (err == -ECANCELED)
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index d814a3a..464bfbd 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -140,6 +140,12 @@ static int metric_show(struct seq_file *s, void *p)
avg = total ? sum / total : 0;
seq_printf(s, "%-14s%-12lld%-16lld%lld\n", "read", total, sum, avg);
+ total = percpu_counter_sum(&mdsc->metric.total_writes);
+ sum = percpu_counter_sum(&mdsc->metric.write_latency_sum);
+ sum = jiffies_to_usecs(sum);
+ avg = total ? sum / total : 0;
+ seq_printf(s, "%-14s%-12lld%-16lld%lld\n", "write", total, sum, avg);
+
seq_printf(s, "\n");
seq_printf(s, "item total miss hit\n");
seq_printf(s, "-------------------------------------------------\n");
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 3dce2a0..aa08fdf 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -1058,9 +1058,14 @@ static void ceph_aio_complete_req(struct ceph_osd_request *req)
inode, rc, osd_data->bvec_pos.iter.bi_size);
/* r_start_stamp == 0 means the request was not submitted */
- if (req->r_start_stamp && !aio_req->write)
- ceph_update_read_latency(metric, req->r_start_stamp,
- req->r_end_stamp, rc);
+ if (req->r_start_stamp) {
+ if (aio_req->write)
+ ceph_update_write_latency(metric, req->r_start_stamp,
+ req->r_end_stamp, rc);
+ else
+ ceph_update_read_latency(metric, req->r_start_stamp,
+ req->r_end_stamp, rc);
+ }
if (rc == -EOLDSNAPC) {
struct ceph_aio_work *aio_work;
@@ -1307,7 +1312,10 @@ static void ceph_aio_retry_work(struct work_struct *work)
if (!ret)
ret = ceph_osdc_wait_request(&fsc->client->osdc, req);
- if (!write)
+ if (write)
+ ceph_update_write_latency(metric, req->r_start_stamp,
+ req->r_end_stamp, ret);
+ else
ceph_update_read_latency(metric, req->r_start_stamp,
req->r_end_stamp, ret);
@@ -1482,6 +1490,8 @@ static void ceph_aio_retry_work(struct work_struct *work)
if (!ret)
ret = ceph_osdc_wait_request(&fsc->client->osdc, req);
+ ceph_update_write_latency(&fsc->mdsc->metric, req->r_start_stamp,
+ req->r_end_stamp, ret);
out:
ceph_osdc_put_request(req);
if (ret != 0) {
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 94f6e53..43f5d59 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -4353,8 +4353,20 @@ static int ceph_mdsc_metric_init(struct ceph_client_metric *metric)
if (ret)
goto err_read_latency_sum;
+ ret = percpu_counter_init(&metric->total_writes, 0, GFP_KERNEL);
+ if (ret)
+ goto err_total_writes;
+
+ ret = percpu_counter_init(&metric->write_latency_sum, 0, GFP_KERNEL);
+ if (ret)
+ goto err_write_latency_sum;
+
return 0;
+err_write_latency_sum:
+ percpu_counter_destroy(&metric->total_writes);
+err_total_writes:
+ percpu_counter_destroy(&metric->read_latency_sum);
err_read_latency_sum:
percpu_counter_destroy(&metric->total_reads);
err_total_reads:
@@ -4706,6 +4718,8 @@ void ceph_mdsc_destroy(struct ceph_fs_client *fsc)
ceph_mdsc_stop(mdsc);
+ percpu_counter_destroy(&mdsc->metric.write_latency_sum);
+ percpu_counter_destroy(&mdsc->metric.total_writes);
percpu_counter_destroy(&mdsc->metric.read_latency_sum);
percpu_counter_destroy(&mdsc->metric.total_reads);
percpu_counter_destroy(&mdsc->metric.i_caps_mis);
diff --git a/fs/ceph/metric.h b/fs/ceph/metric.h
index 0fe3eee..13698aa 100644
--- a/fs/ceph/metric.h
+++ b/fs/ceph/metric.h
@@ -13,6 +13,9 @@ struct ceph_client_metric {
struct percpu_counter total_reads;
struct percpu_counter read_latency_sum;
+
+ struct percpu_counter total_writes;
+ struct percpu_counter write_latency_sum;
};
static inline void ceph_update_cap_hit(struct ceph_client_metric *m)
@@ -36,4 +39,16 @@ static inline void ceph_update_read_latency(struct ceph_client_metric *m,
percpu_counter_inc(&m->total_reads);
percpu_counter_add(&m->read_latency_sum, r_end - r_start);
}
+
+static inline void ceph_update_write_latency(struct ceph_client_metric *m,
+ unsigned long r_start,
+ unsigned long r_end,
+ int rc)
+{
+ if (rc && rc != -ETIMEDOUT)
+ return;
+
+ percpu_counter_inc(&m->total_writes);
+ percpu_counter_add(&m->write_latency_sum, r_end - r_start);
+}
#endif /* _FS_CEPH_MDS_METRIC_H */
--
1.8.3.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v9 5/5] ceph: add global metadata perf metric support
2020-03-09 7:37 [PATCH v9 0/5] ceph: add perf metrics support xiubli
` (3 preceding siblings ...)
2020-03-09 7:37 ` [PATCH v9 4/5] ceph: add global write " xiubli
@ 2020-03-09 7:37 ` xiubli
2020-03-09 12:09 ` [PATCH v9 0/5] ceph: add perf metrics support Jeff Layton
5 siblings, 0 replies; 14+ messages in thread
From: xiubli @ 2020-03-09 7:37 UTC (permalink / raw)
To: jlayton, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel, Xiubo Li
From: Xiubo Li <xiubli@redhat.com>
It will calculate the latency for the metedata requests:
item total sum_lat(us) avg_lat(us)
-----------------------------------------------------
metadata 113 220000 1946
URL: https://tracker.ceph.com/issues/43215
Signed-off-by: Xiubo Li <xiubli@redhat.com>
---
fs/ceph/debugfs.c | 6 ++++++
fs/ceph/mds_client.c | 19 +++++++++++++++++++
fs/ceph/mds_client.h | 3 ++-
fs/ceph/metric.h | 15 +++++++++++++++
4 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index 464bfbd..60f3e307 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -146,6 +146,12 @@ static int metric_show(struct seq_file *s, void *p)
avg = total ? sum / total : 0;
seq_printf(s, "%-14s%-12lld%-16lld%lld\n", "write", total, sum, avg);
+ total = percpu_counter_sum(&mdsc->metric.total_metadatas);
+ sum = percpu_counter_sum(&mdsc->metric.metadata_latency_sum);
+ sum = jiffies_to_usecs(sum);
+ avg = total ? sum / total : 0;
+ seq_printf(s, "%-14s%-12lld%-16lld%lld\n", "metadata", total, sum, avg);
+
seq_printf(s, "\n");
seq_printf(s, "item total miss hit\n");
seq_printf(s, "-------------------------------------------------\n");
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 43f5d59..5c03ed3 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -2547,6 +2547,8 @@ static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc,
static void complete_request(struct ceph_mds_client *mdsc,
struct ceph_mds_request *req)
{
+ req->r_ended = jiffies;
+
if (req->r_callback)
req->r_callback(mdsc, req);
complete_all(&req->r_completion);
@@ -3155,6 +3157,9 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
/* kick calling process */
complete_request(mdsc, req);
+
+ ceph_update_metadata_latency(&mdsc->metric, req->r_started,
+ req->r_ended, err);
out:
ceph_mdsc_put_request(req);
return;
@@ -4361,8 +4366,20 @@ static int ceph_mdsc_metric_init(struct ceph_client_metric *metric)
if (ret)
goto err_write_latency_sum;
+ ret = percpu_counter_init(&metric->total_metadatas, 0, GFP_KERNEL);
+ if (ret)
+ goto err_total_metadatas;
+
+ ret = percpu_counter_init(&metric->metadata_latency_sum, 0, GFP_KERNEL);
+ if (ret)
+ goto err_metadata_latency_sum;
+
return 0;
+err_metadata_latency_sum:
+ percpu_counter_destroy(&metric->total_metadatas);
+err_total_metadatas:
+ percpu_counter_destroy(&metric->write_latency_sum);
err_write_latency_sum:
percpu_counter_destroy(&metric->total_writes);
err_total_writes:
@@ -4718,6 +4735,8 @@ void ceph_mdsc_destroy(struct ceph_fs_client *fsc)
ceph_mdsc_stop(mdsc);
+ percpu_counter_destroy(&mdsc->metric.metadata_latency_sum);
+ percpu_counter_destroy(&mdsc->metric.total_metadatas);
percpu_counter_destroy(&mdsc->metric.write_latency_sum);
percpu_counter_destroy(&mdsc->metric.total_writes);
percpu_counter_destroy(&mdsc->metric.read_latency_sum);
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
index ae1d01c..9018fa7 100644
--- a/fs/ceph/mds_client.h
+++ b/fs/ceph/mds_client.h
@@ -298,7 +298,8 @@ struct ceph_mds_request {
u32 r_readdir_offset;
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 and latency */
+ unsigned long r_ended; /* finish time to measure latency */
unsigned long r_request_started; /* start time for mds request only,
used to measure lease durations */
diff --git a/fs/ceph/metric.h b/fs/ceph/metric.h
index 13698aa..faba142 100644
--- a/fs/ceph/metric.h
+++ b/fs/ceph/metric.h
@@ -16,6 +16,9 @@ struct ceph_client_metric {
struct percpu_counter total_writes;
struct percpu_counter write_latency_sum;
+
+ struct percpu_counter total_metadatas;
+ struct percpu_counter metadata_latency_sum;
};
static inline void ceph_update_cap_hit(struct ceph_client_metric *m)
@@ -51,4 +54,16 @@ static inline void ceph_update_write_latency(struct ceph_client_metric *m,
percpu_counter_inc(&m->total_writes);
percpu_counter_add(&m->write_latency_sum, r_end - r_start);
}
+
+static inline void ceph_update_metadata_latency(struct ceph_client_metric *m,
+ unsigned long r_start,
+ unsigned long r_end,
+ int rc)
+{
+ if (rc && rc != -ENOENT)
+ return;
+
+ percpu_counter_inc(&m->total_metadatas);
+ percpu_counter_add(&m->metadata_latency_sum, r_end - r_start);
+}
#endif /* _FS_CEPH_MDS_METRIC_H */
--
1.8.3.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v9 2/5] ceph: add caps perf metric for each session
2020-03-09 7:37 ` [PATCH v9 2/5] ceph: add caps perf metric for each session xiubli
@ 2020-03-09 11:51 ` Jeff Layton
2020-03-09 12:05 ` Jeff Layton
2020-03-09 12:26 ` Xiubo Li
0 siblings, 2 replies; 14+ messages in thread
From: Jeff Layton @ 2020-03-09 11:51 UTC (permalink / raw)
To: xiubli, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel
On Mon, 2020-03-09 at 03:37 -0400, xiubli@redhat.com wrote:
> From: Xiubo Li <xiubli@redhat.com>
>
> This will fulfill the cap hit/mis metric stuff per-superblock,
> it will count the hit/mis counters based each inode, and if one
> inode's 'issued & ~revoking == mask' will mean a hit, or a miss.
>
> item total miss hit
> -------------------------------------------------
> caps 295 107 4119
>
> URL: https://tracker.ceph.com/issues/43215
> Signed-off-by: Xiubo Li <xiubli@redhat.com>
> ---
> fs/ceph/acl.c | 2 +-
> fs/ceph/caps.c | 19 +++++++++++++++++++
> fs/ceph/debugfs.c | 16 ++++++++++++++++
> fs/ceph/dir.c | 5 +++--
> fs/ceph/inode.c | 4 ++--
> fs/ceph/mds_client.c | 26 ++++++++++++++++++++++----
> fs/ceph/metric.h | 13 +++++++++++++
> fs/ceph/super.h | 8 +++++---
> fs/ceph/xattr.c | 4 ++--
> 9 files changed, 83 insertions(+), 14 deletions(-)
>
> diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
> index 26be652..e046574 100644
> --- a/fs/ceph/acl.c
> +++ b/fs/ceph/acl.c
> @@ -22,7 +22,7 @@ static inline void ceph_set_cached_acl(struct inode *inode,
> struct ceph_inode_info *ci = ceph_inode(inode);
>
> spin_lock(&ci->i_ceph_lock);
> - if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 0))
> + if (__ceph_caps_issued_mask_metric(ci, CEPH_CAP_XATTR_SHARED, 0))
> set_cached_acl(inode, type, acl);
> else
> forget_cached_acl(inode, type);
> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
> index 342a32c..efaeb67 100644
> --- a/fs/ceph/caps.c
> +++ b/fs/ceph/caps.c
> @@ -912,6 +912,20 @@ int __ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, int touch)
> return 0;
> }
>
> +int __ceph_caps_issued_mask_metric(struct ceph_inode_info *ci, int mask,
> + int touch)
> +{
> + struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb);
> + int r;
> +
> + r = __ceph_caps_issued_mask(ci, mask, touch);
> + if (r)
> + ceph_update_cap_hit(&fsc->mdsc->metric);
> + else
> + ceph_update_cap_mis(&fsc->mdsc->metric);
> + return r;
> +}
> +
> /*
> * Return true if mask caps are currently being revoked by an MDS.
> */
> @@ -2680,6 +2694,11 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
> if (snap_rwsem_locked)
> up_read(&mdsc->snap_rwsem);
>
> + if (!ret)
> + ceph_update_cap_mis(&mdsc->metric);
Should a negative error code here also mean a miss?
> + else if (ret == 1)
> + ceph_update_cap_hit(&mdsc->metric);
> +
> dout("get_cap_refs %p ret %d got %s\n", inode,
> ret, ceph_cap_string(*got));
> return ret;
--
Jeff Layton <jlayton@kernel.org>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v9 2/5] ceph: add caps perf metric for each session
2020-03-09 11:51 ` Jeff Layton
@ 2020-03-09 12:05 ` Jeff Layton
2020-03-09 12:36 ` Xiubo Li
2020-03-09 12:26 ` Xiubo Li
1 sibling, 1 reply; 14+ messages in thread
From: Jeff Layton @ 2020-03-09 12:05 UTC (permalink / raw)
To: xiubli, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel
On Mon, 2020-03-09 at 07:51 -0400, Jeff Layton wrote:
> On Mon, 2020-03-09 at 03:37 -0400, xiubli@redhat.com wrote:
> > From: Xiubo Li <xiubli@redhat.com>
> >
> > This will fulfill the cap hit/mis metric stuff per-superblock,
> > it will count the hit/mis counters based each inode, and if one
> > inode's 'issued & ~revoking == mask' will mean a hit, or a miss.
> >
> > item total miss hit
> > -------------------------------------------------
> > caps 295 107 4119
> >
> > URL: https://tracker.ceph.com/issues/43215
> > Signed-off-by: Xiubo Li <xiubli@redhat.com>
> > ---
> > fs/ceph/acl.c | 2 +-
> > fs/ceph/caps.c | 19 +++++++++++++++++++
> > fs/ceph/debugfs.c | 16 ++++++++++++++++
> > fs/ceph/dir.c | 5 +++--
> > fs/ceph/inode.c | 4 ++--
> > fs/ceph/mds_client.c | 26 ++++++++++++++++++++++----
> > fs/ceph/metric.h | 13 +++++++++++++
> > fs/ceph/super.h | 8 +++++---
> > fs/ceph/xattr.c | 4 ++--
> > 9 files changed, 83 insertions(+), 14 deletions(-)
> >
> > diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
> > index 26be652..e046574 100644
> > --- a/fs/ceph/acl.c
> > +++ b/fs/ceph/acl.c
> > @@ -22,7 +22,7 @@ static inline void ceph_set_cached_acl(struct inode *inode,
> > struct ceph_inode_info *ci = ceph_inode(inode);
> >
> > spin_lock(&ci->i_ceph_lock);
> > - if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 0))
> > + if (__ceph_caps_issued_mask_metric(ci, CEPH_CAP_XATTR_SHARED, 0))
> > set_cached_acl(inode, type, acl);
> > else
> > forget_cached_acl(inode, type);
> > diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
> > index 342a32c..efaeb67 100644
> > --- a/fs/ceph/caps.c
> > +++ b/fs/ceph/caps.c
> > @@ -912,6 +912,20 @@ int __ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, int touch)
> > return 0;
> > }
> >
> > +int __ceph_caps_issued_mask_metric(struct ceph_inode_info *ci, int mask,
> > + int touch)
> > +{
> > + struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb);
> > + int r;
> > +
> > + r = __ceph_caps_issued_mask(ci, mask, touch);
> > + if (r)
> > + ceph_update_cap_hit(&fsc->mdsc->metric);
> > + else
> > + ceph_update_cap_mis(&fsc->mdsc->metric);
> > + return r;
> > +}
> > +
> > /*
> > * Return true if mask caps are currently being revoked by an MDS.
> > */
> > @@ -2680,6 +2694,11 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
> > if (snap_rwsem_locked)
> > up_read(&mdsc->snap_rwsem);
> >
> > + if (!ret)
> > + ceph_update_cap_mis(&mdsc->metric);
>
> Should a negative error code here also mean a miss?
>
> > + else if (ret == 1)
> > + ceph_update_cap_hit(&mdsc->metric);
> > +
> > dout("get_cap_refs %p ret %d got %s\n", inode,
> > ret, ceph_cap_string(*got));
> > return ret;
Here's what I'd propose on top. If this looks ok, then I can just fold
this patch into yours before merging. No need to resend just for this.
----------------8<----------------
[PATCH] SQUASH: count negative error code as miss in try_get_cap_refs
Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
fs/ceph/caps.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index efaeb67d584c..3be928782b45 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -2694,9 +2694,9 @@ static int try_get_cap_refs(struct inode *inode,
int need, int want,
if (snap_rwsem_locked)
up_read(&mdsc->snap_rwsem);
- if (!ret)
+ if (ret <= 0)
ceph_update_cap_mis(&mdsc->metric);
- else if (ret == 1)
+ else
ceph_update_cap_hit(&mdsc->metric);
dout("get_cap_refs %p ret %d got %s\n", inode,
--
2.24.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v9 0/5] ceph: add perf metrics support
2020-03-09 7:37 [PATCH v9 0/5] ceph: add perf metrics support xiubli
` (4 preceding siblings ...)
2020-03-09 7:37 ` [PATCH v9 5/5] ceph: add global metadata perf " xiubli
@ 2020-03-09 12:09 ` Jeff Layton
2020-03-09 12:35 ` Xiubo Li
5 siblings, 1 reply; 14+ messages in thread
From: Jeff Layton @ 2020-03-09 12:09 UTC (permalink / raw)
To: xiubli, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel
On Mon, 2020-03-09 at 03:37 -0400, xiubli@redhat.com wrote:
> From: Xiubo Li <xiubli@redhat.com>
>
> Changed in V9:
> - add an r_ended field to the mds request struct and use that to calculate the metric
> - fix some commit comments
>
> We can get the metrics from the debugfs:
>
> $ cat /sys/kernel/debug/ceph/0c93a60d-5645-4c46-8568-4c8f63db4c7f.client4267/metrics
> item total sum_lat(us) avg_lat(us)
> -----------------------------------------------------
> read 13 417000 32076
> write 42 131205000 3123928
> metadata 104 493000 4740
>
> item total miss hit
> -------------------------------------------------
> d_lease 204 0 918
> caps 204 213 368218
>
Thanks Xiubo! This looks good. One minor issue with the cap patch, but I
can just fix that up before merging if you're ok with my proposed
change.
Beyond this...while average latency is a good metric, it's often not
enough to help diagnose problems. I wonder if we ought to be at least
tracking min/max latency for all calls too. I wonder if there's way to
track standard deviation too? That would be really nice to have.
Cheers,
--
Jeff Layton <jlayton@kernel.org>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v9 2/5] ceph: add caps perf metric for each session
2020-03-09 11:51 ` Jeff Layton
2020-03-09 12:05 ` Jeff Layton
@ 2020-03-09 12:26 ` Xiubo Li
1 sibling, 0 replies; 14+ messages in thread
From: Xiubo Li @ 2020-03-09 12:26 UTC (permalink / raw)
To: Jeff Layton, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel
On 2020/3/9 19:51, Jeff Layton wrote:
> On Mon, 2020-03-09 at 03:37 -0400, xiubli@redhat.com wrote:
>> From: Xiubo Li <xiubli@redhat.com>
>>
>> This will fulfill the cap hit/mis metric stuff per-superblock,
>> it will count the hit/mis counters based each inode, and if one
>> inode's 'issued & ~revoking == mask' will mean a hit, or a miss.
>>
>> item total miss hit
>> -------------------------------------------------
>> caps 295 107 4119
>>
>> URL: https://tracker.ceph.com/issues/43215
>> Signed-off-by: Xiubo Li <xiubli@redhat.com>
>> ---
>> fs/ceph/acl.c | 2 +-
>> fs/ceph/caps.c | 19 +++++++++++++++++++
>> fs/ceph/debugfs.c | 16 ++++++++++++++++
>> fs/ceph/dir.c | 5 +++--
>> fs/ceph/inode.c | 4 ++--
>> fs/ceph/mds_client.c | 26 ++++++++++++++++++++++----
>> fs/ceph/metric.h | 13 +++++++++++++
>> fs/ceph/super.h | 8 +++++---
>> fs/ceph/xattr.c | 4 ++--
>> 9 files changed, 83 insertions(+), 14 deletions(-)
>>
>> diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
>> index 26be652..e046574 100644
>> --- a/fs/ceph/acl.c
>> +++ b/fs/ceph/acl.c
>> @@ -22,7 +22,7 @@ static inline void ceph_set_cached_acl(struct inode *inode,
>> struct ceph_inode_info *ci = ceph_inode(inode);
>>
>> spin_lock(&ci->i_ceph_lock);
>> - if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 0))
>> + if (__ceph_caps_issued_mask_metric(ci, CEPH_CAP_XATTR_SHARED, 0))
>> set_cached_acl(inode, type, acl);
>> else
>> forget_cached_acl(inode, type);
>> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
>> index 342a32c..efaeb67 100644
>> --- a/fs/ceph/caps.c
>> +++ b/fs/ceph/caps.c
>> @@ -912,6 +912,20 @@ int __ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, int touch)
>> return 0;
>> }
>>
>> +int __ceph_caps_issued_mask_metric(struct ceph_inode_info *ci, int mask,
>> + int touch)
>> +{
>> + struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb);
>> + int r;
>> +
>> + r = __ceph_caps_issued_mask(ci, mask, touch);
>> + if (r)
>> + ceph_update_cap_hit(&fsc->mdsc->metric);
>> + else
>> + ceph_update_cap_mis(&fsc->mdsc->metric);
>> + return r;
>> +}
>> +
>> /*
>> * Return true if mask caps are currently being revoked by an MDS.
>> */
>> @@ -2680,6 +2694,11 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
>> if (snap_rwsem_locked)
>> up_read(&mdsc->snap_rwsem);
>>
>> + if (!ret)
>> + ceph_update_cap_mis(&mdsc->metric);
> Should a negative error code here also mean a miss?
A negative error code could also from the case that if have & need ==
need, but it may fail with ret = -EAGAIN.
Or maybe could we just move this to :
if ((have & need) == need){
hit()
} else {
miss()
}
Thanks
BRs
>> + else if (ret == 1)
>> + ceph_update_cap_hit(&mdsc->metric);
>> +
>> dout("get_cap_refs %p ret %d got %s\n", inode,
>> ret, ceph_cap_string(*got));
>> return ret;
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v9 0/5] ceph: add perf metrics support
2020-03-09 12:09 ` [PATCH v9 0/5] ceph: add perf metrics support Jeff Layton
@ 2020-03-09 12:35 ` Xiubo Li
0 siblings, 0 replies; 14+ messages in thread
From: Xiubo Li @ 2020-03-09 12:35 UTC (permalink / raw)
To: Jeff Layton, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel
On 2020/3/9 20:09, Jeff Layton wrote:
> On Mon, 2020-03-09 at 03:37 -0400, xiubli@redhat.com wrote:
>> From: Xiubo Li <xiubli@redhat.com>
>>
>> Changed in V9:
>> - add an r_ended field to the mds request struct and use that to calculate the metric
>> - fix some commit comments
>>
>> We can get the metrics from the debugfs:
>>
>> $ cat /sys/kernel/debug/ceph/0c93a60d-5645-4c46-8568-4c8f63db4c7f.client4267/metrics
>> item total sum_lat(us) avg_lat(us)
>> -----------------------------------------------------
>> read 13 417000 32076
>> write 42 131205000 3123928
>> metadata 104 493000 4740
>>
>> item total miss hit
>> -------------------------------------------------
>> d_lease 204 0 918
>> caps 204 213 368218
>>
> Thanks Xiubo! This looks good. One minor issue with the cap patch, but I
> can just fix that up before merging if you're ok with my proposed
> change.
>
> Beyond this...while average latency is a good metric, it's often not
> enough to help diagnose problems. I wonder if we ought to be at least
> tracking min/max latency for all calls too. I wonder if there's way to
> track standard deviation too? That would be really nice to have.
yeah, the min/max latencies here make sense, it is on my todo list and I
will do it after this patch series.
And for the standard deviation I will try to have a investigate of it.
Thanks
> Cheers,
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v9 2/5] ceph: add caps perf metric for each session
2020-03-09 12:05 ` Jeff Layton
@ 2020-03-09 12:36 ` Xiubo Li
2020-03-09 18:22 ` Jeff Layton
0 siblings, 1 reply; 14+ messages in thread
From: Xiubo Li @ 2020-03-09 12:36 UTC (permalink / raw)
To: Jeff Layton, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel
On 2020/3/9 20:05, Jeff Layton wrote:
> On Mon, 2020-03-09 at 07:51 -0400, Jeff Layton wrote:
>> On Mon, 2020-03-09 at 03:37 -0400, xiubli@redhat.com wrote:
>>> From: Xiubo Li <xiubli@redhat.com>
>>>
>>> This will fulfill the cap hit/mis metric stuff per-superblock,
>>> it will count the hit/mis counters based each inode, and if one
>>> inode's 'issued & ~revoking == mask' will mean a hit, or a miss.
>>>
>>> item total miss hit
>>> -------------------------------------------------
>>> caps 295 107 4119
>>>
>>> URL: https://tracker.ceph.com/issues/43215
>>> Signed-off-by: Xiubo Li <xiubli@redhat.com>
>>> ---
>>> fs/ceph/acl.c | 2 +-
>>> fs/ceph/caps.c | 19 +++++++++++++++++++
>>> fs/ceph/debugfs.c | 16 ++++++++++++++++
>>> fs/ceph/dir.c | 5 +++--
>>> fs/ceph/inode.c | 4 ++--
>>> fs/ceph/mds_client.c | 26 ++++++++++++++++++++++----
>>> fs/ceph/metric.h | 13 +++++++++++++
>>> fs/ceph/super.h | 8 +++++---
>>> fs/ceph/xattr.c | 4 ++--
>>> 9 files changed, 83 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
>>> index 26be652..e046574 100644
>>> --- a/fs/ceph/acl.c
>>> +++ b/fs/ceph/acl.c
>>> @@ -22,7 +22,7 @@ static inline void ceph_set_cached_acl(struct inode *inode,
>>> struct ceph_inode_info *ci = ceph_inode(inode);
>>>
>>> spin_lock(&ci->i_ceph_lock);
>>> - if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 0))
>>> + if (__ceph_caps_issued_mask_metric(ci, CEPH_CAP_XATTR_SHARED, 0))
>>> set_cached_acl(inode, type, acl);
>>> else
>>> forget_cached_acl(inode, type);
>>> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
>>> index 342a32c..efaeb67 100644
>>> --- a/fs/ceph/caps.c
>>> +++ b/fs/ceph/caps.c
>>> @@ -912,6 +912,20 @@ int __ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, int touch)
>>> return 0;
>>> }
>>>
>>> +int __ceph_caps_issued_mask_metric(struct ceph_inode_info *ci, int mask,
>>> + int touch)
>>> +{
>>> + struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb);
>>> + int r;
>>> +
>>> + r = __ceph_caps_issued_mask(ci, mask, touch);
>>> + if (r)
>>> + ceph_update_cap_hit(&fsc->mdsc->metric);
>>> + else
>>> + ceph_update_cap_mis(&fsc->mdsc->metric);
>>> + return r;
>>> +}
>>> +
>>> /*
>>> * Return true if mask caps are currently being revoked by an MDS.
>>> */
>>> @@ -2680,6 +2694,11 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
>>> if (snap_rwsem_locked)
>>> up_read(&mdsc->snap_rwsem);
>>>
>>> + if (!ret)
>>> + ceph_update_cap_mis(&mdsc->metric);
>> Should a negative error code here also mean a miss?
>>
>>> + else if (ret == 1)
>>> + ceph_update_cap_hit(&mdsc->metric);
>>> +
>>> dout("get_cap_refs %p ret %d got %s\n", inode,
>>> ret, ceph_cap_string(*got));
>>> return ret;
> Here's what I'd propose on top. If this looks ok, then I can just fold
> this patch into yours before merging. No need to resend just for this.
>
> ----------------8<----------------
>
> [PATCH] SQUASH: count negative error code as miss in try_get_cap_refs
>
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
> fs/ceph/caps.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
> index efaeb67d584c..3be928782b45 100644
> --- a/fs/ceph/caps.c
> +++ b/fs/ceph/caps.c
> @@ -2694,9 +2694,9 @@ static int try_get_cap_refs(struct inode *inode,
> int need, int want,
> if (snap_rwsem_locked)
> up_read(&mdsc->snap_rwsem);
>
> - if (!ret)
> + if (ret <= 0)
> ceph_update_cap_mis(&mdsc->metric);
> - else if (ret == 1)
> + else
> ceph_update_cap_hit(&mdsc->metric);
>
> dout("get_cap_refs %p ret %d got %s\n", inode,
For the try_get_cap_refs(), maybe this is the correct approach to count
hit/miss as the function comments.
Thanks
Brs
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v9 2/5] ceph: add caps perf metric for each session
2020-03-09 12:36 ` Xiubo Li
@ 2020-03-09 18:22 ` Jeff Layton
2020-03-10 0:25 ` Xiubo Li
0 siblings, 1 reply; 14+ messages in thread
From: Jeff Layton @ 2020-03-09 18:22 UTC (permalink / raw)
To: Xiubo Li, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel
On Mon, 2020-03-09 at 20:36 +0800, Xiubo Li wrote:
> On 2020/3/9 20:05, Jeff Layton wrote:
> > On Mon, 2020-03-09 at 07:51 -0400, Jeff Layton wrote:
> > > On Mon, 2020-03-09 at 03:37 -0400, xiubli@redhat.com wrote:
> > > > From: Xiubo Li <xiubli@redhat.com>
> > > >
> > > > This will fulfill the cap hit/mis metric stuff per-superblock,
> > > > it will count the hit/mis counters based each inode, and if one
> > > > inode's 'issued & ~revoking == mask' will mean a hit, or a miss.
> > > >
> > > > item total miss hit
> > > > -------------------------------------------------
> > > > caps 295 107 4119
> > > >
> > > > URL: https://tracker.ceph.com/issues/43215
> > > > Signed-off-by: Xiubo Li <xiubli@redhat.com>
> > > > ---
> > > > fs/ceph/acl.c | 2 +-
> > > > fs/ceph/caps.c | 19 +++++++++++++++++++
> > > > fs/ceph/debugfs.c | 16 ++++++++++++++++
> > > > fs/ceph/dir.c | 5 +++--
> > > > fs/ceph/inode.c | 4 ++--
> > > > fs/ceph/mds_client.c | 26 ++++++++++++++++++++++----
> > > > fs/ceph/metric.h | 13 +++++++++++++
> > > > fs/ceph/super.h | 8 +++++---
> > > > fs/ceph/xattr.c | 4 ++--
> > > > 9 files changed, 83 insertions(+), 14 deletions(-)
> > > >
> > > > diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
> > > > index 26be652..e046574 100644
> > > > --- a/fs/ceph/acl.c
> > > > +++ b/fs/ceph/acl.c
> > > > @@ -22,7 +22,7 @@ static inline void ceph_set_cached_acl(struct inode *inode,
> > > > struct ceph_inode_info *ci = ceph_inode(inode);
> > > >
> > > > spin_lock(&ci->i_ceph_lock);
> > > > - if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 0))
> > > > + if (__ceph_caps_issued_mask_metric(ci, CEPH_CAP_XATTR_SHARED, 0))
> > > > set_cached_acl(inode, type, acl);
> > > > else
> > > > forget_cached_acl(inode, type);
> > > > diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
> > > > index 342a32c..efaeb67 100644
> > > > --- a/fs/ceph/caps.c
> > > > +++ b/fs/ceph/caps.c
> > > > @@ -912,6 +912,20 @@ int __ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, int touch)
> > > > return 0;
> > > > }
> > > >
> > > > +int __ceph_caps_issued_mask_metric(struct ceph_inode_info *ci, int mask,
> > > > + int touch)
> > > > +{
> > > > + struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb);
> > > > + int r;
> > > > +
> > > > + r = __ceph_caps_issued_mask(ci, mask, touch);
> > > > + if (r)
> > > > + ceph_update_cap_hit(&fsc->mdsc->metric);
> > > > + else
> > > > + ceph_update_cap_mis(&fsc->mdsc->metric);
> > > > + return r;
> > > > +}
> > > > +
> > > > /*
> > > > * Return true if mask caps are currently being revoked by an MDS.
> > > > */
> > > > @@ -2680,6 +2694,11 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
> > > > if (snap_rwsem_locked)
> > > > up_read(&mdsc->snap_rwsem);
> > > >
> > > > + if (!ret)
> > > > + ceph_update_cap_mis(&mdsc->metric);
> > > Should a negative error code here also mean a miss?
> > >
> > > > + else if (ret == 1)
> > > > + ceph_update_cap_hit(&mdsc->metric);
> > > > +
> > > > dout("get_cap_refs %p ret %d got %s\n", inode,
> > > > ret, ceph_cap_string(*got));
> > > > return ret;
> > Here's what I'd propose on top. If this looks ok, then I can just fold
> > this patch into yours before merging. No need to resend just for this.
> >
> > ----------------8<----------------
> >
> > [PATCH] SQUASH: count negative error code as miss in try_get_cap_refs
> >
> > Signed-off-by: Jeff Layton <jlayton@kernel.org>
> > ---
> > fs/ceph/caps.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
> > index efaeb67d584c..3be928782b45 100644
> > --- a/fs/ceph/caps.c
> > +++ b/fs/ceph/caps.c
> > @@ -2694,9 +2694,9 @@ static int try_get_cap_refs(struct inode *inode,
> > int need, int want,
> > if (snap_rwsem_locked)
> > up_read(&mdsc->snap_rwsem);
> >
> > - if (!ret)
> > + if (ret <= 0)
> > ceph_update_cap_mis(&mdsc->metric);
> > - else if (ret == 1)
> > + else
> > ceph_update_cap_hit(&mdsc->metric);
> >
> > dout("get_cap_refs %p ret %d got %s\n", inode,
>
> For the try_get_cap_refs(), maybe this is the correct approach to count
> hit/miss as the function comments.
>
I decided to just merge your patches as-is. Given that those are error
conditions, and some of them may occur before we ever check the caps, I
think we should just opt to not count those cases.
I did clean up the changelogs a bit, so please have a look and let me
know if they look ok to you.
Thanks!
--
Jeff Layton <jlayton@kernel.org>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v9 2/5] ceph: add caps perf metric for each session
2020-03-09 18:22 ` Jeff Layton
@ 2020-03-10 0:25 ` Xiubo Li
0 siblings, 0 replies; 14+ messages in thread
From: Xiubo Li @ 2020-03-10 0:25 UTC (permalink / raw)
To: Jeff Layton, idryomov; +Cc: sage, zyan, pdonnell, ceph-devel
On 2020/3/10 2:22, Jeff Layton wrote:
> On Mon, 2020-03-09 at 20:36 +0800, Xiubo Li wrote:
>> On 2020/3/9 20:05, Jeff Layton wrote:
>>> On Mon, 2020-03-09 at 07:51 -0400, Jeff Layton wrote:
>>>> On Mon, 2020-03-09 at 03:37 -0400, xiubli@redhat.com wrote:
>>>>> From: Xiubo Li <xiubli@redhat.com>
>>>>>
>>>>> This will fulfill the cap hit/mis metric stuff per-superblock,
>>>>> it will count the hit/mis counters based each inode, and if one
>>>>> inode's 'issued & ~revoking == mask' will mean a hit, or a miss.
>>>>>
>>>>> item total miss hit
>>>>> -------------------------------------------------
>>>>> caps 295 107 4119
>>>>>
>>>>> URL: https://tracker.ceph.com/issues/43215
>>>>> Signed-off-by: Xiubo Li <xiubli@redhat.com>
>>>>> ---
>>>>> fs/ceph/acl.c | 2 +-
>>>>> fs/ceph/caps.c | 19 +++++++++++++++++++
>>>>> fs/ceph/debugfs.c | 16 ++++++++++++++++
>>>>> fs/ceph/dir.c | 5 +++--
>>>>> fs/ceph/inode.c | 4 ++--
>>>>> fs/ceph/mds_client.c | 26 ++++++++++++++++++++++----
>>>>> fs/ceph/metric.h | 13 +++++++++++++
>>>>> fs/ceph/super.h | 8 +++++---
>>>>> fs/ceph/xattr.c | 4 ++--
>>>>> 9 files changed, 83 insertions(+), 14 deletions(-)
>>>>>
>>>>> diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
>>>>> index 26be652..e046574 100644
>>>>> --- a/fs/ceph/acl.c
>>>>> +++ b/fs/ceph/acl.c
>>>>> @@ -22,7 +22,7 @@ static inline void ceph_set_cached_acl(struct inode *inode,
>>>>> struct ceph_inode_info *ci = ceph_inode(inode);
>>>>>
>>>>> spin_lock(&ci->i_ceph_lock);
>>>>> - if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 0))
>>>>> + if (__ceph_caps_issued_mask_metric(ci, CEPH_CAP_XATTR_SHARED, 0))
>>>>> set_cached_acl(inode, type, acl);
>>>>> else
>>>>> forget_cached_acl(inode, type);
>>>>> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
>>>>> index 342a32c..efaeb67 100644
>>>>> --- a/fs/ceph/caps.c
>>>>> +++ b/fs/ceph/caps.c
>>>>> @@ -912,6 +912,20 @@ int __ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, int touch)
>>>>> return 0;
>>>>> }
>>>>>
>>>>> +int __ceph_caps_issued_mask_metric(struct ceph_inode_info *ci, int mask,
>>>>> + int touch)
>>>>> +{
>>>>> + struct ceph_fs_client *fsc = ceph_sb_to_client(ci->vfs_inode.i_sb);
>>>>> + int r;
>>>>> +
>>>>> + r = __ceph_caps_issued_mask(ci, mask, touch);
>>>>> + if (r)
>>>>> + ceph_update_cap_hit(&fsc->mdsc->metric);
>>>>> + else
>>>>> + ceph_update_cap_mis(&fsc->mdsc->metric);
>>>>> + return r;
>>>>> +}
>>>>> +
>>>>> /*
>>>>> * Return true if mask caps are currently being revoked by an MDS.
>>>>> */
>>>>> @@ -2680,6 +2694,11 @@ static int try_get_cap_refs(struct inode *inode, int need, int want,
>>>>> if (snap_rwsem_locked)
>>>>> up_read(&mdsc->snap_rwsem);
>>>>>
>>>>> + if (!ret)
>>>>> + ceph_update_cap_mis(&mdsc->metric);
>>>> Should a negative error code here also mean a miss?
>>>>
>>>>> + else if (ret == 1)
>>>>> + ceph_update_cap_hit(&mdsc->metric);
>>>>> +
>>>>> dout("get_cap_refs %p ret %d got %s\n", inode,
>>>>> ret, ceph_cap_string(*got));
>>>>> return ret;
>>> Here's what I'd propose on top. If this looks ok, then I can just fold
>>> this patch into yours before merging. No need to resend just for this.
>>>
>>> ----------------8<----------------
>>>
>>> [PATCH] SQUASH: count negative error code as miss in try_get_cap_refs
>>>
>>> Signed-off-by: Jeff Layton <jlayton@kernel.org>
>>> ---
>>> fs/ceph/caps.c | 4 ++--
>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
>>> index efaeb67d584c..3be928782b45 100644
>>> --- a/fs/ceph/caps.c
>>> +++ b/fs/ceph/caps.c
>>> @@ -2694,9 +2694,9 @@ static int try_get_cap_refs(struct inode *inode,
>>> int need, int want,
>>> if (snap_rwsem_locked)
>>> up_read(&mdsc->snap_rwsem);
>>>
>>> - if (!ret)
>>> + if (ret <= 0)
>>> ceph_update_cap_mis(&mdsc->metric);
>>> - else if (ret == 1)
>>> + else
>>> ceph_update_cap_hit(&mdsc->metric);
>>>
>>> dout("get_cap_refs %p ret %d got %s\n", inode,
>> For the try_get_cap_refs(), maybe this is the correct approach to count
>> hit/miss as the function comments.
>>
> I decided to just merge your patches as-is. Given that those are error
> conditions, and some of them may occur before we ever check the caps, I
> think we should just opt to not count those cases.
>
> I did clean up the changelogs a bit, so please have a look and let me
> know if they look ok to you.
Cool, it looks nice to me.
Thanks Jeff.
BRs
> Thanks!
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2020-03-10 0:26 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-09 7:37 [PATCH v9 0/5] ceph: add perf metrics support xiubli
2020-03-09 7:37 ` [PATCH v9 1/5] ceph: add global dentry lease metric support xiubli
2020-03-09 7:37 ` [PATCH v9 2/5] ceph: add caps perf metric for each session xiubli
2020-03-09 11:51 ` Jeff Layton
2020-03-09 12:05 ` Jeff Layton
2020-03-09 12:36 ` Xiubo Li
2020-03-09 18:22 ` Jeff Layton
2020-03-10 0:25 ` Xiubo Li
2020-03-09 12:26 ` Xiubo Li
2020-03-09 7:37 ` [PATCH v9 3/5] ceph: add global read latency metric support xiubli
2020-03-09 7:37 ` [PATCH v9 4/5] ceph: add global write " xiubli
2020-03-09 7:37 ` [PATCH v9 5/5] ceph: add global metadata perf " xiubli
2020-03-09 12:09 ` [PATCH v9 0/5] ceph: add perf metrics support Jeff Layton
2020-03-09 12:35 ` Xiubo Li
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.