Skip to content

Commit

Permalink
sflow-agent: Flush freshly-polled sFlow counters promptly.
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
sflow authored and blp committed Sep 2, 2016
1 parent 1898b54 commit 784bf5d
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions lib/sflow_agent.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/*_________________---------------------------__________________
Expand Down

0 comments on commit 784bf5d

Please sign in to comment.