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>
Mon, 1 Apr 2013 19:22:58 +0000 (12:22 -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 6fe5548..62c7f31 100644 (file)
@@ -486,6 +486,8 @@ struct facet {
      * overhead.  (A facet always has at least one subfacet and in the common
      * case has exactly one subfacet.) */
     struct subfacet one_subfacet;
+
+    long long int learn_rl;      /* Rate limiter for facet_learn(). */
 };
 
 static struct facet *facet_create(struct rule_dpif *,
@@ -4363,6 +4365,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;
 }
 
@@ -4439,6 +4443,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