mbox series

[ovs-dev,RFC,v2,00/10] ovn-controller Incremental Processing

Message ID 1521744147-23451-1-git-send-email-hzhou8@ebay.com
Headers show
Series ovn-controller Incremental Processing | expand

Message

Han Zhou March 22, 2018, 6:42 p.m. UTC
ovn-controller currently recomputes everything when there are any changes
of input, which leads to high CPU usages and slow in end-to-end flow
enforcement in response to changes. It even wastes CPU to recompute flows
for unrelated inputs such as pinctrl events.

This patch series implements incremental processing in ovn-controller to
solve above problems. There has been a similar attempt of solve the problem
earlier but was reverted (see commit: 926c34fd). This patch series takes
a different approach with an incremental processing engine, to make the
dependencies clear and easier to maintain. The engine is a DAG representing
dependencies between different nodes. Each node maintains its own data, which
depends on its inputs and the data can also be inputs of other nodes. Each
node implements a method to recompute its data based on all the inputs, but
also implements methods to handle changes of different inputs incrementally.
The engine will be responsible to try incremental processing for each node
based on the dependencies or fallback to recompute when changes cannot be
handled incrementally.

This patch series can incrementally process the most common changes:
logical flows and port bindings from OVNSB. It can be expanded further for
more fine grained incremental processing gradually.

With the patch series, the CPU time of ovn-controller on HVs in
ovn-scale-test for scenario lports creating and binding decreased 90%. The
total execution time of the scale testing, creating and binding 10k ports
on 1k HVs with 40 lswitches and 8 lrouters (5 lswitches/lrouter), also
decreased from 3h40m to 1h50m because of the less CPU on HVs, without any
change on central node components. Latency for end-to-end port-creation to
binding and flows installation on all related HVs is also improved
significantly (comparison data is still under analysis).

This is RFC version to get feedback to see if there is any major issue of
this approach, before refining it further for formal review.

---
v1 -> v2:
- Fixed the last 2 failed test cases by updates in port-binding change handler
- Avoid forced recompute when not needed
- Added incremental processing for multicast group changes, which is common
  during lport creation/deletion
- Some other minor fixes and refactors, and rebased on lastest master

Han Zhou (10):
  ovn-controller: Incremental processing engine
  ovn-controller: Track OVSDB changes
  ovn-controller: Initial use of incremental engine in main
  ovn-controller: Split SB inputs as separate incremental engine nodes
  ovn-controller: split ovs_idl inputs in incremental engine
  ovn-controller: Incremental logical flow processing
  ovn-controller: runtime_data change handler for SB port-binding
  ovn-controller: port-binding incremental processing for physical flows
  Avoid force recompute when not needed
  ovn-controller: incremental processing for multicast group changes

 include/ovn/actions.h           |   3 +
 ovn/controller/bfd.c            |   4 +-
 ovn/controller/binding.c        | 101 ++++++-
 ovn/controller/binding.h        |   6 +
 ovn/controller/encaps.c         |  12 +-
 ovn/controller/lflow.c          | 110 ++++++--
 ovn/controller/lflow.h          |  10 +-
 ovn/controller/ofctrl.c         | 263 +++++++++++++-----
 ovn/controller/ofctrl.h         |  20 +-
 ovn/controller/ovn-controller.c | 584 +++++++++++++++++++++++++++++++---------
 ovn/controller/ovn-controller.h |   5 +
 ovn/controller/physical.c       | 235 ++++++++++------
 ovn/controller/physical.h       |  14 +-
 ovn/lib/actions.c               |   6 +-
 ovn/lib/automake.mk             |   4 +-
 ovn/lib/extend-table.c          |  31 ++-
 ovn/lib/extend-table.h          |   9 +-
 ovn/lib/inc-proc-eng.c          | 116 ++++++++
 ovn/lib/inc-proc-eng.h          | 121 +++++++++
 19 files changed, 1315 insertions(+), 339 deletions(-)
 create mode 100644 ovn/lib/inc-proc-eng.c
 create mode 100644 ovn/lib/inc-proc-eng.h