[ovs-dev] [PATCH v3 00/17] Daemon mode for ovn-nbctl

Mark Michelson mmichels at redhat.com
Mon Jul 16 18:11:19 UTC 2018

I've had a look through again and this series addresses the findings I 
previously had, so in short:

Acked-by: Mark Michelson <mmichels at redhat.com>

I decided to do some testing to see what sort of performance gain we see 
with this patch. I'm attaching four scripts that I used for testing.

In all of the tests, I create a logical router and 159 logical switches 
connected to the router. I then create 92 logical switch ports on each 
logical switch (a total of 14628 ports). On alternating logical switch 
port additions, I create an address set. Every set of two logical switch 
ports gets added to the most recently created address set. For each 
logical switch port, I also create two ACLs. Note that the script does 
not perform any synchronization or port binding. The goal of the script 
is to isolate the performance of ovn-nbctl at scale rather than as an 
overall view of the performance of OVN.

The scale.sh script is a straightforward version that uses individual 
calls to ovn-nbctl at each step. The scale_batch.sh script batches 
multiple operations into a single ovn-nbctl call. This way, the switch 
port, address set, and ACLs are created in one ovn-nbctl invocation. I 
ran these scripts about a month ago in a sandbox against OVS master. The 
scale.sh script took ~13 hours to complete. The scale_batch.sh script 
took ~3 hours to complete.

I then modified each of these scripts to work with ovn-nbctl in daemon 
mode. scale.sh was modified into scale-daemon.sh, and scale_batch.sh was 
modified into scale_batch-daemon.sh. I applied the patch series to the 
current OVS master and ran the daemon versions of the scripts in a 
sandbox. scale-daemon.sh completed in 8 minutes 54 seconds. 
scale_batch-daemon.sh completed in 3 minutes 52 seconds. In both cases, 
this is a 99.9% decrease in the amount of time to complete.

On 07/13/2018 02:36 PM, Jakub Sitnicki wrote:
> This series extends ovn-nbctl tool with support for the daemon mode, where
> ovn-nbctl acts a long-lived process that accepts commands over a UNIX socket.
> The daemon can be started the same way as any other OVS/OVN server:
>    ovn-nbctl --detach --pidfile --log-file
> While commands can be issued to it using the 'ovs-appctl' tool:
>    ovs-appctl -t ovn-nbctl run [OPTIONS] COMMAND [-- [OPTIONS] COMMAND] ...
> Although, the plan for future work is to extend ovn-nbctl so that it can control
> the daemon, if one is running.
> The motivation and the main benefit from the daemon mode is that the contents of
> NB database have to be obtained only once, when the first command is ran. On big
> databases (1000's of logical ports) this results in a speed up per command in
> the range of 100's of milliseconds.
> The changes are functional to the point that all test cases in the ovn-nbctl
> test suite (tests/ovn-nbctl.at) and OVN test suite (tests/ovn.at) pass when
> running ovn-nbctl as a daemon [1].
> However, I'm still thinking how to nicely integrate the daemon mode with the
> test suite so that the existing tests can be run using either the normal or the
> daemon mode. Any ideas?
> A dirty, just-for-development integration with tests is available at:
>    https://github.com/jsitnicki/ovs/commits/wip-nbctl-daemon-2018-07-13
> Also, not all places that call ctl_fatal() have been converted yet to propagate
> the error to the caller. As a result hitting an unconverted an error path will
> cause the daemon process to die. This can be worked around with the --monitor
> option.
> Daemon mode should be considered experimental.
> Changes v2 -> v3:
> - Wait for IDL to connect before detaching and running the unixctl server. Also,
>    terminate the daemon when the connection to the NB DB has failed. This
>    behavior is modeled after ovn-trace daemon mode.
> - Add a dedicated option parser for the daemon. Parse only the options that are
>    have an effect on the main loop. Logging options are not supported. Usual way
>    to change the log levels for daemons is with 'vlog/set' command. Reported by
>    Mark Michelson.
> - Drop the test for 'sync' command. The test is flawed as pointed out by Mark
>    Michelson. Reading the '*_cfg' value after 'ovn-nbctl --wait=X sync' has
>    returned does not prove that '--wait' has blocked until the '*_cfg' value has
>    changed. At the same time, we cannot read out the updated '*_cfg' value in the
>    same transaction as we change it in.
> - To review just the interdiff run:
>    git fetch --tags https://github.com/jsitnicki/ovs
>    git diff wip-nbctl-daemon-2018-07-{12,13}
> Changes v1 -> v2:
> - Work around a limitation in GCC 4.8.5 (RHEL/CentOS 7.5) that doesn't let us
>    use a constant expression as a RHS value in a structure assigment. Found by
>    the 0-day bot.
> Changes RFC -> v1:
> - Rebase onto master @ 61b1c7acb9a2 ("netdev-bsd: Fix crash on FreeBSD.").
> - Add support for commands that use tabular output ('find' and 'list') thanks to
>    recent work in table module by Ben Pfaff. This includes support for options
>    that control table formatting.
> - Run prerequisites routines. In the end this is needed to support the 'sync'
>    command, which itself is more like an option than command (has to get
>    processed before the commands run). This is also the reason for minor changes
>    in the IDL.
> - Add support for --dry-run, --wait / --no-wait, --timeout, and --oneline
>    options. Timeout handling is different than in the normal mode - we only time
>    out in poll_block(). Still, it serves the purpose avoiding an infinite 'sync'.
> - Add tests for ovn-nbctl 'sync' command, dry-run mode, and oneline-formatted
>    output.
> - Extend the ovn-nbctl man-page with description of daemon mode.
> - Remove extraneous return at the end of a void function. Pointed out by Ben
>    Pfaff.
> - Drop WIP patch for integration with tests from the series until a right
>    approach can be found. Integration with tests that was used during development
>    is available at:
>    https://github.com/jsitnicki/ovs/commits/wip-nbctl-daemon-2018-07-11
> - Minor style cleanups.
> Thanks,
> Jakub
> [1] Except test "2563: ovn -- IPv6 ND Router Solicitation responder" which seems
>      broken in master @ 61b1c7acb9a2 ("netdev-bsd: Fix crash on FreeBSD.").
> Jakub Sitnicki (17):
>    table: Introduce a constant for default table style.
>    ovsdb-idl: Allow monitoring columns that are already monitored.
>    ovn-nbctl: Extract the main loop.
>    ovn-nbctl: Pull up destroying commands from do_nbctl().
>    ovn-nbctl: Pull up releasing IDL from do_nbctl().
>    ovn-nbctl: Signal need to try again via an output param.
>    ovn-nbctl: Propagate the error from do_nbctl().
>    ovn-nbctl: Propagate errors from the main loop.
>    ovn-nbctl: Propagate errors from prerequisites runner.
>    ovn-nbctl: Introduce a poll_timer based wait timeout.
>    ovn-nbctl: Extract helper for printing oneline output.
>    ovn-nbctl: Extract handling of options that affect main loop.
>    ovn-nbctl: Extract a helper for building short options string.
>    ovn-nbctl: Extract a helper for appending command options.
>    ovn-nbctl: Initial support for daemon mode.
>    tests: Add test for ovn-nbctl dry run mode.
>    tests: Add test for oneline-formatted output for ovn-nbctl.
>   lib/ovsdb-idl.c               |  16 +-
>   lib/table.h                   |   2 +
>   ovn/utilities/ovn-nbctl.8.xml |  40 +++
>   ovn/utilities/ovn-nbctl.c     | 654 +++++++++++++++++++++++++++++++++---------
>   tests/ovn-nbctl.at            |  42 +++
>   5 files changed, 622 insertions(+), 132 deletions(-)
> --
> 2.14.4

More information about the dev mailing list