diff options
author | Ben Pfaff <blp@nicira.com> | 2012-05-08 15:44:21 -0700 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2012-05-22 10:32:05 -0700 |
commit | 0d085684619be0baef309957a3d7410a23cb5f27 (patch) | |
tree | 212ad7c9bd8e67c80065da7ed1968f6a5bd5af61 /ovsdb | |
parent | 44bac24ba5d22fe238bd96702707eb2029efec41 (diff) |
Add support for tracking and logging daemon memory usage.
Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'ovsdb')
-rw-r--r-- | ovsdb/jsonrpc-server.c | 42 | ||||
-rw-r--r-- | ovsdb/jsonrpc-server.h | 6 | ||||
-rw-r--r-- | ovsdb/ovsdb-server.c | 16 | ||||
-rw-r--r-- | ovsdb/ovsdb.c | 22 | ||||
-rw-r--r-- | ovsdb/ovsdb.h | 5 |
5 files changed, 87 insertions, 4 deletions
diff --git a/ovsdb/jsonrpc-server.c b/ovsdb/jsonrpc-server.c index 0cc8bdf9..bb887d0b 100644 --- a/ovsdb/jsonrpc-server.c +++ b/ovsdb/jsonrpc-server.c @@ -31,6 +31,7 @@ #include "reconnect.h" #include "row.h" #include "server.h" +#include "simap.h" #include "stream.h" #include "table.h" #include "timeval.h" @@ -51,6 +52,8 @@ static struct ovsdb_jsonrpc_session *ovsdb_jsonrpc_session_create( struct ovsdb_jsonrpc_remote *, struct jsonrpc_session *); static void ovsdb_jsonrpc_session_run_all(struct ovsdb_jsonrpc_remote *); static void ovsdb_jsonrpc_session_wait_all(struct ovsdb_jsonrpc_remote *); +static void ovsdb_jsonrpc_session_get_memory_usage_all( + const struct ovsdb_jsonrpc_remote *, struct simap *usage); static void ovsdb_jsonrpc_session_close_all(struct ovsdb_jsonrpc_remote *); static void ovsdb_jsonrpc_session_reconnect_all(struct ovsdb_jsonrpc_remote *); static void ovsdb_jsonrpc_session_set_all_options( @@ -293,6 +296,22 @@ ovsdb_jsonrpc_server_wait(struct ovsdb_jsonrpc_server *svr) ovsdb_jsonrpc_session_wait_all(remote); } } + +/* Adds some memory usage statistics for 'svr' into 'usage', for use with + * memory_report(). */ +void +ovsdb_jsonrpc_server_get_memory_usage(const struct ovsdb_jsonrpc_server *svr, + struct simap *usage) +{ + struct shash_node *node; + + simap_increase(usage, "sessions", svr->n_sessions); + SHASH_FOR_EACH (node, &svr->remotes) { + struct ovsdb_jsonrpc_remote *remote = node->data; + + ovsdb_jsonrpc_session_get_memory_usage_all(remote, usage); + } +} /* JSON-RPC database server session. */ @@ -315,6 +334,8 @@ struct ovsdb_jsonrpc_session { static void ovsdb_jsonrpc_session_close(struct ovsdb_jsonrpc_session *); static int ovsdb_jsonrpc_session_run(struct ovsdb_jsonrpc_session *); static void ovsdb_jsonrpc_session_wait(struct ovsdb_jsonrpc_session *); +static void ovsdb_jsonrpc_session_get_memory_usage( + const struct ovsdb_jsonrpc_session *, struct simap *usage); static void ovsdb_jsonrpc_session_set_options( struct ovsdb_jsonrpc_session *, const struct ovsdb_jsonrpc_options *); static void ovsdb_jsonrpc_session_got_request(struct ovsdb_jsonrpc_session *, @@ -429,6 +450,27 @@ ovsdb_jsonrpc_session_wait_all(struct ovsdb_jsonrpc_remote *remote) } static void +ovsdb_jsonrpc_session_get_memory_usage(const struct ovsdb_jsonrpc_session *s, + struct simap *usage) +{ + simap_increase(usage, "triggers", hmap_count(&s->triggers)); + simap_increase(usage, "monitors", hmap_count(&s->monitors)); + simap_increase(usage, "backlog", jsonrpc_session_get_backlog(s->js)); +} + +static void +ovsdb_jsonrpc_session_get_memory_usage_all( + const struct ovsdb_jsonrpc_remote *remote, + struct simap *usage) +{ + struct ovsdb_jsonrpc_session *s; + + LIST_FOR_EACH (s, node, &remote->sessions) { + ovsdb_jsonrpc_session_get_memory_usage(s, usage); + } +} + +static void ovsdb_jsonrpc_session_close_all(struct ovsdb_jsonrpc_remote *remote) { struct ovsdb_jsonrpc_session *s, *next; diff --git a/ovsdb/jsonrpc-server.h b/ovsdb/jsonrpc-server.h index 8312a002..2dc0c780 100644 --- a/ovsdb/jsonrpc-server.h +++ b/ovsdb/jsonrpc-server.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010, 2011 Nicira, Inc. +/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ struct ovsdb; struct shash; +struct simap; struct ovsdb_jsonrpc_server *ovsdb_jsonrpc_server_create(struct ovsdb *); void ovsdb_jsonrpc_server_destroy(struct ovsdb_jsonrpc_server *); @@ -59,4 +60,7 @@ void ovsdb_jsonrpc_server_reconnect(struct ovsdb_jsonrpc_server *); void ovsdb_jsonrpc_server_run(struct ovsdb_jsonrpc_server *); void ovsdb_jsonrpc_server_wait(struct ovsdb_jsonrpc_server *); +void ovsdb_jsonrpc_server_get_memory_usage(const struct ovsdb_jsonrpc_server *, + struct simap *usage); + #endif /* ovsdb/jsonrpc-server.h */ diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c index 28bf901e..7f53e177 100644 --- a/ovsdb/ovsdb-server.c +++ b/ovsdb/ovsdb-server.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010, 2011 Nicira, Inc. +/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,7 @@ #include "jsonrpc-server.h" #include "leak-checker.h" #include "list.h" +#include "memory.h" #include "ovsdb.h" #include "ovsdb-data.h" #include "ovsdb-types.h" @@ -39,6 +40,7 @@ #include "poll-loop.h" #include "process.h" #include "row.h" +#include "simap.h" #include "stream-ssl.h" #include "stream.h" #include "stress.h" @@ -143,6 +145,17 @@ main(int argc, char *argv[]) exiting = false; while (!exiting) { + memory_run(); + if (memory_should_report()) { + struct simap usage; + + simap_init(&usage); + ovsdb_jsonrpc_server_get_memory_usage(jsonrpc, &usage); + ovsdb_get_memory_usage(db, &usage); + memory_report(&usage); + simap_destroy(&usage); + } + reconfigure_from_db(jsonrpc, db, &remotes); ovsdb_jsonrpc_server_run(jsonrpc); unixctl_server_run(unixctl); @@ -157,6 +170,7 @@ main(int argc, char *argv[]) update_remote_status(jsonrpc, &remotes, db); } + memory_wait(); ovsdb_jsonrpc_server_wait(jsonrpc); unixctl_server_wait(unixctl); ovsdb_trigger_wait(db, time_msec()); diff --git a/ovsdb/ovsdb.c b/ovsdb/ovsdb.c index 584433c7..6b53f4a3 100644 --- a/ovsdb/ovsdb.c +++ b/ovsdb/ovsdb.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010, 2011 Nicira, Inc. +/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ #include "ovsdb-error.h" #include "ovsdb-parser.h" #include "ovsdb-types.h" +#include "simap.h" #include "table.h" #include "transaction.h" @@ -384,6 +385,25 @@ ovsdb_destroy(struct ovsdb *db) } } +/* Adds some memory usage statistics for 'db' into 'usage', for use with + * memory_report(). */ +void +ovsdb_get_memory_usage(const struct ovsdb *db, struct simap *usage) +{ + const struct shash_node *node; + unsigned int cells = 0; + + SHASH_FOR_EACH (node, &db->tables) { + const struct ovsdb_table *table = node->data; + unsigned int n_columns = shash_count(&table->schema->columns); + unsigned int n_rows = hmap_count(&table->rows); + + cells += n_rows * n_columns; + } + + simap_increase(usage, "cells", cells); +} + struct ovsdb_table * ovsdb_get_table(const struct ovsdb *db, const char *name) { diff --git a/ovsdb/ovsdb.h b/ovsdb/ovsdb.h index ea7a9c2d..6e4ff791 100644 --- a/ovsdb/ovsdb.h +++ b/ovsdb/ovsdb.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010, 2011 Nicira, Inc. +/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ struct json; struct ovsdb_log; struct ovsdb_session; struct ovsdb_txn; +struct simap; struct uuid; /* Database schema. */ @@ -66,6 +67,8 @@ struct ovsdb { struct ovsdb *ovsdb_create(struct ovsdb_schema *); void ovsdb_destroy(struct ovsdb *); +void ovsdb_get_memory_usage(const struct ovsdb *, struct simap *usage); + struct ovsdb_error *ovsdb_from_json(const struct json *, struct ovsdb **) WARN_UNUSED_RESULT; struct json *ovsdb_to_json(const struct ovsdb *); |