"dev" <dev-boun...@openvswitch.org> wrote on 07/26/2016 02:37:30 PM:

> From: "Liran Schour" <lir...@il.ibm.com>
> To: Ryan Moats/Omaha/IBM@IBMUS
> Cc: dev@openvswitch.org
> Date: 07/26/2016 02:38 PM
> Subject: Re: [ovs-dev] [ovs-dev,ovn-controller] Physical: persist tunnels
> Sent by: "dev" <dev-boun...@openvswitch.org>
>
> "dev" <dev-boun...@openvswitch.org> wrote on 26/07/2016 12:02:37 AM:
>
> > From: Flavio Fernandes <fla...@flaviof.com>
> > To: Ryan Moats <rmo...@us.ibm.com>
> > Cc: dev@openvswitch.org
> > Date: 26/07/2016 12:06 AM
> > Subject: Re: [ovs-dev] [ovs-dev,ovn-controller] Physical: persist
> tunnels
> > Sent by: "dev" <dev-boun...@openvswitch.org>
> >
> >
> > > On Jul 25, 2016, at 12:28 PM, Ryan Moats <rmo...@us.ibm.com> wrote:
> > >
> > > While commit ab39371d68842b7e4000cc5d8718e6fc04e92795
> > > (ovn-controller: Handle physical changes correctly) addressed
> > > unit test failures, it did so at the cost of performance: [1]
> > > notes that ovn-controller cpu usage is now pegged at 100%.
> > >
> > > Root cause of this is that while the storage for tunnels is
> > > persisted, their creation is not (which the above changed
> > > incorrectly assumed was the case).  This patch persists
> > > tunneled data across invocations of physical_run.  A side
> > > effect is that renaming of localfvif_map_changed variable
> > > to physical_map_changed and extending its scope to include
> > > tunnel changes.
> > >
> >
> > I tested this fix by using a Vagrant file that stamps out vms as
> > compute nodes.
> > To deploy ovn, call the script ?/vagrant/scripts/setup-ovn-
> > cluster.sh? and that
> > would render ovn-controller in compute nodes to peg the cpu at 100%
> before the
> > changes.
> >
> > More info on _easily_ deploying this cluster is available here:
> >
https://github.com/flavio-fernandes/just-ovn-nodes/blob/master/README.md
> >
> >
> > > [1] http://openvswitch.org/pipermail/dev/2016-July/076058.html
> > >
> > > Signed-off-by: Ryan Moats <rmo...@us.ibm.com>
> >
> > Acked-by: Flavio Fernandes <fla...@flaviof.com>
> > Tested-by: Flavio Fernandes <fla...@flaviof.com>
> >
>
> Tested this fix with a cluster of 50 hosts.
>
> Acked-by: Liran Schour <lir...@il.ibm.com>
> Tested-by: Liran Schour <lir...@il.ibm.com>

This patch fixes the 100% CPU unitization of ovn-controller. Without this
patch
the ovn-controller reaches 100% CPU in fresh deployment using
ovn-scale-test [1].
After applying this patch, the CPU utilization looks good.

[1] https://github.com/openvswitch/ovn-scale-test

Acked-by: Hui Kang <ka...@us.ibm.com>
Tested-by: Hui Kang <ka...@us.ibm.com>

>
> >
> > > ---
> > > ovn/controller/physical.c | 59 ++++++++++++++++++++++++++++
> > +------------------
> > > 1 file changed, 37 insertions(+), 22 deletions(-)
> > >
> > > diff --git a/ovn/controller/physical.c b/ovn/controller/physical.c
> > > index a104e33..e788fe5 100644
> > > --- a/ovn/controller/physical.c
> > > +++ b/ovn/controller/physical.c
> > > @@ -605,8 +605,13 @@ physical_run(struct controller_ctx *ctx, enum
> > mf_field_id mff_ovn_geneve,
> > >         uuid_generate(hc_uuid);
> > >     }
> > >
> > > +    /* This bool tracks physical mapping changes. */
> > > +    bool physical_map_changed = false;
> > > +
> > >     struct simap new_localvif_to_ofport =
> > >         SIMAP_INITIALIZER(&new_localvif_to_ofport);
> > > +    struct simap new_tunnel_to_ofport =
> > > +        SIMAP_INITIALIZER(&new_tunnel_to_ofport);
> > >     for (int i = 0; i < br_int->n_ports; i++) {
> > >         const struct ovsrec_port *port_rec = br_int->ports[i];
> > >         if (!strcmp(port_rec->name, br_int->name)) {
> > > @@ -668,18 +673,23 @@ physical_run(struct controller_ctx *ctx,
> > enum mf_field_id mff_ovn_geneve,
> > >                     continue;
> > >                 }
> > >
> > > -                struct chassis_tunnel *tun = xmalloc(sizeof *tun);
> > > -                hmap_insert(&tunnels, &tun->hmap_node,
> > > -                            hash_string(chassis_id, 0));
> > > -                tun->chassis_id = chassis_id;
> > > -                tun->ofport = u16_to_ofp(ofport);
> > > -                tun->type = tunnel_type;
> > > -                full_binding_processing = true;
> > > -                binding_reset_processing();
> > > -
> > > -                /* Reprocess logical flow table immediately. */
> > > -                lflow_reset_processing();
> > > -                poll_immediate_wake();
> > > +                simap_put(&new_tunnel_to_ofport, chassis_id,
ofport);
> > > +                struct chassis_tunnel *tun;
> > > +                if ((tun = chassis_tunnel_find(chassis_id))) {
> > > +                    /* If the tunnel's ofport has changed, update.
*/
> > > +                    if (tun->ofport != u16_to_ofp(ofport)) {
> > > +                        tun->ofport = u16_to_ofp(ofport);
> > > +                        physical_map_changed = true;
> > > +                    }
> > > +                } else {
> > > +                    tun = xmalloc(sizeof *tun);
> > > +                    hmap_insert(&tunnels, &tun->hmap_node,
> > > +                                hash_string(chassis_id, 0));
> > > +                    tun->chassis_id = chassis_id;
> > > +                    tun->ofport = u16_to_ofp(ofport);
> > > +                    tun->type = tunnel_type;
> > > +                    physical_map_changed = true;
> > > +                }
> > >                 break;
> > >             } else {
> > >                 const char *iface_id =
> smap_get(&iface_rec->external_ids,
> > > @@ -691,29 +701,38 @@ physical_run(struct controller_ctx *ctx,
> > enum mf_field_id mff_ovn_geneve,
> > >         }
> > >     }
> > >
> > > +    /* Remove tunnels that are no longer here. */
> > > +    struct chassis_tunnel *tun, *tun_next;
> > > +    HMAP_FOR_EACH_SAFE (tun, tun_next, hmap_node, &tunnels) {
> > > +        if (!simap_find(&new_tunnel_to_ofport, tun->chassis_id)) {
> > > +            hmap_remove(&tunnels, &tun->hmap_node);
> > > +            physical_map_changed = true;
> > > +            free(tun);
> > > +        }
> > > +    }
> > > +
> > >     /* Capture changed or removed openflow ports. */
> > > -    bool localvif_map_changed = false;
> > >     struct simap_node *vif_name, *vif_name_next;
> > >     SIMAP_FOR_EACH_SAFE (vif_name, vif_name_next,
&localvif_to_ofport)
> {
> > >         int newport;
> > >         if ((newport = simap_get(&new_localvif_to_ofport,
> > vif_name->name))) {
> > >             if (newport != simap_get(&localvif_to_ofport,
> vif_name->name)) {
> > >                 simap_put(&localvif_to_ofport, vif_name->name,
> newport);
> > > -                localvif_map_changed = true;
> > > +                physical_map_changed = true;
> > >             }
> > >         } else {
> > >             simap_find_and_delete(&localvif_to_ofport,
> vif_name->name);
> > > -            localvif_map_changed = true;
> > > +            physical_map_changed = true;
> > >         }
> > >     }
> > >     SIMAP_FOR_EACH (vif_name, &new_localvif_to_ofport) {
> > >         if (!simap_get(&localvif_to_ofport, vif_name->name)) {
> > >             simap_put(&localvif_to_ofport, vif_name->name,
> > >                       simap_get(&new_localvif_to_ofport,
> vif_name->name));
> > > -            localvif_map_changed = true;
> > > +            physical_map_changed = true;
> > >         }
> > >     }
> > > -    if (localvif_map_changed) {
> > > +    if (physical_map_changed) {
> > >         full_binding_processing = true;
> > >
> > >         /* Reprocess logical flow table immediately. */
> > > @@ -769,7 +788,6 @@ physical_run(struct controller_ctx *ctx, enum
> > mf_field_id mff_ovn_geneve,
> > >      * ports.  We set MFF_LOG_DATAPATH, MFF_LOG_INPORT, and
> > >      * MFF_LOG_OUTPORT from the tunnel key data, then resubmit to
> table
> > >      * 33 to handle packets to the local hypervisor. */
> > > -    struct chassis_tunnel *tun;
> > >     HMAP_FOR_EACH (tun, hmap_node, &tunnels) {
> > >         struct match match = MATCH_CATCHALL_INITIALIZER;
> > >         match_set_in_port(&match, tun->ofport);
> > > @@ -858,10 +876,7 @@ physical_run(struct controller_ctx *ctx, enum
> > mf_field_id mff_ovn_geneve,
> > >     ofctrl_add_flow(OFTABLE_DROP_LOOPBACK, 0, &match, &ofpacts,
> hc_uuid);
> > >
> > >     ofpbuf_uninit(&ofpacts);
> > > -    HMAP_FOR_EACH_POP (tun, hmap_node, &tunnels) {
> > > -        free(tun);
> > > -    }
> > > -    hmap_clear(&tunnels);
> > >
> > >     simap_destroy(&new_localvif_to_ofport);
> > > +    simap_destroy(&new_tunnel_to_ofport);
> > > }
> >
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
>
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to