On 8/10/23 18:15, Han Zhou wrote: > Thanks Vladislav and Dumitru for reporting and fixing the issue. > The impact of the issue is more than just the memory spikes in > ovn-controller. More importantly, it incurs much higher load on SB DB > because the conditions are flooded with all the localnet ports regardless > of whether they belong to local datapaths. > Please see more details in a related fix I just posted: > https://patchwork.ozlabs.org/project/ovn/patch/20230810155351.2853369-1-hz...@ovn.org/ > > In addition, I want to comment on Dumitru's patch (sorry I still didn't see > you posted for review yet) > https://github.com/dceara/ovn/commit/f5e8b9bcba61a2528b67854bb4211981a99feaa8, > I think it is better to avoid using the "optional" version for port_binding > monitoring. For the same reason, if my patch above is not applied, the SB > DB overload problem is still there because the unconditional monitoring of > port_binding initially adds all localnet ports to local_lports and later to > the monitor conditions. In addition, if there are a huge amount of PBs, it > may still cause memory pressure. I understand the intention of avoiding > churns of building local_datapaths, but it may be better to be addressed in > a separate patch and we can review and discuss accordingly. >
The unfortunate part is the fact that the local datapath "churn" will also cause conntrack zones to be flushed and disrupt traffic. What's worse (in the ovn-k8s case) is that some of the zones (zone 0) might be shared with the host. So, just restarting ovn-controller (with conditional monitoring enabled) will trigger conntrack entries to be cleared for non-OVN sessions too. > Still, looking forward to the formal patch for this. > It's still on my todo list, I didn't get a chance to do this yet, sorry. Regards, Dumitru > Thanks, > Han > > On Tue, Aug 1, 2023 at 3:09 AM Vladislav Odintsov <odiv...@gmail.com> wrote: >> >> Hi Dumitru! >> >> I’ve performed test on the host, where ovn-controller (22.09.x) without > your patch and without any local datapaths consumed 3+GiB of ram after > start and the process start took 100% CPU during ~40 seconds after start. >> With your patch ovn-controller starts during ~5 seconds with max cpu > consumption seen in top ~35-36%. >> Memory consumption doesn’t exceed 220-222 MiB on the same host with same > NB/SB contents. >> >> Many thanks for this improvement! >> >> I guess after this patch got merged to main branch, it should be > backported down to 22.03 (branch, to which initial commit [0] introduced > such behaviour was backported). >> >> 0: > https://github.com/ovn-org/ovn/commit/525829c47d09a114de8536d23784c458977d8321 >> >>> On 31 Jul 2023, at 14:43, Vladislav Odintsov <odiv...@gmail.com> wrote: >>> >>> Thanks Dumitru! >>> >>> I’ll test this patch in a few days. >>> >>>> On 28 Jul 2023, at 14:36, Dumitru Ceara <dce...@redhat.com> wrote: >>>> >>>> Hi Vladislav, >>>> >>>> After quite some time trying to implement the IDL API change to allow >>>> setting a different default monitor condition and mostly struggling > with >>>> ovn-controller using that properly I kind of gave up and decided to >>>> approach this in a different way. >>>> >>>> We have guidelines about supported upgrade scenarios [0] so we can use >>>> the same guidelines for defining which tables ovn-controller is > entitled >>>> to assume exist in the SB (without having to check). >>>> >>>> I ended up with: >>>> > https://github.com/dceara/ovn/commit/f5e8b9bcba61a2528b67854bb4211981a99feaa8 >>>> >>>> I know it's not perfect but it might be the least risky and a good >>>> enough solution. >>>> >>>> It would be great if you could try it out on your data set too. >>>> >>>> Thanks, >>>> Dumitru >>>> >>>> [0] >>>> > https://github.com/ovn-org/ovn/blob/5a1d82cb28c554276e0c17718f808b8f244cb162/Documentation/intro/install/ovn-upgrades.rst?plain=1#L28 >>>> >>>> On 7/25/23 10:19, Vladislav Odintsov wrote: >>>>> Many thanks for the information! >>>>> >>>>>> On 25 Jul 2023, at 11:14, Dumitru Ceara <dce...@redhat.com> wrote: >>>>>> >>>>>> On 7/24/23 21:10, Vladislav Odintsov wrote: >>>>>>> Hi Dumitru, >>>>>>> >>>>>> >>>>>> Hi Vladislav, >>>>>> >>>>>>> I just wanted to ask wether you need any help (maybe, testing) in > this? >>>>>>> I’m ready to check this on my dataset if you were successful to >>>>>>> implement a fix. >>>>>>> >>>>>> >>>>>> Thanks for offering to help. I didn't get the chance to properly > write >>>>>> and test the patches for this (we need a change in OVS IDL first and >>>>>> then one in OVN). It would be great if you could try them out on > your >>>>>> data sets so I'll CC you on the patches when posting them. I hope > to do >>>>>> that this week. >>>>>> >>>>>> Regards, >>>>>> Dumitru >>>>>> >>>>>>>> On 12 Jul 2023, at 12:15, Dumitru Ceara <dce...@redhat.com> wrote: >>>>>>>> >>>>>>>> On 7/12/23 00:01, Ilya Maximets wrote: >>>>>>>>> On 7/11/23 19:01, Dumitru Ceara wrote: >>>>>>>>>> On 7/11/23 18:33, Vladislav Odintsov wrote: >>>>>>>>>>> Hi Dumitru, >>>>>>>>>>> >>>>>>>>>>> The system on which I reproduced this issue is running 22.09.x >>>>>>>>>>> version. I’ve tried to upgrade ovn-controller to main branch + > your >>>>>>>>>>> patch. Please, note that it has test error: [1]. >>>>>>>>>>> After two minutes after upgrade it still consumed 3.3G. >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Ack, I need to re-think the patch then. Maybe a hard deadline > to run >>>>>>>>>> malloc_trim() at least once every X seconds. I'll see what I > can come >>>>>>>>>> up with. >>>>>>>>>> >>>>>>>>>>> I tried to backport your patch to 22.09, it required to backport >>>>>>>>>>> also this commit: [2] and it failed some tests: [3]. >>>>>>>>>>> >>>>>>>>>>> But I’ve got general question: prior to commit that I mentioned > in >>>>>>>>>>> initial mail, ovn-controller even didn’t try load such amount of >>>>>>>>>>> data. And now it does and IIUC, your patch just releases memory >>>>>>>>>>> that was freed after ovn-controller fully loaded. >>>>>>>>>>> I’m wonder wether it should load that excess data at all? Seems >>>>>>>>>>> like it did. >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Looking again at 1b0dbde94070 ("ovn-controller: Only set monitor >>>>>>>>>> conditions on available tables.") it's kind of expected indeed: >>>>>>>>>> >>>>>>>>>> Initially all tables are "unavailable" because we didn't get the > schema >>>>>>>>>> so we don't set any condition for any table. >>>>>>>>>> >>>>>>>>>> After ovn-controller connects to the SB for the first time it > will >>>>>>>>>> determine that the SB tables are in the schema so it will > explicitly add >>>>>>>>>> them to the monitor condition and restrict the SB data it is >>>>>>>>>> interested in. >>>>>>>>>> >>>>>>>>>> Maybe we need to change the IDL/CS modules to wait with the >>>>>>>>>> monitor_cond/monitor_cond_since until instructed by the client >>>>>>>>>> (ovn-controller). Ilya do you have any thoughts on this matter? >>>>>>>>> >>>>>>>>> So, AFAICT, the issue is that we're running with >>>>>>>>> 'monitor_everything_by_default' >>>>>>>>> option, the default condition is 'true' and the monitor request > for >>>>>>>>> the main >>>>>>>>> database is sent out immediately after receiving the schema, so > the >>>>>>>>> application >>>>>>>>> has no time to react. >>>>>>>>> >>>>>>>>> I think, there are few possible solutions for this: >>>>>>>>> >>>>>>>>> 1. Introduce a new state in the CS state machine, e.g. >>>>>>>>> CS_S_SERVER_SCHEMA_RCEIVED, and move out from this state in the > run() >>>>>>>>> callback. This way the application will have a chance to set up >>>>>>>>> conditions >>>>>>>>> before they are sent. Slightly not intuitive. >>>>>>>>> >>>>>>>>> 2. A variation on what you suggested, i.e. enter the >>>>>>>>> CS_S_SERVER_SCHEMA_RCEIVED >>>>>>>>> state and wait for some sort of the signal from the application to >>>>>>>>> proceed. >>>>>>>>> Sounds a bit counter-intuitive for an IDL user. >>>>>>>>> >>>>>>>>> 3. Introduce an application callback that can be called from the >>>>>>>>> ovsdb_idl_compose_monitor_request() the same way as this function >>>>>>>>> is getting >>>>>>>>> called form the ovsdb_cs_send_monitor_request(). An application >>>>>>>>> will be >>>>>>>>> able to influence conditions before they are sent. >>>>>>>>> Might be tricky due to new->req->ack state transition. >>>>>>>>> >>>>>>>>> 4. Make the default condition configurable, e.g. by an additional >>>>>>>>> argument >>>>>>>>> 'default_condition' = true/false for an ovsdb_idl_create(). This >>>>>>>>> way the >>>>>>>>> application will not get any data until conditions are actually > set. >>>>>>>>> >>>>>>>>> 5. Or it maybe just a separate config function that will set > default >>>>>>>>> conditions >>>>>>>>> to 'false' and will need to be called before the first run(). >>>>>>>>> >>>>>>>>> 6. Change behavior of 'monitor_everything_by_default' argument. > Make it >>>>>>>>> actually add all the tables to the monitor, but with the 'false' >>>>>>>>> condition. >>>>>>>>> Result should technically be the same. Might be tricky to get >>>>>>>>> right though >>>>>>>>> with all the backward compatibility. >>>>>>>>> >>>>>>>>> Option 5 might be the better option of these. >>>>>>>>> >>>>>>>>> What do you think? >>>>>>>>> >>>>>>>> >>>>>>>> I think option 5 sounds the simplest to implement indeed. It also >>>>>>>> doesn't induce any compatibility issues as you mentioned. >>>>>>>> >>>>>>>> The only "issue" is we'd probably want this backported to stable > OVN >>>>>>>> releases so it means we need to bump the submodule version to an >>>>>>>> unreleased version of OVS. But that's an OVN problem and we > discussed >>>>>>>> similar instances of it before. >>>>>>>> >>>>>>>> I'll prepare a patch soon. >>>>>>>> >>>>>>>> Best regards, >>>>>>>> Dumitru >>>>>>> >>>>>>> >>>>>>> Regards, >>>>>>> Vladislav Odintsov >>>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> dev mailing list >>>>>> d...@openvswitch.org <mailto:d...@openvswitch.org> >>>>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >>>>> >>>>> >>>>> Regards, >>>>> Vladislav Odintsov >>>>> >>>>> _______________________________________________ >>>>> dev mailing list >>>>> d...@openvswitch.org >>>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >>>> >>>> _______________________________________________ >>>> dev mailing list >>>> d...@openvswitch.org >>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >>> >>> >>> Regards, >>> Vladislav Odintsov >>> >>> _______________________________________________ >>> dev mailing list >>> d...@openvswitch.org >>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >> >> >> Regards, >> Vladislav Odintsov >> >> _______________________________________________ >> dev mailing list >> d...@openvswitch.org >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev