Skip to content

Commit

Permalink
northd: Don't monitor most of northbound external IDs.
Browse files Browse the repository at this point in the history
ovn-northd copies external IDs from Logical Switch, Router and their
Port records to corresponding Southbound Datapath and Port Binding
records.  IDs in other tables are not used by northd in any way, so
there is no point in monitoring them.

CMSes tend to create a huge amount of external IDs for every record
to the point where they can take literally half of the database data.
In high scale clusters that can be several hundreds of MB.  Not
monitoring them saves a lot of time and memory while downloading
initial database snapshots on the first connection and should also
reduce the ongoing cost while new resources are being created.

Tested on a 500 MB Northbound DB that contains 1M ACLs created by
ovn-kubernetes in a test cluster mimicing a real world setup.

Before the change it took 20 seconds for the ovsdb-server to send out
an initial database snapshot and 12.8 seconds for ovn-northd to receive
it and run a full recompute, consuming 5.4 GB of RAM.  With the change
it takes 15 seconds on the database side and 7.5 seconds for northd,
consuming 2.9 GB of RAM.  (Note: the test was performed in a sandbox
with no OVN chassis connected, so northd didn't generate a lot of
logical flows for those ACLs.)

So, we saved:
 - 25% of CPU time on the database side.
 - 41% of CPU time on the ovn-northd side.
 - 2.5 GB (46%) of RAM on ovn-northd.

Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
  • Loading branch information
igsilya committed Sep 17, 2024
1 parent 2bdf112 commit 41896eb
Showing 1 changed file with 36 additions and 0 deletions.
36 changes: 36 additions & 0 deletions northd/ovn-northd.c
Original file line number Diff line number Diff line change
Expand Up @@ -820,6 +820,42 @@ main(int argc, char *argv[])
ovsdb_idl_omit_alert(ovnnb_idl_loop.idl,
&nbrec_nb_global_col_hv_cfg_timestamp);

/* Ignore northbound external IDs, except for logical switch, router and
* their ports, for which the external IDs are propagated to corresponding
* southbound datapath and port binding records. */
const struct ovsdb_idl_column *external_ids[] = {
&nbrec_acl_col_external_ids,
&nbrec_address_set_col_external_ids,
&nbrec_bfd_col_external_ids,
&nbrec_chassis_template_var_col_external_ids,
&nbrec_connection_col_external_ids,
&nbrec_copp_col_external_ids,
&nbrec_dhcp_options_col_external_ids,
&nbrec_dhcp_relay_col_external_ids,
&nbrec_dns_col_external_ids,
&nbrec_forwarding_group_col_external_ids,
&nbrec_gateway_chassis_col_external_ids,
&nbrec_ha_chassis_col_external_ids,
&nbrec_ha_chassis_group_col_external_ids,
&nbrec_load_balancer_col_external_ids,
&nbrec_load_balancer_health_check_col_external_ids,
&nbrec_logical_router_policy_col_external_ids,
&nbrec_logical_router_static_route_col_external_ids,
&nbrec_meter_col_external_ids,
&nbrec_meter_band_col_external_ids,
&nbrec_mirror_col_external_ids,
&nbrec_nat_col_external_ids,
&nbrec_nb_global_col_external_ids,
&nbrec_port_group_col_external_ids,
&nbrec_qos_col_external_ids,
&nbrec_ssl_col_external_ids,
&nbrec_sample_collector_col_external_ids,
&nbrec_sampling_app_col_external_ids,
};
for (size_t i = 0; i < ARRAY_SIZE(external_ids); i++) {
ovsdb_idl_omit(ovnnb_idl_loop.idl, external_ids[i]);
}

unixctl_command_register("nb-connection-status", "", 0, 0,
ovn_conn_show, ovnnb_idl_loop.idl);

Expand Down

0 comments on commit 41896eb

Please sign in to comment.