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 in ovn-scale-test for 500 lports creating and binding on 50 HVs decreased 90%. This is RFC version to get feedback to see if there is any major issue of this approach, before refining it future for formal review. There are still two test cases failed and debugging ongoing. Han Zhou (8): 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 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 | 104 ++++++-- ovn/controller/lflow.h | 10 +- ovn/controller/ofctrl.c | 226 ++++++++++++----- ovn/controller/ofctrl.h | 16 +- ovn/controller/ovn-controller.c | 546 +++++++++++++++++++++++++++++++--------- ovn/controller/ovn-controller.h | 5 + ovn/controller/physical.c | 140 +++++++---- ovn/controller/physical.h | 8 +- 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 | 97 +++++++ ovn/lib/inc-proc-eng.h | 118 +++++++++ 19 files changed, 1143 insertions(+), 303 deletions(-) create mode 100644 ovn/lib/inc-proc-eng.c create mode 100644 ovn/lib/inc-proc-eng.h -- 2.1.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
