Greg Kroah-Hartman | b244131 | 2017-11-01 15:07:57 +0100 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
Chuck Lever | 11c556b | 2006-03-20 13:44:22 -0500 | [diff] [blame] | 2 | /* |
| 3 | * linux/include/linux/sunrpc/metrics.h |
| 4 | * |
| 5 | * Declarations for RPC client per-operation metrics |
| 6 | * |
| 7 | * Copyright (C) 2005 Chuck Lever <cel@netapp.com> |
| 8 | * |
| 9 | * RPC client per-operation statistics provide latency and retry |
| 10 | * information about each type of RPC procedure in a given RPC program. |
| 11 | * These statistics are not for detailed problem diagnosis, but simply |
| 12 | * to indicate whether the problem is local or remote. |
| 13 | * |
| 14 | * These counters are not meant to be human-readable, but are meant to be |
| 15 | * integrated into system monitoring tools such as "sar" and "iostat". As |
| 16 | * such, the counters are sampled by the tools over time, and are never |
| 17 | * zeroed after a file system is mounted. Moving averages can be computed |
| 18 | * by the tools by taking the difference between two instantaneous samples |
| 19 | * and dividing that by the time between the samples. |
| 20 | * |
| 21 | * The counters are maintained in a single array per RPC client, indexed |
| 22 | * by procedure number. There is no need to maintain separate counter |
| 23 | * arrays per-CPU because these counters are always modified behind locks. |
| 24 | */ |
| 25 | |
| 26 | #ifndef _LINUX_SUNRPC_METRICS_H |
| 27 | #define _LINUX_SUNRPC_METRICS_H |
| 28 | |
| 29 | #include <linux/seq_file.h> |
Chuck Lever | ff83997 | 2010-05-07 13:34:47 -0400 | [diff] [blame] | 30 | #include <linux/ktime.h> |
Chuck Lever | edef129 | 2014-11-08 20:15:09 -0500 | [diff] [blame] | 31 | #include <linux/spinlock.h> |
Chuck Lever | 11c556b | 2006-03-20 13:44:22 -0500 | [diff] [blame] | 32 | |
Dave Wysochanski | a332518 | 2019-05-23 16:13:50 -0400 | [diff] [blame] | 33 | #define RPC_IOSTATS_VERS "1.1" |
Chuck Lever | 11c556b | 2006-03-20 13:44:22 -0500 | [diff] [blame] | 34 | |
| 35 | struct rpc_iostats { |
Chuck Lever | edef129 | 2014-11-08 20:15:09 -0500 | [diff] [blame] | 36 | spinlock_t om_lock; |
| 37 | |
Chuck Lever | 11c556b | 2006-03-20 13:44:22 -0500 | [diff] [blame] | 38 | /* |
| 39 | * These counters give an idea about how many request |
| 40 | * transmissions are required, on average, to complete that |
| 41 | * particular procedure. Some procedures may require more |
| 42 | * than one transmission because the server is unresponsive, |
| 43 | * the client is retransmitting too aggressively, or the |
| 44 | * requests are large and the network is congested. |
| 45 | */ |
| 46 | unsigned long om_ops, /* count of operations */ |
| 47 | om_ntrans, /* count of RPC transmissions */ |
| 48 | om_timeouts; /* count of major timeouts */ |
| 49 | |
| 50 | /* |
| 51 | * These count how many bytes are sent and received for a |
| 52 | * given RPC procedure type. This indicates how much load a |
| 53 | * particular procedure is putting on the network. These |
| 54 | * counts include the RPC and ULP headers, and the request |
| 55 | * payload. |
| 56 | */ |
| 57 | unsigned long long om_bytes_sent, /* count of bytes out */ |
| 58 | om_bytes_recv; /* count of bytes in */ |
| 59 | |
| 60 | /* |
| 61 | * The length of time an RPC request waits in queue before |
| 62 | * transmission, the network + server latency of the request, |
| 63 | * and the total time the request spent from init to release |
| 64 | * are measured. |
| 65 | */ |
Chuck Lever | ff83997 | 2010-05-07 13:34:47 -0400 | [diff] [blame] | 66 | ktime_t om_queue, /* queued for xmit */ |
| 67 | om_rtt, /* RPC RTT */ |
| 68 | om_execute; /* RPC execution */ |
Dave Wysochanski | a332518 | 2019-05-23 16:13:50 -0400 | [diff] [blame] | 69 | /* |
| 70 | * The count of operations that complete with tk_status < 0. |
| 71 | * These statuses usually indicate error conditions. |
| 72 | */ |
| 73 | unsigned long om_error_status; |
Chuck Lever | 11c556b | 2006-03-20 13:44:22 -0500 | [diff] [blame] | 74 | } ____cacheline_aligned; |
| 75 | |
| 76 | struct rpc_task; |
| 77 | struct rpc_clnt; |
| 78 | |
| 79 | /* |
| 80 | * EXPORTed functions for managing rpc_iostats structures |
| 81 | */ |
Adrian Bunk | 7866bab | 2006-04-18 13:14:13 -0400 | [diff] [blame] | 82 | |
| 83 | #ifdef CONFIG_PROC_FS |
| 84 | |
Chuck Lever | 11c556b | 2006-03-20 13:44:22 -0500 | [diff] [blame] | 85 | struct rpc_iostats * rpc_alloc_iostats(struct rpc_clnt *); |
Weston Andros Adamson | 0a70219 | 2012-02-17 13:15:24 -0500 | [diff] [blame] | 86 | void rpc_count_iostats(const struct rpc_task *, |
| 87 | struct rpc_iostats *); |
Weston Andros Adamson | 840210f | 2014-06-24 10:59:52 -0400 | [diff] [blame] | 88 | void rpc_count_iostats_metrics(const struct rpc_task *, |
| 89 | struct rpc_iostats *); |
Dave Wysochanski | 016583d | 2018-07-31 10:10:51 -0400 | [diff] [blame] | 90 | void rpc_clnt_show_stats(struct seq_file *, struct rpc_clnt *); |
Chuck Lever | 11c556b | 2006-03-20 13:44:22 -0500 | [diff] [blame] | 91 | void rpc_free_iostats(struct rpc_iostats *); |
| 92 | |
Adrian Bunk | 7866bab | 2006-04-18 13:14:13 -0400 | [diff] [blame] | 93 | #else /* CONFIG_PROC_FS */ |
| 94 | |
| 95 | static inline struct rpc_iostats *rpc_alloc_iostats(struct rpc_clnt *clnt) { return NULL; } |
Weston Andros Adamson | 0a70219 | 2012-02-17 13:15:24 -0500 | [diff] [blame] | 96 | static inline void rpc_count_iostats(const struct rpc_task *task, |
| 97 | struct rpc_iostats *stats) {} |
Trond Myklebust | 54d7e72a | 2015-02-12 08:28:12 -0500 | [diff] [blame] | 98 | static inline void rpc_count_iostats_metrics(const struct rpc_task *task, |
| 99 | struct rpc_iostats *stats) |
| 100 | { |
| 101 | } |
| 102 | |
Dave Wysochanski | 016583d | 2018-07-31 10:10:51 -0400 | [diff] [blame] | 103 | static inline void rpc_clnt_show_stats(struct seq_file *seq, struct rpc_clnt *clnt) {} |
Adrian Bunk | 7866bab | 2006-04-18 13:14:13 -0400 | [diff] [blame] | 104 | static inline void rpc_free_iostats(struct rpc_iostats *stats) {} |
| 105 | |
| 106 | #endif /* CONFIG_PROC_FS */ |
| 107 | |
Chuck Lever | 11c556b | 2006-03-20 13:44:22 -0500 | [diff] [blame] | 108 | #endif /* _LINUX_SUNRPC_METRICS_H */ |