From: d@taht.net (Dave Täht)
To: bloat-devel@lists.bufferbloat.net
Subject: Re: [RFC v2] mac80211: implement eBDP algorithm to fight bufferbloat
Date: Sat, 19 Feb 2011 18:59:01 -0700 [thread overview]
Message-ID: <87pqqnzct6.fsf@cruithne.co.teklibre.org> (raw)
In-Reply-To: <x1-oTZGm1A7eclvABnv1aK0z1Nc7iI@gwene.org> (unknown's message of "Tue, 15 Feb 2011 23:17:07 +0100")
>Should we be somehow filtering out and ignoring the packets that get
>dropped, when we're calculating the average packet transmission rate?
>Presumably they're getting dropped almost instantly, so they don't
>really take up queue space and they have abnormally fast transmission
>times, which will tend to cause us to overestimate max_enqueued? They
>should be rare, though, at least. (And presumably we *should* include
>packets that get dropped because their retry timer ran out, since they
>were sitting in the queue for that long.) Possibly we should just
>ignore any packet that was handled in less than, oh, say, a few
>microseconds?
Perhaps doing continuous mean variance against time would be simpler
than what you propose.
Sorry, LISP example, with latex:
unknown <post@gwene.org> writes:
> A friend showed me this about 15 years ago. I use it every time I need to
> calculate the variance of some data set. I always forget the exact details and
> have to derive it again. But, it’s easy enough to derive that it’s never a
> problem.
>
> I had to derive it again on Friday and thought, `I should make sure more people
> get this tool into their utility belts'.
>
> First, a quick refresher on what we’re talking about here. The mean \mu of a
> data set { x_1, x_2, \ldots, x_n } is defined to be \frac{1}{n} \sum_{i=1}^n
> x_i. The variance \sigma^2 is defined to be \frac{1}{n} \sum_{i=1}^n (x_i - \
> mu)^2.
>
> A naïve approach to calculating the variance then goes something like this:
>
> (defun mean-variance (data)
> (flet ((square (x) (* x x)))
> (let* ((n (length data))
> (sum (reduce #'+ data :initial-value 0))
> (mu (/ sum n))
> (vv (reduce #'(lambda (accum xi)
> (+ accum (square (- xi mu))))
> data :initial-value 0)))
> (values mu (/ vv n)))))
>
> This code runs through the data list once to count the items, once to calculate
> the mean, and once to calculate the variance. It is easy to see how we could
> count the items at the same time we are summing them. It is not as obvious how
> we can calculate the sum of squared terms involving the mean until we’ve
> calculated the mean.
>
> If we expand the squared term and pull the constant \mu outside of the
> summations it ends up in, we find that:
> \frac{\sum (x_i - \mu)^2}{n} = \frac{\sum x_i^2}{n} - 2 \mu \frac{\sum x_i}{n}
> + \mu^2 \frac{\sum 1}{n}
>
> When we recognize that \frac{\sum x_i}{n} = \mu and \sum_{i=1}^n 1 = n, we get:
> \sigma^2 = \frac{\sum x_i^2}{n} - \mu^2 = \frac{\sum x_i^2}{n} - \left( \frac{\
> sum x_i}{n} \right)^2
> .
>
> This leads to the following code:
>
> (defun mean-variance (data)
> (flet ((square (x) (* x x)))
> (destructuring-bind (n xs x2s)
> (reduce #'(lambda (accum xi)
> (list (1+ (first accum))
> (+ (second accum) xi)
> (+ (third accum) (square xi))))
> data :initial-value '(0 0 0))
> (let ((mu (/ xs n)))
> (values mu (- (/ x2s n) (square mu)))))))
>
> The code is not as simple, but you gain a great deal of flexibility. You can
> easily convert the above concept to continuously track the mean and variance as
> you iterate through an input stream. You do not have to keep data around to
> iterate through later. You can deal with things one sample at a time.
>
> The same concept extends to higher-order moments, too.
>
> Happy counting.
>
> Link
--
Dave Taht
http://nex-6.taht.net
next parent reply other threads:[~2011-02-20 1:59 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <x1-oTZGm1A7eclvABnv1aK0z1Nc7iI@gwene.org>
2011-02-20 1:59 ` Dave Täht [this message]
2011-02-17 1:49 [RFC] " John W. Linville
2011-02-18 21:21 ` [RFC v2] " John W. Linville
2011-02-19 3:44 ` Nathaniel Smith
2011-02-21 18:47 ` John W. Linville
2011-02-21 23:26 ` Nathaniel Smith
2011-02-23 22:28 ` John W. Linville
2011-02-25 18:21 ` Nathaniel Smith
2011-02-25 18:27 ` Nathaniel Smith
2011-02-20 0:37 ` Nathaniel Smith
2011-02-20 0:51 ` Jim Gettys
2011-02-20 15:24 ` Dave Täht
2011-02-21 18:52 ` John W. Linville
2011-02-21 15:28 ` Johannes Berg
2011-02-21 16:12 ` Jim Gettys
2011-02-21 19:15 ` John W. Linville
2011-02-21 19:06 ` John W. Linville
2011-02-21 20:26 ` Tianji Li
2011-02-28 13:07 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87pqqnzct6.fsf@cruithne.co.teklibre.org \
--to=d@taht.net \
--cc=bloat-devel@lists.bufferbloat.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox