linux/net/sched
Terry Lam 10239edf86 net-qdisc-hhf: Heavy-Hitter Filter (HHF) qdisc
This patch implements the first size-based qdisc that attempts to
differentiate between small flows and heavy-hitters.  The goal is to
catch the heavy-hitters and move them to a separate queue with less
priority so that bulk traffic does not affect the latency of critical
traffic.  Currently "less priority" means less weight (2:1 in
particular) in a Weighted Deficit Round Robin (WDRR) scheduler.

In essence, this patch addresses the "delay-bloat" problem due to
bloated buffers. In some systems, large queues may be necessary for
obtaining CPU efficiency, or due to the presence of unresponsive
traffic like UDP, or just a large number of connections with each
having a small amount of outstanding traffic. In these circumstances,
HHF aims to reduce the HoL blocking for latency sensitive traffic,
while not impacting the queues built up by bulk traffic.  HHF can also
be used in conjunction with other AQM mechanisms such as CoDel.

To capture heavy-hitters, we implement the "multi-stage filter" design
in the following paper:
C. Estan and G. Varghese, "New Directions in Traffic Measurement and
Accounting", in ACM SIGCOMM, 2002.

Some configurable qdisc settings through 'tc':
- hhf_reset_timeout: period to reset counter values in the multi-stage
                     filter (default 40ms)
- hhf_admit_bytes:   threshold to classify heavy-hitters
                     (default 128KB)
- hhf_evict_timeout: threshold to evict idle heavy-hitters
                     (default 1s)
- hhf_non_hh_weight: Weighted Deficit Round Robin (WDRR) weight for
                     non-heavy-hitters (default 2)
- hh_flows_limit:    max number of heavy-hitter flow entries
                     (default 2048)

Note that the ratio between hhf_admit_bytes and hhf_reset_timeout
reflects the bandwidth of heavy-hitters that we attempt to capture
(25Mbps with the above default settings).

The false negative rate (heavy-hitter flows getting away unclassified)
is zero by the design of the multi-stage filter algorithm.
With 100 heavy-hitter flows, using four hashes and 4000 counters yields
a false positive rate (non-heavy-hitters mistakenly classified as
heavy-hitters) of less than 1e-4.

Signed-off-by: Terry Lam <vtlam@google.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-12-19 14:48:42 -05:00
..
act_api.c net_sched: convert tc_action_ops to use struct list_head 2013-12-18 12:52:07 -05:00
act_csum.c net_sched: init struct tcf_hashinfo at register time 2013-12-18 12:52:07 -05:00
act_gact.c net_sched: init struct tcf_hashinfo at register time 2013-12-18 12:52:07 -05:00
act_ipt.c net_sched: init struct tcf_hashinfo at register time 2013-12-18 12:52:07 -05:00
act_mirred.c net_sched: init struct tcf_hashinfo at register time 2013-12-18 12:52:07 -05:00
act_nat.c net_sched: init struct tcf_hashinfo at register time 2013-12-18 12:52:07 -05:00
act_pedit.c net_sched: init struct tcf_hashinfo at register time 2013-12-18 12:52:07 -05:00
act_police.c net_sched: convert tcf_hashinfo to hlist and use spinlock 2013-12-18 12:52:07 -05:00
act_simple.c net_sched: init struct tcf_hashinfo at register time 2013-12-18 12:52:07 -05:00
act_skbedit.c net_sched: init struct tcf_hashinfo at register time 2013-12-18 12:52:07 -05:00
cls_api.c net_sched: convert tcf_proto_ops to use struct list_head 2013-12-18 12:52:08 -05:00
cls_basic.c net_sched: cls: refactor out struct tcf_ext_map 2013-12-18 12:52:07 -05:00
cls_bpf.c net_sched: cls: refactor out struct tcf_ext_map 2013-12-18 12:52:07 -05:00
cls_cgroup.c net_sched: cls: refactor out struct tcf_ext_map 2013-12-18 12:52:07 -05:00
cls_flow.c net_sched: cls: refactor out struct tcf_ext_map 2013-12-18 12:52:07 -05:00
cls_fw.c net_sched: cls: refactor out struct tcf_ext_map 2013-12-18 12:52:07 -05:00
cls_route.c net_sched: cls: refactor out struct tcf_ext_map 2013-12-18 12:52:07 -05:00
cls_rsvp6.c
cls_rsvp.c
cls_rsvp.h net_sched: cls: refactor out struct tcf_ext_map 2013-12-18 12:52:07 -05:00
cls_tcindex.c net_sched: cls: refactor out struct tcf_ext_map 2013-12-18 12:52:07 -05:00
cls_u32.c net_sched: cls: refactor out struct tcf_ext_map 2013-12-18 12:52:07 -05:00
em_canid.c
em_cmp.c
em_ipset.c em_ipset: use dev_net() accessor 2013-10-18 16:23:06 -04:00
em_meta.c net: Change skb_get_rxhash to skb_get_hash 2013-12-17 16:36:21 -05:00
em_nbyte.c
em_text.c
em_u32.c
ematch.c
Kconfig net-qdisc-hhf: Heavy-Hitter Filter (HHF) qdisc 2013-12-19 14:48:42 -05:00
Makefile net-qdisc-hhf: Heavy-Hitter Filter (HHF) qdisc 2013-12-19 14:48:42 -05:00
sch_api.c pkt_sched: set root qdisc before change() in attach_default_qdiscs() 2013-12-14 01:20:06 -05:00
sch_atm.c net_sched: info leak in atm_tc_dump_class() 2013-07-31 15:04:19 -07:00
sch_blackhole.c
sch_cbq.c net_sched: add space around '>' and before '(' 2013-12-10 22:44:51 -05:00
sch_choke.c treewide: Add __GFP_NOWARN to k.alloc calls with v.alloc fallbacks 2013-08-20 13:06:40 +02:00
sch_codel.c
sch_drr.c net_sched: add 64bit rate estimators 2013-06-11 02:51:03 -07:00
sch_dsmark.c net_sched: remove unnecessary parentheses while return 2013-12-10 22:44:51 -05:00
sch_fifo.c
sch_fq_codel.c net: fq_codel: Fix off-by-one error 2013-03-29 15:32:23 -04:00
sch_fq.c net: Change skb_get_rxhash to skb_get_hash 2013-12-17 16:36:21 -05:00
sch_generic.c pkt_sched: set root qdisc before change() in attach_default_qdiscs() 2013-12-14 01:20:06 -05:00
sch_gred.c net_sched: gred: actually perform idling in WRED mode 2012-09-13 16:10:13 -04:00
sch_hfsc.c net_sched: add 64bit rate estimators 2013-06-11 02:51:03 -07:00
sch_hhf.c net-qdisc-hhf: Heavy-Hitter Filter (HHF) qdisc 2013-12-19 14:48:42 -05:00
sch_htb.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2013-12-18 16:42:06 -05:00
sch_ingress.c
sch_mq.c pkt_sched: give visibility to mq slave qdiscs 2013-12-09 19:54:47 -05:00
sch_mqprio.c pkt_sched: give visibility to mq slave qdiscs 2013-12-09 19:54:47 -05:00
sch_multiq.c net/*: Fix FSF address in file headers 2013-12-06 12:37:57 -05:00
sch_netem.c net_sched: add space around '>' and before '(' 2013-12-10 22:44:51 -05:00
sch_plug.c
sch_prio.c
sch_qfq.c pkt_sched: sch_qfq: remove a source of high packet delay/jitter 2013-07-18 13:02:00 -07:00
sch_red.c
sch_sfb.c
sch_sfq.c net_sched: sfq: put sfq_unlink in a do - while loop 2013-12-10 22:44:52 -05:00
sch_tbf.c sch_tbf: use do_div() for 64-bit divide 2013-12-11 22:53:26 -05:00
sch_teql.c