Hi, Just as a follow up, after setting the other_config:broadcast-arps-to-all-routers=false parameter on all external networks, number of packets sent to the ovn-controller went down from around 120-130 p/s to 1-3/s. Most of our ports in external networks are router ports, so this parameter helps a lot.
Thanks Piotr Misiak pon., 17 lut 2025, 16:37 użytkownik Piotr Misiak <piotrmisiak1...@gmail.com> napisał: > Hi, > > On 17.02.2025 08:59, Felix Huettner wrote: > > On Mon, Feb 17, 2025 at 08:33:10AM +0100, Ales Musil via discuss wrote: > >> On Fri, Feb 14, 2025 at 3:57 PM Piotr Misiak via discuss < > >> ovs-discuss@openvswitch.org> wrote: > >> > >>> Hi, > >>> > >> Hi Piotr, > >> > >> thank you for contacting us. > >> > >> > >>> We are running several OpenStack/OVN regions with different sizes. > >>> All of them have external networks connected to the Internet. > >>> We are receiving a lot of packets to non used (non provisioned) > >>> destination IP addresses, I guess some bots scanning Internet. > >>> This creates a lot of ARP requests which cannot be replied, because > >>> those IP addresses are not configured anywhere yet. > >>> > >>> Few days ago we upgraded one of our regions from OVN 22.09 to OVN > >>> 24.03 and basically we suddenly started having critical issues with > >>> DNS resolving on VMs running in the OpenStack. > >>> Generally non of DNS requests were successful, some of them was going > >>> back after 5 minutes, sometimes even after 30 minutes. Yes, minutes > >>> not seconds. > >>> > >> Slightly related, there was recently an improvement to DNS handling > >> where the cache is no longer processed by pinctrl only [0], then > >> later on there was another addition to avoid mutex contention as > >> much as possible [1]. I believe that both of those would help in > >> your case to some extent. > >> > >> > >> > >>> After some debugging we identified problematic OpenFlow flows which > >>> send ARP request packets to ovn-controllers. > >>> Those flows are created because we have around 400 ports in the > >>> external-network and packet flooding flow have to be splitted. > >>> Those flows are installed at the beginning of OF 39 table with > >>> priority 110 which includes 170 resubmits: > >>> > >> Those flows are related to multicast groups, in this case the > "_MC_flood". > >> > >> > >>> cookie=0x28ef9c32, duration=829.596s, table=39, n_packets=117482, > >>> n_bytes=4947460, idle_age=0, hard_age=58, > >>> priority=110,reg6=0x9001,reg15=0x8000,metadata=0xba > >>> > >>> > actions=load:0->NXM_NX_REG6[],load:0x5a3->NXM_NX_REG15[],resubmit(,41),load:0x21af->NXM_NX_REG15[],resubmit(,41),load:0x8f->NXM_NX_REG15[],resubmit(,41),load:0x1374->NXM_NX_REG15[],resubmit(,41),load:0x5f->NXM_NX_REG15[],resubmit(,41),load:0x10b->NXM_NX_REG15[],resubmit(,41),load:0x106->NXM_NX_REG15[],resubmit(,41),load:0x13d9->NXM_NX_REG15[],resubmit(,41),load:0x4d->NXM_NX_REG15[],resubmit(,41),load:0x2202->NXM_NX_REG15[],resubmit(,41),load:0xb4->NXM_NX_REG15[],resubmit(,41),load:0x25ed->NXM_NX_REG15[],resubmit(,41),load:0x1b59->NXM_NX_REG15[],resubmit(,41),load:0x26b2->NXM_NX_REG15[],resubmit(,41),load:0x6a->NXM_NX_REG15[],resubmit(,41) > >>> <<< CUT >>> > >>> > >>> > load:0x169a->NXM_NX_REG15[],resubmit(,41),controller(userdata=00.00.00.1b.00.00.00.00.00.00.90.01.00.00.80.00.27) > >>> > >>> there is also second rule with 170 resubmits with controller() at the > end: > >>> controller(userdata=00.00.00.1b.00.00.00.00.00.00.90.02.00.00.80.00.27) > >>> > >>> and also third rule with smaller number of resubmits without > >>> controller. In total we have around 400 resubmits. > >>> > >>> This was introduced in 24.03 version by this commit: > >>> > >>> > https://github.com/ovn-org/ovn/commit/325c7b203d8bfd12bc1285ad11390c1a55cd6717 > >>> > >>> What we see in the ovn-controller logs: > >>> > >>> 2025-02-12T20:35:41.490Z|10791|pinctrl(ovn_pinctrl0)|DBG|pinctrl > >>> received packet-in | opcode=unrecognized(27)| OF_Table_ID=39| > >>> OF_Cookie_ID=0x28ef9c32| in-port=60| src-mac=4e:15:bc:ac:36:45, > >>> dst-mac=ff:ff:ff:ff:ff:ff| src-ip=A.A.A.A, dst-ip=B.B.B.B > >>> 2025-02-12T20:35:41.500Z|10792|pinctrl(ovn_pinctrl0)|DBG|pinctrl > >>> received packet-in | opcode=unrecognized(27)| OF_Table_ID=39| > >>> OF_Cookie_ID=0x28ef9c32| in-port=65533| src-mac=4e:15:bc:ac:36:45, > >>> dst-mac=ff:ff:ff:ff:ff:ff| src-ip=A.A.A.A, dst-ip=B.B.B.B > >>> > >>> as you can see the same packet is looped thru the ovn-controller > >>> twice. It's because we have 400 ports and this is covered by three > >>> OpenFlow flows. > >>> > >>> The funny thing is that those packets are dropped at the end of > >>> OpenFlow table chain in the datapath. So they kill our ovn-controllers > >>> performance to be finally dropped. > >>> I'm including a small part of packet trace result here: > >>> > >>> 39. reg15=0x8000,metadata=0xba, priority 100, cookie 0x28ef9c32 > >>> set_field:0->reg6 > >>> set_field:0xe8->reg15 > >>> resubmit(,41) > >>> 41. priority 0 > >>> set_field:0->reg0 > >>> set_field:0->reg1 > >>> set_field:0->reg2 > >>> set_field:0->reg3 > >>> set_field:0->reg4 > >>> set_field:0->reg5 > >>> set_field:0->reg6 > >>> set_field:0->reg7 > >>> set_field:0->reg8 > >>> set_field:0->reg9 > >>> resubmit(,42) > >>> 42. metadata=0xba, priority 0, cookie 0x3372823b > >>> resubmit(,43) > >>> 43. metadata=0xba,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00, > >>> priority 110, cookie 0xaabcf4fa > >>> resubmit(,44) > >>> 44. metadata=0xba, priority 0, cookie 0x9b7d541f > >>> resubmit(,45) > >>> 45. metadata=0xba, priority 65535, cookie 0xedb6d3de > >>> resubmit(,46) > >>> 46. metadata=0xba, priority 65535, cookie 0x1dbceae > >>> resubmit(,47) > >>> 47. metadata=0xba, priority 0, cookie 0xc1c2a264 > >>> resubmit(,48) > >>> 48. metadata=0xba, priority 0, cookie 0x640d65ba > >>> resubmit(,49) > >>> 49. metadata=0xba, priority 0, cookie 0x78f2abc0 > >>> resubmit(,50) > >>> 50. metadata=0xba, priority 0, cookie 0x7b63c11c > >>> resubmit(,51) > >>> 51. metadata=0xba,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00, > >>> priority 100, cookie 0xb055fd1c > >>> set_field:0/0x8000000000000000000000000000->xxreg0 > >>> resubmit(,52) > >>> 52. metadata=0xba, priority 0, cookie 0x4dd5d603 > >>> resubmit(,64) > >>> 64. priority 0 > >>> resubmit(,65) > >>> 65. reg15=0xe8,metadata=0xba, priority 100, cookie 0xfab6eb > >>> > >>> > clone(ct_clear,set_field:0->reg11,set_field:0->reg12,set_field:0/0xffff->reg13,set_field:0x25b->reg11,set_field:0x30a->reg12,set_field:0x252->metadata,set_field:0x1->reg14,set_field:0->reg10,set_field:0->reg15,set_field:0->reg0,set_field:0->reg1,set_field:0->reg2,set_field:0->reg3,set_field:0->reg4,set_field:0->reg5,set_field:0->reg6,set_field:0->reg7,set_field:0->reg8,set_field:0->reg9,resubmit(,8)) > >>> ct_clear > >>> set_field:0->reg11 > >>> set_field:0->reg12 > >>> set_field:0/0xffff->reg13 > >>> set_field:0x25b->reg11 > >>> set_field:0x30a->reg12 > >>> set_field:0x252->metadata > >>> set_field:0x1->reg14 > >>> set_field:0->reg10 > >>> set_field:0->reg15 > >>> set_field:0->reg0 > >>> set_field:0->reg1 > >>> set_field:0->reg2 > >>> set_field:0->reg3 > >>> set_field:0->reg4 > >>> set_field:0->reg5 > >>> set_field:0->reg6 > >>> set_field:0->reg7 > >>> set_field:0->reg8 > >>> set_field:0->reg9 > >>> resubmit(,8) > >>> 8. > >>> reg14=0x1,metadata=0x252,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00, > >>> priority 50, cookie 0x33587607 > >>> > >>> > set_field:0xfa163e9f2f460000000000000000/0xffffffffffff0000000000000000->xxreg0 > >>> resubmit(,9) > >>> 9. metadata=0x252, priority 0, cookie 0x671d3d97 > >>> set_field:0x4/0x4->xreg4 > >>> resubmit(,10) > >>> 10. reg9=0x4/0x4,metadata=0x252, priority 100, cookie > 0xd21e0659 > >>> resubmit(,79) > >>> 79. reg0=0x2, priority 0 > >>> drop > >>> resubmit(,11) > >>> 11. arp,metadata=0x252, priority 85, cookie 0xb5758416 > >>> drop > >>> > >>> > >>> What we can do to improve those ARP packets handling to not to send > >>> them to ovn-controllers? > >>> > >> I'm not sure if there is a way to not send them to ovn-controller when > >> the multicast group is large. > >> > >> > >>> Maybe they can be dropped somewhere earlier in the table chain? They > >>> are requesting a MAC address which OVN doesn't know. Why it tries to > >>> flood it to all router ports in the external network? > >>> > >> > >> At this point in the pipeline OVN doesn't know that this IP/MAC is > >> unknown. And because the packet is multicast one OVN basically does > >> what a normal network would do, flood it to all ports on the switch. > > Hi Ales, Hi Piotr, > > > > we had a similar issue in the past. > > However i am not sure if our solution will also work in your case. > > > > What we did is configure the external LS (so the one that does all this > > flooding) with other_config:broadcast-arps-to-all-routers=false. > > This ensures that any arp/nd request that is not handled by the arp > > responder flows is not flooded to LRs. > > In your case that would probably mean it will drop the packets. > > > > Note that this breaks GARPs from the upstream switches since they will > > be dropped too. In our case that is not an issue since we use stable > > virtual mac/ip's. > > > > Let me know if that helps. If not then we will also need to find a > > solution for this on our upcoming 24.03 upgrade :) > > > > Thanks a lot, > > Felix > > > > This is a very helpful hint. First tests show that this will fix our > issue and also issues with 4096 resubmit limit. > > I will let you know if setting > other_config:broadcast-arps-to-all-routers=false on our production > regions lowered number of packets sent to ovn-controller. > > Thank you Felix! > > > >> > >>> Maybe we can implement this "too big" OpenFlow rule in a different way > >>> and loop it inside the fast datapath, if possible? > >>> > >> Unfortunately not, OvS would still try to fit it into a single buffer > >> it doesn't matter if it's one long action or multiple resubmits. > >> Unless there is a action that needs to be executed before > >> continuation e.g. controller action, we would still have the issue > >> that the commit tried to fix. > >> > >> > >> > >>> I also noticed that IPv6 NS packets are processed via ovn-controller. > >>> Why OVS can't create responses inside the fast datapath in a similar > >>> way it creates responses to the ARP requests for known MACs? > >>> > >> This is a known limitation of OvS, there was an attempt to make it > >> work, however it didn't lead anywhere [2]. We should probably try > >> to revisit this. Once there is OvS support we could easily change > >> it in OVN to do it directly as we do for ARP. > >> > >> > >> > >>> This issue had a big influence on our cloud, because the same > >>> ovn-controller thread is responsible for DHCP, DNS interception, IPv6 > >>> NS packets and when they were overloaded all those services were not > >>> working. > >>> > >>> Another thing, quite misleading, are those "opcode=unrecognized(27)" > >>> in the ovn-controller log, which are unrecognized only because I guess > >>> the mentioned commit haven't added new action name mapping somewhere > >>> here: > >>> > >>> > https://github.com/ovn-org/ovn/blob/ed2790153c07a376890f28b0a16bc321e3af016b/lib/actions.c#L5977 > >> > >> Good catch, we might be actually missing more of those looking at it. > >> > >> > >>> To recover our region we disabled the DNS interception and lowered > >>> number of ARP requests by increasing > >>> "net.ipv4.neigh.default.retrans_time_ms" on our upstream gateways. > >>> Those changes lowered number of packets sent to ovn-controllers from > >>> around 500 p/s to 200 p/s and stabilized our region. > >>> Nevertheless this OVN performance issue is still there. > >>> > >> If I may suggest another potential mitigation might be to add > >> stateless ACL that will ensure the ARP packets are dropped before > >> reaching the flood flows. Would that be an option? This would really > >> be just mitigation until we have a proper solution. Speaking about > >> proper solution, given the need for this, the proper solution would > >> probably be CoPP for this controller action so we don't end up with > >> overloaded pinctrl thread. There is a downside to CoPP as we might > >> drop legitimate packets that need flooding. > >> > >> > >>> Thanks for your attention, > >>> Piotr Misiak > >>> _______________________________________________ > >>> discuss mailing list > >>> disc...@openvswitch.org > >>> https://mail.openvswitch.org/mailman/listinfo/ovs-discuss > >>> > >>> > >> Thanks, > >> Ales > >> > >> [0] https://github.com/ovn-org/ovn/commit/817d4e53 > >> [1] https://github.com/ovn-org/ovn/commit/eba60b27 > >> [2] > >> > http://patchwork.ozlabs.org/project/openvswitch/patch/20200928134947.48269-1-fankaixi...@bytedance.com > >> _______________________________________________ > >> discuss mailing list > >> disc...@openvswitch.org > >> https://mail.openvswitch.org/mailman/listinfo/ovs-discuss >
_______________________________________________ discuss mailing list disc...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-discuss