[ovs-dev] [PATCHv2 4/5] bridge: Only store instant_stats on device changes

Joe Stringer joestringer at nicira.com
Thu Nov 14 23:28:28 UTC 2013


Previously, we iterated through all interfaces in instant_stats_run(),
grabbing up-to-date information about device status. After assembling
all of this information for all interfaces, we would determine whether
anything changed and only send an update to ovsdb-server if something
changed.

This patch uses the new global netdev_seq to determine whether there
have been any changes before polling all interfaces, which provides
further CPU usage savings. In a test environment of 5000 internal ports
and 50 tunnel ports with bfd, this reduces CPU usage to around 5%. When
ports change status more often than every 100ms, CPU usage will increase
to previous rates.

Signed-off-by: Joe Stringer <joestringer at nicira.com>
---
 vswitchd/bridge.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index 4a3b849..fdf0000 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -133,6 +133,7 @@ struct bridge {
     struct list ofpp_garbage;   /* "struct ofpp_garbage" slated for removal. */
     struct hmap if_cfg_todo;    /* "struct if_cfg"s slated for creation.
                                    Indexed on 'cfg->name'. */
+    uint64_t change_seq;        /* Track changes to netdev status. */
 
     /* Port mirroring. */
     struct hmap mirrors;        /* "struct mirror" indexed by UUID. */
@@ -2219,6 +2220,14 @@ instant_stats_run(void)
         HMAP_FOR_EACH (br, node, &all_bridges) {
             struct iface *iface;
             struct port *port;
+            uint64_t seq;
+
+            seq = netdev_change_seq();
+            if (seq == br->change_seq) {
+                continue;
+            } else {
+                br->change_seq = seq;
+            }
 
             br_refresh_stp_status(br);
 
@@ -2529,6 +2538,7 @@ bridge_wait(void)
 
         HMAP_FOR_EACH (br, node, &all_bridges) {
             ofproto_wait(br->ofproto);
+            netdev_seq_wait(br->change_seq);
         }
         poll_timer_wait_until(iface_stats_timer);
     }
-- 
1.7.9.5




More information about the dev mailing list