xref: /linux/fs/ceph/metric.h (revision 54d7b821)
1f9009efaSXiubo Li /* SPDX-License-Identifier: GPL-2.0 */
2f9009efaSXiubo Li #ifndef _FS_CEPH_MDS_METRIC_H
3f9009efaSXiubo Li #define _FS_CEPH_MDS_METRIC_H
4f9009efaSXiubo Li 
58d728c76SVenky Shankar #include <linux/ceph/types.h>
6f9009efaSXiubo Li #include <linux/percpu_counter.h>
797e27aaaSXiubo Li #include <linux/ktime.h>
8f9009efaSXiubo Li 
918f473b3SXiubo Li extern bool disable_send_metrics;
1018f473b3SXiubo Li 
1118f473b3SXiubo Li enum ceph_metric_type {
1218f473b3SXiubo Li 	CLIENT_METRIC_TYPE_CAP_INFO,
1318f473b3SXiubo Li 	CLIENT_METRIC_TYPE_READ_LATENCY,
1418f473b3SXiubo Li 	CLIENT_METRIC_TYPE_WRITE_LATENCY,
1518f473b3SXiubo Li 	CLIENT_METRIC_TYPE_METADATA_LATENCY,
1618f473b3SXiubo Li 	CLIENT_METRIC_TYPE_DENTRY_LEASE,
173d8b6987SXiubo Li 	CLIENT_METRIC_TYPE_OPENED_FILES,
183d8b6987SXiubo Li 	CLIENT_METRIC_TYPE_PINNED_ICAPS,
193d8b6987SXiubo Li 	CLIENT_METRIC_TYPE_OPENED_INODES,
20903f4fecSXiubo Li 	CLIENT_METRIC_TYPE_READ_IO_SIZES,
21903f4fecSXiubo Li 	CLIENT_METRIC_TYPE_WRITE_IO_SIZES,
2254d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_AVG_READ_LATENCY,
2354d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_STDEV_READ_LATENCY,
2454d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_AVG_WRITE_LATENCY,
2554d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_STDEV_WRITE_LATENCY,
2654d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_AVG_METADATA_LATENCY,
2754d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY,
2818f473b3SXiubo Li 
2954d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_MAX = CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY,
3018f473b3SXiubo Li };
3118f473b3SXiubo Li 
323b4168ddSXiubo Li /*
333b4168ddSXiubo Li  * This will always have the highest metric bit value
343b4168ddSXiubo Li  * as the last element of the array.
353b4168ddSXiubo Li  */
363b4168ddSXiubo Li #define CEPHFS_METRIC_SPEC_CLIENT_SUPPORTED {	   \
373b4168ddSXiubo Li 	CLIENT_METRIC_TYPE_CAP_INFO,		   \
383b4168ddSXiubo Li 	CLIENT_METRIC_TYPE_READ_LATENCY,	   \
393b4168ddSXiubo Li 	CLIENT_METRIC_TYPE_WRITE_LATENCY,	   \
403b4168ddSXiubo Li 	CLIENT_METRIC_TYPE_METADATA_LATENCY,	   \
418ba3b8c7SXiubo Li 	CLIENT_METRIC_TYPE_DENTRY_LEASE,	   \
423d8b6987SXiubo Li 	CLIENT_METRIC_TYPE_OPENED_FILES,	   \
433d8b6987SXiubo Li 	CLIENT_METRIC_TYPE_PINNED_ICAPS,	   \
443d8b6987SXiubo Li 	CLIENT_METRIC_TYPE_OPENED_INODES,	   \
45903f4fecSXiubo Li 	CLIENT_METRIC_TYPE_READ_IO_SIZES,	   \
46903f4fecSXiubo Li 	CLIENT_METRIC_TYPE_WRITE_IO_SIZES,	   \
4754d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_AVG_READ_LATENCY,	   \
4854d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_STDEV_READ_LATENCY,	   \
4954d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_AVG_WRITE_LATENCY,	   \
5054d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_STDEV_WRITE_LATENCY,	   \
5154d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_AVG_METADATA_LATENCY,   \
5254d7b821SVenky Shankar 	CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY, \
533b4168ddSXiubo Li 						   \
543b4168ddSXiubo Li 	CLIENT_METRIC_TYPE_MAX,			   \
553b4168ddSXiubo Li }
563b4168ddSXiubo Li 
578ecd34c7SXiubo Li struct ceph_metric_header {
5818f473b3SXiubo Li 	__le32 type;     /* ceph metric type */
5918f473b3SXiubo Li 	__u8  ver;
6018f473b3SXiubo Li 	__u8  compat;
6118f473b3SXiubo Li 	__le32 data_len; /* length of sizeof(hit + mis + total) */
628ecd34c7SXiubo Li } __packed;
638ecd34c7SXiubo Li 
648ecd34c7SXiubo Li /* metric caps header */
658ecd34c7SXiubo Li struct ceph_metric_cap {
668ecd34c7SXiubo Li 	struct ceph_metric_header header;
6718f473b3SXiubo Li 	__le64 hit;
6818f473b3SXiubo Li 	__le64 mis;
6918f473b3SXiubo Li 	__le64 total;
7018f473b3SXiubo Li } __packed;
7118f473b3SXiubo Li 
7218f473b3SXiubo Li /* metric read latency header */
7318f473b3SXiubo Li struct ceph_metric_read_latency {
748ecd34c7SXiubo Li 	struct ceph_metric_header header;
758d728c76SVenky Shankar 	struct ceph_timespec lat;
7654d7b821SVenky Shankar 	struct ceph_timespec avg;
7754d7b821SVenky Shankar 	__le64 sq_sum;
7854d7b821SVenky Shankar 	__le64 count;
7918f473b3SXiubo Li } __packed;
8018f473b3SXiubo Li 
8118f473b3SXiubo Li /* metric write latency header */
8218f473b3SXiubo Li struct ceph_metric_write_latency {
838ecd34c7SXiubo Li 	struct ceph_metric_header header;
848d728c76SVenky Shankar 	struct ceph_timespec lat;
8554d7b821SVenky Shankar 	struct ceph_timespec avg;
8654d7b821SVenky Shankar 	__le64 sq_sum;
8754d7b821SVenky Shankar 	__le64 count;
8818f473b3SXiubo Li } __packed;
8918f473b3SXiubo Li 
9018f473b3SXiubo Li /* metric metadata latency header */
9118f473b3SXiubo Li struct ceph_metric_metadata_latency {
928ecd34c7SXiubo Li 	struct ceph_metric_header header;
938d728c76SVenky Shankar 	struct ceph_timespec lat;
9454d7b821SVenky Shankar 	struct ceph_timespec avg;
9554d7b821SVenky Shankar 	__le64 sq_sum;
9654d7b821SVenky Shankar 	__le64 count;
9718f473b3SXiubo Li } __packed;
9818f473b3SXiubo Li 
998ba3b8c7SXiubo Li /* metric dentry lease header */
1008ba3b8c7SXiubo Li struct ceph_metric_dlease {
1018ecd34c7SXiubo Li 	struct ceph_metric_header header;
1028ba3b8c7SXiubo Li 	__le64 hit;
1038ba3b8c7SXiubo Li 	__le64 mis;
1048ba3b8c7SXiubo Li 	__le64 total;
1058ba3b8c7SXiubo Li } __packed;
1068ba3b8c7SXiubo Li 
1073d8b6987SXiubo Li /* metric opened files header */
1083d8b6987SXiubo Li struct ceph_opened_files {
1098ecd34c7SXiubo Li 	struct ceph_metric_header header;
1103d8b6987SXiubo Li 	__le64 opened_files;
1113d8b6987SXiubo Li 	__le64 total;
1123d8b6987SXiubo Li } __packed;
1133d8b6987SXiubo Li 
1143d8b6987SXiubo Li /* metric pinned i_caps header */
1153d8b6987SXiubo Li struct ceph_pinned_icaps {
1168ecd34c7SXiubo Li 	struct ceph_metric_header header;
1173d8b6987SXiubo Li 	__le64 pinned_icaps;
1183d8b6987SXiubo Li 	__le64 total;
1193d8b6987SXiubo Li } __packed;
1203d8b6987SXiubo Li 
1213d8b6987SXiubo Li /* metric opened inodes header */
1223d8b6987SXiubo Li struct ceph_opened_inodes {
1238ecd34c7SXiubo Li 	struct ceph_metric_header header;
1243d8b6987SXiubo Li 	__le64 opened_inodes;
1253d8b6987SXiubo Li 	__le64 total;
1263d8b6987SXiubo Li } __packed;
1273d8b6987SXiubo Li 
128903f4fecSXiubo Li /* metric read io size header */
129903f4fecSXiubo Li struct ceph_read_io_size {
130903f4fecSXiubo Li 	struct ceph_metric_header header;
131903f4fecSXiubo Li 	__le64 total_ops;
132903f4fecSXiubo Li 	__le64 total_size;
133903f4fecSXiubo Li } __packed;
134903f4fecSXiubo Li 
135903f4fecSXiubo Li /* metric write io size header */
136903f4fecSXiubo Li struct ceph_write_io_size {
137903f4fecSXiubo Li 	struct ceph_metric_header header;
138903f4fecSXiubo Li 	__le64 total_ops;
139903f4fecSXiubo Li 	__le64 total_size;
140903f4fecSXiubo Li } __packed;
141903f4fecSXiubo Li 
14218f473b3SXiubo Li struct ceph_metric_head {
14318f473b3SXiubo Li 	__le32 num;	/* the number of metrics that will be sent */
14418f473b3SXiubo Li } __packed;
14518f473b3SXiubo Li 
14617e9fc9fSLuís Henriques enum metric_type {
14717e9fc9fSLuís Henriques 	METRIC_READ,
14817e9fc9fSLuís Henriques 	METRIC_WRITE,
14917e9fc9fSLuís Henriques 	METRIC_METADATA,
150c02cb7bdSLuís Henriques 	METRIC_COPYFROM,
15117e9fc9fSLuís Henriques 	METRIC_MAX
15217e9fc9fSLuís Henriques };
15317e9fc9fSLuís Henriques 
15417e9fc9fSLuís Henriques struct ceph_metric {
15517e9fc9fSLuís Henriques 	spinlock_t lock;
15617e9fc9fSLuís Henriques 	u64 total;
15717e9fc9fSLuís Henriques 	u64 size_sum;
15817e9fc9fSLuís Henriques 	u64 size_min;
15917e9fc9fSLuís Henriques 	u64 size_max;
16017e9fc9fSLuís Henriques 	ktime_t latency_sum;
161367290e6SVenky Shankar 	ktime_t latency_avg;
16217e9fc9fSLuís Henriques 	ktime_t latency_sq_sum;
16317e9fc9fSLuís Henriques 	ktime_t latency_min;
16417e9fc9fSLuís Henriques 	ktime_t latency_max;
16517e9fc9fSLuís Henriques };
16617e9fc9fSLuís Henriques 
167f9009efaSXiubo Li /* This is the global metrics */
168f9009efaSXiubo Li struct ceph_client_metric {
169f9009efaSXiubo Li 	atomic64_t            total_dentries;
170f9009efaSXiubo Li 	struct percpu_counter d_lease_hit;
171f9009efaSXiubo Li 	struct percpu_counter d_lease_mis;
1721af16d54SXiubo Li 
1734f1d756dSXiubo Li 	atomic64_t            total_caps;
1741af16d54SXiubo Li 	struct percpu_counter i_caps_hit;
1751af16d54SXiubo Li 	struct percpu_counter i_caps_mis;
17697e27aaaSXiubo Li 
17717e9fc9fSLuís Henriques 	struct ceph_metric metric[METRIC_MAX];
17818f473b3SXiubo Li 
1791dd8d470SXiubo Li 	/* The total number of directories and files that are opened */
1801dd8d470SXiubo Li 	atomic64_t opened_files;
1811dd8d470SXiubo Li 
1821dd8d470SXiubo Li 	/* The total number of inodes that have opened files or directories */
1831dd8d470SXiubo Li 	struct percpu_counter opened_inodes;
1841dd8d470SXiubo Li 	struct percpu_counter total_inodes;
1851dd8d470SXiubo Li 
18618f473b3SXiubo Li 	struct ceph_mds_session *session;
18718f473b3SXiubo Li 	struct delayed_work delayed_work;  /* delayed work */
188f9009efaSXiubo Li };
189f9009efaSXiubo Li 
metric_schedule_delayed(struct ceph_client_metric * m)19018f473b3SXiubo Li static inline void metric_schedule_delayed(struct ceph_client_metric *m)
19118f473b3SXiubo Li {
19218f473b3SXiubo Li 	if (disable_send_metrics)
19318f473b3SXiubo Li 		return;
19418f473b3SXiubo Li 
19518f473b3SXiubo Li 	/* per second */
19618f473b3SXiubo Li 	schedule_delayed_work(&m->delayed_work, round_jiffies_relative(HZ));
19718f473b3SXiubo Li }
19818f473b3SXiubo Li 
199f9009efaSXiubo Li extern int ceph_metric_init(struct ceph_client_metric *m);
200f9009efaSXiubo Li extern void ceph_metric_destroy(struct ceph_client_metric *m);
2011af16d54SXiubo Li 
ceph_update_cap_hit(struct ceph_client_metric * m)2021af16d54SXiubo Li static inline void ceph_update_cap_hit(struct ceph_client_metric *m)
2031af16d54SXiubo Li {
2041af16d54SXiubo Li 	percpu_counter_inc(&m->i_caps_hit);
2051af16d54SXiubo Li }
2061af16d54SXiubo Li 
ceph_update_cap_mis(struct ceph_client_metric * m)2071af16d54SXiubo Li static inline void ceph_update_cap_mis(struct ceph_client_metric *m)
2081af16d54SXiubo Li {
2091af16d54SXiubo Li 	percpu_counter_inc(&m->i_caps_mis);
2101af16d54SXiubo Li }
21197e27aaaSXiubo Li 
21217e9fc9fSLuís Henriques extern void ceph_update_metrics(struct ceph_metric *m,
21397e27aaaSXiubo Li 				ktime_t r_start, ktime_t r_end,
214903f4fecSXiubo Li 				unsigned int size, int rc);
21517e9fc9fSLuís Henriques 
ceph_update_read_metrics(struct ceph_client_metric * m,ktime_t r_start,ktime_t r_end,unsigned int size,int rc)21617e9fc9fSLuís Henriques static inline void ceph_update_read_metrics(struct ceph_client_metric *m,
21797e27aaaSXiubo Li 					    ktime_t r_start, ktime_t r_end,
21817e9fc9fSLuís Henriques 					    unsigned int size, int rc)
21917e9fc9fSLuís Henriques {
22017e9fc9fSLuís Henriques 	ceph_update_metrics(&m->metric[METRIC_READ],
22117e9fc9fSLuís Henriques 			    r_start, r_end, size, rc);
22217e9fc9fSLuís Henriques }
ceph_update_write_metrics(struct ceph_client_metric * m,ktime_t r_start,ktime_t r_end,unsigned int size,int rc)22317e9fc9fSLuís Henriques static inline void ceph_update_write_metrics(struct ceph_client_metric *m,
22470c94820SXiubo Li 					     ktime_t r_start, ktime_t r_end,
22517e9fc9fSLuís Henriques 					     unsigned int size, int rc)
22617e9fc9fSLuís Henriques {
22717e9fc9fSLuís Henriques 	ceph_update_metrics(&m->metric[METRIC_WRITE],
22817e9fc9fSLuís Henriques 			    r_start, r_end, size, rc);
22917e9fc9fSLuís Henriques }
ceph_update_metadata_metrics(struct ceph_client_metric * m,ktime_t r_start,ktime_t r_end,int rc)23017e9fc9fSLuís Henriques static inline void ceph_update_metadata_metrics(struct ceph_client_metric *m,
23117e9fc9fSLuís Henriques 						ktime_t r_start, ktime_t r_end,
23217e9fc9fSLuís Henriques 						int rc)
23317e9fc9fSLuís Henriques {
23417e9fc9fSLuís Henriques 	ceph_update_metrics(&m->metric[METRIC_METADATA],
23517e9fc9fSLuís Henriques 			    r_start, r_end, 0, rc);
23617e9fc9fSLuís Henriques }
ceph_update_copyfrom_metrics(struct ceph_client_metric * m,ktime_t r_start,ktime_t r_end,unsigned int size,int rc)237c02cb7bdSLuís Henriques static inline void ceph_update_copyfrom_metrics(struct ceph_client_metric *m,
238c02cb7bdSLuís Henriques 						ktime_t r_start, ktime_t r_end,
239c02cb7bdSLuís Henriques 						unsigned int size, int rc)
240c02cb7bdSLuís Henriques {
241c02cb7bdSLuís Henriques 	ceph_update_metrics(&m->metric[METRIC_COPYFROM],
242c02cb7bdSLuís Henriques 			    r_start, r_end, size, rc);
243c02cb7bdSLuís Henriques }
244f9009efaSXiubo Li #endif /* _FS_CEPH_MDS_METRIC_H */
245