[ovs-dev] [PATCH] ovsdb: Add raft memory usage to memory report.
Han Zhou
hzhou at ovn.org
Fri May 22 20:36:22 UTC 2020
On Fri, May 22, 2020 at 10:36 AM Ilya Maximets <i.maximets at ovn.org> wrote:
>
> Memory reports could be found in logs or by calling 'memory/show'
> appctl command. For ovsdb-server it includes information about db
> cells, monitor connections with their backlog size, etc. But it
> doesn't contain any information about memory consumed by raft.
> Backlogs of raft connections could be insanely large because of
> snapshot installation requests that simply contains the whole database.
> In not that healthy clusters where one of ovsdb servers is not able to
> timely handle all the incoming raft traffic, backlog on a sender's side
> could cause significant memory consumption issues.
>
> Adding new 'raft-connections' and 'raft-backlog' counters to the
> memory report to better track such conditions.
>
> Signed-off-by: Ilya Maximets <i.maximets at ovn.org>
> ---
> ovsdb/ovsdb.c | 4 ++++
> ovsdb/raft.c | 16 ++++++++++++++++
> ovsdb/raft.h | 2 ++
> ovsdb/storage.c | 10 ++++++++++
> ovsdb/storage.h | 3 +++
> 5 files changed, 35 insertions(+)
>
> diff --git a/ovsdb/ovsdb.c b/ovsdb/ovsdb.c
> index 7e683e681..2da117cb3 100644
> --- a/ovsdb/ovsdb.c
> +++ b/ovsdb/ovsdb.c
> @@ -502,6 +502,10 @@ ovsdb_get_memory_usage(const struct ovsdb *db,
struct simap *usage)
> }
>
> simap_increase(usage, "cells", cells);
> +
> + if (db->storage) {
> + ovsdb_storage_get_memory_usage(db->storage, usage);
> + }
> }
>
> struct ovsdb_table *
> diff --git a/ovsdb/raft.c b/ovsdb/raft.c
> index 18f29973e..515eadab3 100644
> --- a/ovsdb/raft.c
> +++ b/ovsdb/raft.c
> @@ -36,6 +36,7 @@
> #include "ovsdb/log.h"
> #include "raft-rpc.h"
> #include "random.h"
> +#include "simap.h"
> #include "socket-util.h"
> #include "stream.h"
> #include "timeval.h"
> @@ -1014,6 +1015,21 @@ raft_get_sid(const struct raft *raft)
> return &raft->sid;
> }
>
> +/* Adds memory consumption info to 'usage' for later use by
memory_report(). */
> +void
> +raft_get_memory_usage(const struct raft *raft, struct simap *usage)
> +{
> + struct raft_conn *conn;
> + int cnt = 0;
> +
> + LIST_FOR_EACH (conn, list_node, &raft->conns) {
> + simap_increase(usage, "raft-backlog",
> + jsonrpc_session_get_backlog(conn->js));
> + cnt++;
> + }
> + simap_increase(usage, "raft-connections", cnt);
> +}
> +
> /* Returns true if 'raft' has completed joining its cluster, has not
left or
> * initiated leaving the cluster, does not have failed disk storage, and
is
> * apparently connected to the leader in a healthy way (or is itself the
> diff --git a/ovsdb/raft.h b/ovsdb/raft.h
> index 3d448995a..99d5307e5 100644
> --- a/ovsdb/raft.h
> +++ b/ovsdb/raft.h
> @@ -67,6 +67,7 @@
> struct json;
> struct ovsdb_log;
> struct raft;
> +struct simap;
> struct sset;
>
> #define RAFT_MAGIC "CLUSTER"
> @@ -113,6 +114,7 @@ const struct uuid *raft_get_cid(const struct raft *);
> const struct uuid *raft_get_sid(const struct raft *);
> bool raft_is_connected(const struct raft *);
> bool raft_is_leader(const struct raft *);
> +void raft_get_memory_usage(const struct raft *, struct simap *usage);
>
> /* Joining a cluster. */
> bool raft_is_joining(const struct raft *);
> diff --git a/ovsdb/storage.c b/ovsdb/storage.c
> index e26252b06..7b4ad16f6 100644
> --- a/ovsdb/storage.c
> +++ b/ovsdb/storage.c
> @@ -26,6 +26,7 @@
> #include "ovsdb.h"
> #include "raft.h"
> #include "random.h"
> +#include "simap.h"
> #include "timeval.h"
> #include "util.h"
>
> @@ -188,6 +189,15 @@ ovsdb_storage_get_applied_index(const struct
ovsdb_storage *storage)
> return storage->raft ? raft_get_applied_index(storage->raft) : 0;
> }
>
> +void
> +ovsdb_storage_get_memory_usage(const struct ovsdb_storage *storage,
> + struct simap *usage)
> +{
> + if (storage->raft) {
> + raft_get_memory_usage(storage->raft, usage);
> + }
> +}
> +
> void
> ovsdb_storage_run(struct ovsdb_storage *storage)
> {
> diff --git a/ovsdb/storage.h b/ovsdb/storage.h
> index 8a9bbab70..a22396891 100644
> --- a/ovsdb/storage.h
> +++ b/ovsdb/storage.h
> @@ -23,6 +23,7 @@
> struct json;
> struct ovsdb_schema;
> struct ovsdb_storage;
> +struct simap;
> struct uuid;
>
> struct ovsdb_error *ovsdb_storage_open(const char *filename, bool rw,
> @@ -39,6 +40,8 @@ bool ovsdb_storage_is_leader(const struct ovsdb_storage
*);
> const struct uuid *ovsdb_storage_get_cid(const struct ovsdb_storage *);
> const struct uuid *ovsdb_storage_get_sid(const struct ovsdb_storage *);
> uint64_t ovsdb_storage_get_applied_index(const struct ovsdb_storage *);
> +void ovsdb_storage_get_memory_usage(const struct ovsdb_storage *,
> + struct simap *usage);
>
> void ovsdb_storage_run(struct ovsdb_storage *);
> void ovsdb_storage_wait(struct ovsdb_storage *);
> --
> 2.25.4
>
Acked-by: Han Zhou <hzhou at ovn.org>
More information about the dev
mailing list