[ovs-dev] [PATCH ovn 11/11] ovn-northd-ddlog: Add profiling support.

Ben Pfaff blp at ovn.org
Thu Mar 4 04:10:12 UTC 2021


DDlog has support for memory and CPU profiling.  This commit adds
commands for enabling CPU profiling (memory profiling is always enabled)
and dumping out the profile.

Signed-off-by: Ben Pfaff <blp at ovn.org>
---
 northd/ovn-northd-ddlog.c | 40 ++++++++++++++++++++++++++++++++++++++-
 northd/ovn-northd.8.xml   | 36 ++++++++++++++++++++++++++++++++++-
 2 files changed, 74 insertions(+), 2 deletions(-)

diff --git a/northd/ovn-northd-ddlog.c b/northd/ovn-northd-ddlog.c
index aa0ea73e401d..41e7decba76b 100644
--- a/northd/ovn-northd-ddlog.c
+++ b/northd/ovn-northd-ddlog.c
@@ -61,6 +61,10 @@ static unixctl_cb_func ovn_northd_resume;
 static unixctl_cb_func ovn_northd_is_paused;
 static unixctl_cb_func ovn_northd_status;
 
+static unixctl_cb_func ovn_northd_enable_cpu_profiling;
+static unixctl_cb_func ovn_northd_disable_cpu_profiling;
+static unixctl_cb_func ovn_northd_profile;
+
 /* --ddlog-record: The name of a file to which to record DDlog commands for
  * later replay.  Useful for debugging.  If null (by default), DDlog commands
  * are not recorded. */
@@ -391,7 +395,6 @@ northd_parse_updates(struct northd_ctx *ctx, struct ovs_list *updates)
         return;
     }
 
-
     /* Whenever a new 'nb_cfg' value comes in, we take the current time and
      * push it into the NbCfgTimestamp relation for the DDlog program to put
      * into nb::NB_Global.nb_cfg_timestamp.
@@ -1164,6 +1167,12 @@ main(int argc, char *argv[])
         ovs_fatal(0, "DDlog instance could not be created");
     }
 
+    unixctl_command_register("enable-cpu-profiling", "", 0, 0,
+                             ovn_northd_enable_cpu_profiling, ddlog);
+    unixctl_command_register("disable-cpu-profiling", "", 0, 0,
+                             ovn_northd_disable_cpu_profiling, ddlog);
+    unixctl_command_register("profile", "", 0, 0, ovn_northd_profile, ddlog);
+
     int replay_fd = -1;
     if (record_file) {
         replay_fd = open(record_file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
@@ -1313,3 +1322,32 @@ ovn_northd_status(struct unixctl_conn *conn, int argc OVS_UNUSED,
     unixctl_command_reply(conn, s);
     free(s);
 }
+
+static void
+ovn_northd_enable_cpu_profiling(struct unixctl_conn *conn, int argc OVS_UNUSED,
+                                const char *argv[] OVS_UNUSED, void *prog_)
+{
+    ddlog_prog prog = prog_;
+    ddlog_enable_cpu_profiling(prog, true);
+    unixctl_command_reply(conn, NULL);
+}
+
+static void
+ovn_northd_disable_cpu_profiling(struct unixctl_conn *conn,
+                                 int argc OVS_UNUSED,
+                                 const char *argv[] OVS_UNUSED, void *prog_)
+{
+    ddlog_prog prog = prog_;
+    ddlog_enable_cpu_profiling(prog, false);
+    unixctl_command_reply(conn, NULL);
+}
+
+static void
+ovn_northd_profile(struct unixctl_conn *conn, int argc OVS_UNUSED,
+                   const char *argv[] OVS_UNUSED, void *prog_)
+{
+    ddlog_prog prog = prog_;
+    char *profile = ddlog_profile(prog);
+    unixctl_command_reply(conn, profile);
+    free(profile);
+}
diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml
index a16937a2147c..97ef049ad9da 100644
--- a/northd/ovn-northd.8.xml
+++ b/northd/ovn-northd.8.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manpage program="ovn-northd" section="8" title="ovn-northd">
     <h1>Name</h1>
-    <p>ovn-northd -- Open Virtual Network central control daemon</p>
+    <p>ovn-northd and ovn-northd-ddlog -- Open Virtual Network central control daemon</p>
 
     <h1>Synopsis</h1>
     <p><code>ovn-northd</code> [<var>options</var>]</p>
@@ -18,6 +18,14 @@
       <code>ovn-sb</code>(5)) below it.
     </p>
 
+    <p>
+      <code>ovn-northd</code> is implemented in C.
+      <code>ovn-northd-ddlog</code> is a compatible implementation written in
+      DDlog, a language for incremental database processing.  This
+      documentation applies to both implementations, with differences indicated
+      where relevant.
+    </p>
+
     <h1>Options</h1>
     <dl>
       <dt><code>--ovnnb-db=<var>database</var></code></dt>
@@ -127,6 +135,32 @@
       </dl>
     </p>
 
+    <p>
+      Only <code>ovn-northd-ddlog</code> supports the following commands:
+    </p>
+
+    <dl>
+      <dt><code>enable-cpu-profiling</code></dt>
+      <dt><code>disable-cpu-profiling</code></dt>
+      <dd>
+        Enables or disables profiling of CPU time used by the DDlog engine.
+        When CPU profiling is enabled, the <code>profile</code> command (see
+        below) will include DDlog CPU usage statistics in its output.  Enabling
+        CPU profiling will slow <code>ovn-northd-ddlog</code>.  Disabling CPU
+        profiling does not clear any previously recorded statistics.
+      </dd>
+
+      <dt><code>profile</code></dt>
+      <dd>
+        Outputs a profile of the current and peak sizes of arrangements inside
+        DDlog.  This profiling data can be useful for optimizing DDlog code.
+        If CPU profiling was previously enabled (even if it was later
+        disabled), the output also includes a CPU time profile.  See
+        <code>Profiling</code> inside the tutorial in the DDlog repository for
+        an introduction to profiling DDlog.
+      </dd>
+    </dl>
+
     <h1>Active-Standby for High Availability</h1>
     <p>
       You may run <code>ovn-northd</code> more than once in an OVN deployment.
-- 
2.29.2



More information about the dev mailing list