Justin made a good point: It would be nice if as a follow up patch ovs-bugtool could store the result of this command.
Ethan On Wed, Apr 25, 2012 at 19:04, Ethan Jackson <et...@nicira.com> wrote: > Looks good, thanks. > > Ethan > > On Fri, Apr 20, 2012 at 14:10, Ben Pfaff <b...@nicira.com> wrote: >> I've had a few complaints that ovs-vswitchd logs its coverage counters >> at WARN level, but this is mainly wrong: ovs-vswitchd only logs coverage >> counters at WARN level when the "coverage/log" command is used through >> ovs-appctl. This was even documented. >> >> The reason to log at such a high level was to make it fairly certain that >> these messages specifically requested by the admin would not be filtered >> out before making it to the log. But it's even better if the admin just >> gets the coverage counters as a reply to the ovs-appctl command. So that >> is what this commit does. >> >> This commit also improves the documentation of the ovs-appctl command. >> >> Signed-off-by: Ben Pfaff <b...@nicira.com> >> --- >> NEWS | 3 + >> lib/automake.mk | 1 + >> lib/coverage-unixctl.man | 11 +++++ >> lib/coverage.c | 91 >> ++++++++++++++++++++++++++++---------------- >> lib/coverage.h | 4 +- >> lib/timeval.c | 6 +-- >> manpages.mk | 2 + >> ovsdb/ovsdb-server.1.in | 1 + >> vswitchd/ovs-vswitchd.8.in | 2 - >> 9 files changed, 79 insertions(+), 42 deletions(-) >> create mode 100644 lib/coverage-unixctl.man >> >> diff --git a/NEWS b/NEWS >> index 9c73352..e717a4a 100644 >> --- a/NEWS >> +++ b/NEWS >> @@ -12,6 +12,9 @@ post-v1.6.0 >> - Added support for spawning ovs-test server from the client. >> - Now ovs-test is able to automatically create test bridges and >> ports. >> - "ovs-dpctl dump-flows" now prints observed TCP flags in TCP flows. >> + - The "coverage/log" command previously available through ovs-appctl >> + has been replaced by "coverage/show". The new command replies with >> + coverage counter values, instead of logging them. >> >> >> v1.6.0 - xx xxx xxxx >> diff --git a/lib/automake.mk b/lib/automake.mk >> index 5ce287f..2d2617e 100644 >> --- a/lib/automake.mk >> +++ b/lib/automake.mk >> @@ -253,6 +253,7 @@ EXTRA_DIST += \ >> MAN_FRAGMENTS += \ >> lib/common.man \ >> lib/common-syn.man \ >> + lib/coverage-unixctl.man \ >> lib/daemon.man \ >> lib/daemon-syn.man \ >> lib/leak-checker.man \ >> diff --git a/lib/coverage-unixctl.man b/lib/coverage-unixctl.man >> new file mode 100644 >> index 0000000..9718894 >> --- /dev/null >> +++ b/lib/coverage-unixctl.man >> @@ -0,0 +1,11 @@ >> +.SS "COVERAGE COMMANDS" >> +These commands manage \fB\*(PN\fR's ``coverage counters,'' which count >> +the number of times particular events occur during a daemon's runtime. >> +In addition to these commands, \fB\*(PN\fR automatically logs coverage >> +counter values, at \fBINFO\fR level, when it detects that the daemon's >> +main loop takes unusually long to run. >> +.PP >> +Coverage counters are useful mainly for performance analysis and >> +debugging. >> +.IP "\fBcoverage/show\fR" >> +Displays the values of all of the coverage counters. >> diff --git a/lib/coverage.c b/lib/coverage.c >> index ff20f5e..ee27af0 100644 >> --- a/lib/coverage.c >> +++ b/lib/coverage.c >> @@ -20,6 +20,7 @@ >> #include <stdlib.h> >> #include "dynamic-string.h" >> #include "hash.h" >> +#include "svec.h" >> #include "timeval.h" >> #include "unixctl.h" >> #include "util.h" >> @@ -48,19 +49,28 @@ struct coverage_counter *coverage_counters[] = { >> >> static unsigned int epoch; >> >> +static void coverage_read(struct svec *); >> + >> static void >> -coverage_unixctl_log(struct unixctl_conn *conn, int argc OVS_UNUSED, >> +coverage_unixctl_show(struct unixctl_conn *conn, int argc OVS_UNUSED, >> const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) >> { >> - coverage_log(VLL_WARN, false); >> - unixctl_command_reply(conn, NULL); >> + struct svec lines; >> + char *reply; >> + >> + svec_init(&lines); >> + coverage_read(&lines); >> + reply = svec_join(&lines, "\n", "\n"); >> + unixctl_command_reply(conn, reply); >> + free(reply); >> + svec_destroy(&lines); >> } >> >> void >> coverage_init(void) >> { >> - unixctl_command_register("coverage/log", "", 0, 0, >> - coverage_unixctl_log, NULL); >> + unixctl_command_register("coverage/show", "", 0, 0, >> + coverage_unixctl_show, NULL); >> } >> >> /* Sorts coverage counters in descending order by count, within equal counts >> @@ -144,60 +154,75 @@ coverage_hit(uint32_t hash) >> } >> } >> >> +/* Logs the coverage counters, unless a similar set of events has already >> been >> + * logged. >> + * >> + * This function logs at log level VLL_INFO. Use care before adjusting this >> + * level, because depending on its configuration, syslogd can write changes >> + * synchronously, which can cause the coverage messages to take several >> seconds >> + * to write. */ >> +void >> +coverage_log(void) >> +{ >> + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 3); >> + >> + if (!VLOG_DROP_INFO(&rl)) { >> + uint32_t hash = coverage_hash(); >> + if (coverage_hit(hash)) { >> + VLOG_INFO("Skipping details of duplicate event coverage for " >> + "hash=%08"PRIx32" in epoch %u", hash, epoch); >> + } else { >> + struct svec lines; >> + const char *line; >> + size_t i; >> + >> + svec_init(&lines); >> + coverage_read(&lines); >> + SVEC_FOR_EACH (i, line, &lines) { >> + VLOG_INFO("%s", line); >> + } >> + svec_destroy(&lines); >> + } >> + } >> +} >> + >> static void >> -coverage_log_counter(enum vlog_level level, const struct coverage_counter >> *c) >> +coverage_read_counter(struct svec *lines, const struct coverage_counter *c) >> { >> - VLOG(level, "%-24s %5u / %9llu", c->name, c->count, c->count + >> c->total); >> + svec_add_nocopy(lines, xasprintf("%-24s %5u / %9llu", >> + c->name, c->count, c->count + >> c->total)); >> } >> >> -/* Logs the coverage counters at the given vlog 'level'. If >> - * 'suppress_dups' is true, then duplicate events are not displayed. >> - * Care should be taken in the value used for 'level'. Depending on the >> - * configuration, syslog can write changes synchronously, which can >> - * cause the coverage messages to take several seconds to write. */ >> -void >> -coverage_log(enum vlog_level level, bool suppress_dups) >> +/* Adds coverage counter information to 'lines'. */ >> +static void >> +coverage_read(struct svec *lines) >> { >> - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 3); >> size_t n_never_hit; >> uint32_t hash; >> size_t i; >> >> - if (suppress_dups >> - ? !vlog_is_enabled(THIS_MODULE, level) >> - : vlog_should_drop(THIS_MODULE, level, &rl)) { >> - return; >> - } >> - >> hash = coverage_hash(); >> - if (suppress_dups) { >> - if (coverage_hit(hash)) { >> - VLOG(level, "Skipping details of duplicate event coverage for " >> - "hash=%08"PRIx32" in epoch %u", hash, epoch); >> - return; >> - } >> - } >> >> n_never_hit = 0; >> - VLOG(level, "Event coverage (epoch %u/entire run), hash=%08"PRIx32":", >> - epoch, hash); >> + svec_add_nocopy(lines, xasprintf("Event coverage (epoch %u/entire run), >> " >> + "hash=%08"PRIx32":", epoch, hash)); >> for (i = 0; i < n_coverage_counters; i++) { >> struct coverage_counter *c = coverage_counters[i]; >> if (c->count) { >> - coverage_log_counter(level, c); >> + coverage_read_counter(lines, c); >> } >> } >> for (i = 0; i < n_coverage_counters; i++) { >> struct coverage_counter *c = coverage_counters[i]; >> if (!c->count) { >> if (c->total) { >> - coverage_log_counter(level, c); >> + coverage_read_counter(lines, c); >> } else { >> n_never_hit++; >> } >> } >> } >> - VLOG(level, "%zu events never hit", n_never_hit); >> + svec_add_nocopy(lines, xasprintf("%zu events never hit", n_never_hit)); >> } >> >> /* Advances to the next epoch of coverage, resetting all the counters to 0. >> */ >> diff --git a/lib/coverage.h b/lib/coverage.h >> index b7db6c4..0f389bf 100644 >> --- a/lib/coverage.h >> +++ b/lib/coverage.h >> @@ -1,5 +1,5 @@ >> /* >> - * Copyright (c) 2009, 2010, 2011 Nicira Networks. >> + * Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks. >> * >> * Licensed under the Apache License, Version 2.0 (the "License"); >> * you may not use this file except in compliance with the License. >> @@ -56,7 +56,7 @@ struct coverage_counter { >> #define COVERAGE_ADD(COUNTER, AMOUNT) counter_##COUNTER.count += (AMOUNT); >> >> void coverage_init(void); >> -void coverage_log(enum vlog_level, bool suppress_dups); >> +void coverage_log(void); >> void coverage_clear(void); >> >> /* Implementation detail. */ >> diff --git a/lib/timeval.c b/lib/timeval.c >> index 9829100..b60ece9 100644 >> --- a/lib/timeval.c >> +++ b/lib/timeval.c >> @@ -499,11 +499,7 @@ log_poll_interval(long long int last_wakeup) >> rusage.ru_nivcsw - last_rusage->ru_nivcsw); >> } >> } >> - /* Care should be taken in the value chosen for logging. Depending >> - * on the configuration, syslog can write changes synchronously, >> - * which can cause the coverage messages to take longer to log >> - * than the processing delay that triggered it. */ >> - coverage_log(VLL_INFO, true); >> + coverage_log(); >> } >> >> /* Update exponentially weighted moving average. With these parameters, >> a >> diff --git a/manpages.mk b/manpages.mk >> index 14bb41f..1773263 100644 >> --- a/manpages.mk >> +++ b/manpages.mk >> @@ -34,6 +34,7 @@ ovsdb/ovsdb-server.1: \ >> ovsdb/ovsdb-server.1.in \ >> lib/common-syn.man \ >> lib/common.man \ >> + lib/coverage-unixctl.man \ >> lib/daemon-syn.man \ >> lib/daemon.man \ >> lib/ssl-bootstrap-syn.man \ >> @@ -51,6 +52,7 @@ ovsdb/ovsdb-server.1: \ >> ovsdb/ovsdb-server.1.in: >> lib/common-syn.man: >> lib/common.man: >> +lib/coverage-unixctl.man: >> lib/daemon-syn.man: >> lib/daemon.man: >> lib/ssl-bootstrap-syn.man: >> diff --git a/ovsdb/ovsdb-server.1.in b/ovsdb/ovsdb-server.1.in >> index 9e2d79a..dfe9208 100644 >> --- a/ovsdb/ovsdb-server.1.in >> +++ b/ovsdb/ovsdb-server.1.in >> @@ -123,6 +123,7 @@ This command might be useful for debugging issues with >> database >> clients. >> . >> .so lib/vlog-unixctl.man >> +.so lib/coverage-unixctl.man >> .so lib/stress-unixctl.man >> .SH "SEE ALSO" >> . >> diff --git a/vswitchd/ovs-vswitchd.8.in b/vswitchd/ovs-vswitchd.8.in >> index 1abae6f..6c9f3e4 100644 >> --- a/vswitchd/ovs-vswitchd.8.in >> +++ b/vswitchd/ovs-vswitchd.8.in >> @@ -108,8 +108,6 @@ how to configure Open vSwitch. >> .SS "GENERAL COMMANDS" >> .IP "\fBexit\fR" >> Causes \fBovs\-vswitchd\fR to gracefully terminate. >> -.IP "\fBcoverage/log\fR" >> -Logs coverage counters at level warn. >> .IP "\fBqos/show\fR \fIinterface\fR" >> Queries the kernel for Quality of Service configuration and statistics >> associated with the given \fIinterface\fR. >> -- >> 1.7.2.5 >> >> _______________________________________________ >> dev mailing list >> dev@openvswitch.org >> http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev