[ovs-dev] [RFC 0/8] ovn-controller Incremental Processing

Mark Michelson mmichels at redhat.com
Fri Feb 23 22:00:54 UTC 2018


On 02/23/2018 02:04 PM, Han Zhou wrote:
> Hi Mark, thank you very much for the feedback!!
> 
> On Fri, Feb 23, 2018 at 10:56 AM, Mark Michelson <mmichels at redhat.com 
> <mailto:mmichels at redhat.com>> wrote:
>  >
>  > Hi Han,
>  >
>  > First off, great work! This is fantastic to see, and I'm super 
> excited to see such a drop in CPU usage with this patch.
>  >
>  > Since this is an RFC patch, I won't go too deep into nitty-gritty 
> details on this. Rather, I'll look at it from a high level.
>  >
>  > The API design idea is great. I like the use of a directed graph 
> since it clearly indicates dependencies. The patch progression is done 
> really well since it allows for us to easily understand each individual 
> change. It also makes it easy to see additional incremental changes that 
> could be added in the future.
>  >
>  > My main concern is that the specific setup you have used here results 
> in data encapsulation not being very strong. For instance, the 
> en_flow_output node consistently looks inside the en_runtime_data node 
> for input data. It appears from my quick look that en_flow_output is 
> treating this data as immutable, but I'm not 100% sure if I'm correct. 
> There's nothing in place to stop it from modifying that data if it 
> wanted to, though.
> 
> Agree. It is also my concern for the lack of strong encapsulation. The 
> principle to follow is that each node take input node data as immutable, 
> and write its own data. I will think about how to make this explicitly 
> from code perspective. I didn't have a good idea on this. Do you have 
> any suggestion?
One thought is that we could create better delineations between the 
working data of a node and its output data. In other words, there could 
be one structure of mutable data that the node can manipulate, and a 
separate structure of const data that it exports for other nodes to 
read. Right now, there is a function called engine_get_input() that 
retrieves an engine_node. Maybe a better idea would be to replace that 
with something like engine_get_input_data() that retrieves read-only 
data from an engine node instead.

> 
>  > Also it is common for nodes to modify global data rather than just 
> modifying node-local data(e.g. making calls to ofctrl_add_flow(), which 
> modifies a global hmap).
> 
> flow-table can be considered as data of en_flow_output. Since 
> en_flow_output is the leaf node of the DAG and no other engine node 
> depends on it, so I didn't think it is quit necessary to maintain its 
> own local data. But I agree it is better to be clear from the engine 
> node perspective. I can move the flow-table to en_flow_output data, and 
> update ofctrl module as consumer of that data.
> 
>  > Ideally, this entire thing would be doable without the need for the 
> engine_get_input() function. Each node would operate independently on 
> its own data. Doing this would aid in the ability to reason about what 
> each node is responsible for, and it would open the door for introducing 
> parallel processing of sibling nodes in the DAG.
> 
> Sorry that I didn't get this point. Each node would operate on its own 
> data but they also depends on their inputs, and that's why 
> engine_get_input() is here for. Did I misunderstand your point?

I think taking a second look at the patch has made things a bit more 
clear for me. In my initial reading, I thought that engine_get_input() 
was an anti-pattern since it was being used to look into the "private" 
data of another node. Now that I look again, it makes more sense that 
the input node data should be accessible since they provide input data 
for the parent node. You can ignore my initial finding.

> For parallel processing, I am a little hesitating, because the goal is 
> to reduce the CPU cost on HVs (to save CPU for real workloads). The 
> processing engine should be non-blocking, so if we need parallel 
> processing in the engine, it means we are requesting too much CPU on the 
> HV. I hope we don't need parallel processing for flow computing.

That's a good point.

> 
>  >
>  > All that being said, I would be happy to see a change like this go in 
> as-is (pending more in-depth code review, of course) if the data 
> encapsulation work would creep the scope out too much for the initial 
> changeset.
>  >
>  > Mark!
>  >
>  >
>  > On 02/20/2018 01:04 PM, Han Zhou wrote:
>  >>
>  >> 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 <http://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
>  >>
>  >



More information about the dev mailing list