Sure, I'll do that quickly,
On Mon, Sep 30, 2013 at 6:05 PM, Ethan Jackson <et...@nicira.com> wrote: > Both of these look good to me. Would you please rebase them and send > them out. Then I'll merge. > > Ethan > > On Tue, Sep 24, 2013 at 5:54 PM, Alex Wang <al...@nicira.com> wrote: > > So far, the subfacet rates (e.g. add rate, del rate) are computed by > > exponential moving averaging function in ofproto-dpif.c. This commit > > replaces that logic with coverage counters. And the rates can be > > checked by running "ovs-appctl coverage/show" command. > > > > Signed-off-by: Alex Wang <al...@nicira.com> > > --- > > ofproto/ofproto-dpif.c | 101 > ++++-------------------------------------------- > > tests/ofproto-dpif.at | 4 -- > > tests/tunnel.at | 26 ++++++------- > > 3 files changed, 21 insertions(+), 110 deletions(-) > > > > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > > index 80874b8..5ddd71d 100644 > > --- a/ofproto/ofproto-dpif.c > > +++ b/ofproto/ofproto-dpif.c > > @@ -72,6 +72,10 @@ COVERAGE_DEFINE(facet_changed_rule); > > COVERAGE_DEFINE(facet_revalidate); > > COVERAGE_DEFINE(facet_unexpected); > > COVERAGE_DEFINE(facet_suppress); > > +COVERAGE_DEFINE(facet_create); > > +COVERAGE_DEFINE(facet_remove); > > +COVERAGE_DEFINE(subfacet_create); > > +COVERAGE_DEFINE(subfacet_destroy); > > COVERAGE_DEFINE(subfacet_install_fail); > > COVERAGE_DEFINE(packet_in_overflow); > > COVERAGE_DEFINE(flow_mod_overflow); > > @@ -437,20 +441,6 @@ struct dpif_backer { > > unsigned avg_n_subfacet; /* Average number of flows. */ > > long long int avg_subfacet_life; /* Average life span of subfacets. > */ > > > > - /* The average number of subfacets... */ > > - struct avg_subfacet_rates hourly; /* ...over the last hour. */ > > - struct avg_subfacet_rates daily; /* ...over the last day. */ > > - struct avg_subfacet_rates lifetime; /* ...over the switch lifetime. > */ > > - long long int last_minute; /* Last time 'hourly' was > updated. */ > > - > > - /* Number of subfacets added or deleted since 'last_minute'. */ > > - unsigned subfacet_add_count; > > - unsigned subfacet_del_count; > > - > > - /* Number of subfacets added or deleted from 'created' to > 'last_minute.' */ > > - unsigned long long int total_subfacet_add_count; > > - unsigned long long int total_subfacet_del_count; > > - > > /* Number of upcall handling threads. */ > > unsigned int n_handler_threads; > > }; > > @@ -459,7 +449,6 @@ struct dpif_backer { > > static struct shash all_dpif_backers = > SHASH_INITIALIZER(&all_dpif_backers); > > > > static void drop_key_clear(struct dpif_backer *); > > -static void update_moving_averages(struct dpif_backer *backer); > > > > struct ofproto_dpif { > > struct hmap_node all_ofproto_dpifs_node; /* In 'all_ofproto_dpifs'. > */ > > @@ -1217,14 +1206,6 @@ open_dpif_backer(const char *type, struct > dpif_backer **backerp) > > > > backer->max_n_subfacet = 0; > > backer->created = time_msec(); > > - backer->last_minute = backer->created; > > - memset(&backer->hourly, 0, sizeof backer->hourly); > > - memset(&backer->daily, 0, sizeof backer->daily); > > - memset(&backer->lifetime, 0, sizeof backer->lifetime); > > - backer->subfacet_add_count = 0; > > - backer->subfacet_del_count = 0; > > - backer->total_subfacet_add_count = 0; > > - backer->total_subfacet_del_count = 0; > > backer->avg_n_subfacet = 0; > > backer->avg_subfacet_life = 0; > > > > @@ -3739,8 +3720,6 @@ update_stats(struct dpif_backer *backer) > > run_fast_rl(); > > } > > dpif_flow_dump_done(&dump); > > - > > - update_moving_averages(backer); > > } > > > > /* Calculates and returns the number of milliseconds of idle time after > which > > @@ -3923,6 +3902,7 @@ facet_create(const struct flow_miss *miss) > > struct facet *facet; > > struct match match; > > > > + COVERAGE_INC(facet_create); > > facet = xzalloc(sizeof *facet); > > facet->ofproto = miss->ofproto; > > facet->used = miss->stats.used; > > @@ -3986,6 +3966,7 @@ facet_remove(struct facet *facet) > > { > > struct subfacet *subfacet, *next_subfacet; > > > > + COVERAGE_INC(facet_remove); > > ovs_assert(!list_is_empty(&facet->subfacets)); > > > > /* First uninstall all of the subfacets to get final statistics. */ > > @@ -4523,6 +4504,7 @@ subfacet_create(struct facet *facet, struct > flow_miss *miss) > > subfacet = xmalloc(sizeof *subfacet); > > } > > > > + COVERAGE_INC(subfacet_create); > > hmap_insert(&backer->subfacets, &subfacet->hmap_node, key_hash); > > list_push_back(&facet->subfacets, &subfacet->list_node); > > subfacet->facet = facet; > > @@ -4535,7 +4517,6 @@ subfacet_create(struct facet *facet, struct > flow_miss *miss) > > subfacet->path = SF_NOT_INSTALLED; > > subfacet->backer = backer; > > > > - backer->subfacet_add_count++; > > return subfacet; > > } > > > > @@ -4545,11 +4526,8 @@ static void > > subfacet_destroy__(struct subfacet *subfacet) > > { > > struct facet *facet = subfacet->facet; > > - struct ofproto_dpif *ofproto = facet->ofproto; > > - > > - /* Update ofproto stats before uninstall the subfacet. */ > > - ofproto->backer->subfacet_del_count++; > > > > + COVERAGE_INC(subfacet_destroy); > > subfacet_uninstall(subfacet); > > hmap_remove(&subfacet->backer->subfacets, &subfacet->hmap_node); > > list_remove(&subfacet->list_node); > > @@ -5637,21 +5615,12 @@ ofproto_unixctl_dpif_dump_dps(struct > unixctl_conn *conn, int argc OVS_UNUSED, > > } > > > > static void > > -show_dp_rates(struct ds *ds, const char *heading, > > - const struct avg_subfacet_rates *rates) > > -{ > > - ds_put_format(ds, "%s add rate: %5.3f/min, del rate: %5.3f/min\n", > > - heading, rates->add_rate, rates->del_rate); > > -} > > - > > -static void > > dpif_show_backer(const struct dpif_backer *backer, struct ds *ds) > > { > > const struct shash_node **ofprotos; > > struct ofproto_dpif *ofproto; > > struct shash ofproto_shash; > > uint64_t n_hit, n_missed; > > - long long int minutes; > > size_t i; > > > > n_hit = n_missed = 0; > > @@ -5669,15 +5638,6 @@ dpif_show_backer(const struct dpif_backer > *backer, struct ds *ds) > > backer->avg_n_subfacet, backer->max_n_subfacet, > > backer->avg_subfacet_life); > > > > - minutes = (time_msec() - backer->created) / (1000 * 60); > > - if (minutes >= 60) { > > - show_dp_rates(ds, "\thourly avg:", &backer->hourly); > > - } > > - if (minutes >= 60 * 24) { > > - show_dp_rates(ds, "\tdaily avg:", &backer->daily); > > - } > > - show_dp_rates(ds, "\toverall avg:", &backer->lifetime); > > - > > shash_init(&ofproto_shash); > > ofprotos = get_ofprotos(&ofproto_shash); > > for (i = 0; i < shash_count(&ofproto_shash); i++) { > > @@ -6230,51 +6190,6 @@ odp_port_to_ofp_port(const struct ofproto_dpif > *ofproto, odp_port_t odp_port) > > } > > } > > > > -/* Compute exponentially weighted moving average, adding 'new' as the > newest, > > - * most heavily weighted element. 'base' designates the rate of decay: > after > > - * 'base' further updates, 'new''s weight in the EWMA decays to about > 1/e > > - * (about .37). */ > > -static void > > -exp_mavg(double *avg, int base, double new) > > -{ > > - *avg = (*avg * (base - 1) + new) / base; > > -} > > - > > -static void > > -update_moving_averages(struct dpif_backer *backer) > > -{ > > - const int min_ms = 60 * 1000; /* milliseconds in one minute. */ > > - long long int minutes = (time_msec() - backer->created) / min_ms; > > - > > - if (minutes > 0) { > > - backer->lifetime.add_rate = (double) > backer->total_subfacet_add_count > > - / minutes; > > - backer->lifetime.del_rate = (double) > backer->total_subfacet_del_count > > - / minutes; > > - } else { > > - backer->lifetime.add_rate = 0.0; > > - backer->lifetime.del_rate = 0.0; > > - } > > - > > - /* Update hourly averages on the minute boundaries. */ > > - if (time_msec() - backer->last_minute >= min_ms) { > > - exp_mavg(&backer->hourly.add_rate, 60, > backer->subfacet_add_count); > > - exp_mavg(&backer->hourly.del_rate, 60, > backer->subfacet_del_count); > > - > > - /* Update daily averages on the hour boundaries. */ > > - if ((backer->last_minute - backer->created) / min_ms % 60 == > 59) { > > - exp_mavg(&backer->daily.add_rate, 24, > backer->hourly.add_rate); > > - exp_mavg(&backer->daily.del_rate, 24, > backer->hourly.del_rate); > > - } > > - > > - backer->total_subfacet_add_count += backer->subfacet_add_count; > > - backer->total_subfacet_del_count += backer->subfacet_del_count; > > - backer->subfacet_add_count = 0; > > - backer->subfacet_del_count = 0; > > - backer->last_minute += min_ms; > > - } > > -} > > - > > const struct ofproto_class ofproto_dpif_class = { > > init, > > enumerate_types, > > diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at > > index 0a63299..0a1a2ef 100644 > > --- a/tests/ofproto-dpif.at > > +++ b/tests/ofproto-dpif.at > > @@ -2108,7 +2108,6 @@ ADD_OF_PORTS([br1], [3]) > > AT_CHECK([ovs-appctl dpif/show], [0], [dnl > > dummy@ovs-dummy: hit:0 missed:0 > > flows: cur: 0, avg: 0, max: 0, life span: 0ms > > - overall avg: add rate: 0.000/min, del rate: 0.000/min > > br0: hit:0 missed:0 > > br0 65534/100: (dummy) > > p1 1/1: (dummy) > > @@ -2201,7 +2200,6 @@ warped > > AT_CHECK([ovs-appctl dpif/show], [0], [dnl > > dummy@ovs-dummy: hit:13 missed:2 > > flows: cur: 2, avg: 1, max: 2, life span: 1250ms > > - overall avg: add rate: 0.000/min, del rate: 0.000/min > > br0: hit:9 missed:1 > > br0 65534/100: (dummy) > > p2 2/2: (dummy) > > @@ -2253,8 +2251,6 @@ AT_CHECK([ovs-appctl time/warp 10000], [0], [warped > > AT_CHECK([ovs-appctl dpif/show | sed 's/ 10[[0-9]]\{3\}(ms)$/ > 10000(ms)/'], [0], [dnl > > dummy@ovs-dummy: hit:0 missed:61 > > flows: cur: 0, avg: 0, max: 1, life span: 1666ms > > - hourly avg: add rate: 0.641/min, del rate: 0.641/min > > - overall avg: add rate: 1.000/min, del rate: 1.000/min > > br0: hit:0 missed:61 > > br0 65534/100: (dummy) > > p1 1/1: (dummy) > > diff --git a/tests/tunnel.at b/tests/tunnel.at > > index 697c217..982d22a 100644 > > --- a/tests/tunnel.at > > +++ b/tests/tunnel.at > > @@ -14,7 +14,7 @@ actions=IN_PORT > > > > AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (gre: remote_ip=1.1.1.1) > > p2 2/1: (gre: local_ip=2.2.2.2, remote_ip=1.1.1.1) > > @@ -37,7 +37,7 @@ dnl reconfigure, local_ip, remote_ip > > AT_CHECK([ovs-vsctl set Interface p2 type=gre options:local_ip=2.2.2.3 \ > > options:df_default=false options:ttl=1 options:csum=true \ > > -- set Interface p3 type=gre64]) > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (gre: remote_ip=1.1.1.1) > > p2 2/1: (gre: csum=true, df_default=false, > local_ip=2.2.2.3, remote_ip=1.1.1.1, ttl=1) > > @@ -72,7 +72,7 @@ actions=2 > > > > AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (gre: remote_ip=1.1.1.1) > > p2 2/2: (dummy) > > @@ -116,7 +116,7 @@ actions=output:1 > > > > AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (gre: key=5, local_ip=2.2.2.2, remote_ip=1.1.1.1) > > p2 2/2: (dummy) > > @@ -148,7 +148,7 @@ actions=output:1 > > > > AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (gre: remote_ip=1.1.1.1, tos=inherit, > ttl=inherit) > > p2 2/2: (dummy) > > @@ -190,7 +190,7 @@ > actions=set_tunnel:1,output:1,set_tunnel:2,output:2,set_tunnel:3,output:3,set_tu > > > > AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (gre: key=flow, remote_ip=1.1.1.1) > > p2 2/1: (gre: key=flow, remote_ip=2.2.2.2) > > @@ -222,7 +222,7 @@ actions=IN_PORT,output:1,output:2,output:3 > > > > AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (gre: key=1, remote_ip=1.1.1.1) > > p2 2/1: (gre: in_key=2, out_key=3, remote_ip=1.1.1.1) > > @@ -274,7 +274,7 @@ tun_id=4,actions=output:5 > > > > AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (gre: key=flow, remote_ip=1.1.1.1) > > p2 2/1: (gre: key=3, remote_ip=3.3.3.3) > > @@ -310,7 +310,7 @@ AT_SETUP([tunnel - VXLAN]) > > OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=vxlan \ > > options:remote_ip=1.1.1.1 ofport_request=1]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (vxlan: remote_ip=1.1.1.1) > > ]) > > @@ -322,7 +322,7 @@ AT_SETUP([tunnel - LISP]) > > OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=lisp \ > > options:remote_ip=1.1.1.1 ofport_request=1]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (lisp: remote_ip=1.1.1.1) > > ]) > > @@ -334,7 +334,7 @@ AT_SETUP([tunnel - different VXLAN UDP port]) > > OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=vxlan \ > > options:remote_ip=1.1.1.1 ofport_request=1 > options:dst_port=4341]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (vxlan: dst_port=4341, remote_ip=1.1.1.1) > > ]) > > @@ -343,7 +343,7 @@ dnl change UDP port > > > > AT_CHECK([ovs-vsctl -- set Interface p1 options:dst_port=5000]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/2: (vxlan: dst_port=5000, remote_ip=1.1.1.1) > > ]) > > @@ -352,7 +352,7 @@ dnl change UDP port to default > > > > AT_CHECK([ovs-vsctl -- set Interface p1 options:dst_port=4789]) > > > > -AT_CHECK([ovs-appctl dpif/show | tail -n +5], [0], [dnl > > +AT_CHECK([ovs-appctl dpif/show | tail -n +4], [0], [dnl > > br0 65534/100: (dummy) > > p1 1/1: (vxlan: remote_ip=1.1.1.1) > > ]) > > -- > > 1.7.9.5 > > > > _______________________________________________ > > dev mailing list > > dev@openvswitch.org > > http://openvswitch.org/mailman/listinfo/dev >
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev