[ovs-dev] [PATCH] Flush freshly-polled sFlow counters promptly.

Neil McKee neil.mckee at inmon.com
Mon Aug 29 22:32:41 UTC 2016


This patch changes the order of the steps that are followed
every second in the sFlow agent.  By moving the receiver_tick()
step to the end,  we ensure that any counters that were polled
during the poller_tick() step are flushed immediately to the
sFlow collector.  This eliminates what was a variable time-delay
between counters being polled and being flushed.

The variable time-delay that this eliminates could be up to
a second because counters lingering in the output buffer could be
flushed at any time by the arrival of random packet-samples.

Since the sFlow standard does not require that a poll-timestamp be sent
along with the counters the collector must use his receive-time as the
timestamp, so that extra second of variable delay was "stretching or
shrinking" the time between successive counter readings.  This
affected any counter-rate calculation that was based only on the delta
between sucessive samples. The effect was small with a polling
interval of 60 seconds: just +/- 2%.  But the effect grew larger
when faster polling was configured.  For example, if the counters
were pushed every 5 seconds then the instantaneous rate
calculations could wander by +/- 20%.  For a thorough analysis
of this problem,  see Rick Jones' paper:

"High Frequency sFlow v5 Counter Sampling"
ftp://ftp.netperf.org/papers/high_freq_sflow/hf_sflow_counters.pdf

So this patch makes it possible to obtain usable results even
when high-frequency polling is configured.

Signed-off-by: Neil McKee <neil.mckee at inmon.com>
---
 lib/sflow_agent.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/lib/sflow_agent.c b/lib/sflow_agent.c
index 9c2e028..878c3da 100644
--- a/lib/sflow_agent.c
+++ b/lib/sflow_agent.c
@@ -128,12 +128,15 @@ void sfl_agent_tick(SFLAgent *agent, time_t now)
     SFLSampler *sm = agent->samplers;
     SFLPoller *pl = agent->pollers;
     agent->now = now;
-    /* receivers use ticks to flush send data */
-    for(; rcv != NULL; rcv = rcv->nxt) sfl_receiver_tick(rcv, now);
     /* samplers use ticks to decide when they are sampling too fast */
     for(; sm != NULL; sm = sm->nxt) sfl_sampler_tick(sm, now);
     /* pollers use ticks to decide when to ask for counters */
     for(; pl != NULL; pl = pl->nxt) sfl_poller_tick(pl, now);
+    /* receivers use ticks to flush send data.  By doing this
+     * step last we ensure that fresh counters polled during
+     * sfl_poller_tick() above will be flushed promptly.
+     */
+    for(; rcv != NULL; rcv = rcv->nxt) sfl_receiver_tick(rcv, now);
 }

 /*_________________---------------------------__________________
-- 
1.9.1

------
Neil McKee
InMon Corp.
http://www.inmon.com



More information about the dev mailing list