ofproto-dpif: Rate limit calls to facet_learn().
authorEthan Jackson <ethan@nicira.com>
Fri, 22 Mar 2013 02:40:49 +0000 (19:40 -0700)
committerEthan Jackson <ethan@nicira.com>
Wed, 27 Mar 2013 17:39:45 +0000 (10:39 -0700)
In the TCP_CRR benchmark, ovs-vswitchd spends so much time in
update_stats() that it has a significant impact on flow setup
performance.  Further work is needed in this area, but for now,
simply rate limiting facet_learn() has a roughly 10% improvement
with complex flow tables.

Signed-off-by: Ethan Jackson <ethan@nicira.com>
ofproto/ofproto-dpif.c

index 30094f6..915d2d0 100644 (file)
@@ -491,6 +491,8 @@ struct facet {
      * always be valid, since it could have been removed after newer
      * subfacets were pushed onto the 'subfacets' list.) */
     struct subfacet one_subfacet;
+
+    long long int learn_rl;      /* Rate limiter for facet_learn(). */
 };
 
 static struct facet *facet_create(struct rule_dpif *,
@@ -4376,6 +4378,8 @@ facet_create(struct rule_dpif *rule, const struct flow *flow, uint32_t hash)
     netflow_flow_init(&facet->nf_flow);
     netflow_flow_update_time(ofproto->netflow, &facet->nf_flow, facet->used);
 
+    facet->learn_rl = time_msec() + 500;
+
     return facet;
 }
 
@@ -4452,6 +4456,12 @@ facet_learn(struct facet *facet)
                                             struct subfacet, list_node);
     struct action_xlate_ctx ctx;
 
+    if (time_msec() < facet->learn_rl) {
+        return;
+    }
+
+    facet->learn_rl = time_msec() + 500;
+
     if (!facet->has_learn
         && !facet->has_normal
         && (!facet->has_fin_timeout