Hi, at my local university network, I have to make sure no student uploads more than x GB/day. So far, I give them unlimited bandwidth until they have more than y GB (y<x) upload. After that, I use the u32 filter to associate the affected IP address with a HTB class limited to the rate (remainingtraffic/remainingtime). Since the accounting is done with ipt_ACCOUNT right now and the netfilter framework obviously can''t know whether a packet was dropped because the queue was full, dropped packets are counted as traffic, but that is somewhat unfair. Can I do the accounting with the traffic control framework in the kernel instead of using ipt_ACCOUNT? Giving every IP its own htb class and setting that to an incredibly high limit to do the accounting seems overkill (there is no point in forcing HTB to do all the calculations for shaping if I only want to count) especially because I''d have to do that for a sparsely populated /16 network (about 1500-2800 hosts). One (not that sophisticted) idea is to leave the accounting "as is" and add a "dropped bytes" count to htb. This could be subtracted from the numbers ipt_ACCOUNT gives me. That would modify the output of "tc class ls" from Sent 86136037 bytes 103963 pkt (dropped 283998, overlimits 0 requeues 0) to Sent 86136037 bytes 103963 pkt (dropped 385953282 bytes 283998 pkt, overlimits 0 requeues 0) Proposal: ---------------------------------- Another idea would be to create a qdisc HTBQ (HTB with quota) derived from HTB with the following characteristics: htb_rate=min(htbq_rate, (alreadysent=>htbq_squota)?((htbq_quota-alreadysent)/remtime):htbq_rate) htb_ceil=htbq_ceil //this is just passed on htb_burst=htbq_burst htb_cburst=htbq_cburst htb_prio=htbq_prio htb_quantum=htbq_quantum //should be set automatically htbq_interval seconds //time after which quota is reset htbq_starttime seconds //time when the first interval starts htbq_quota bytes //maximum allowed bytes htbq_squota bytes //unshaped quota htbq_rate is optional, unlimited if not set htbq_ceil is optional htbq_burst is optional htbq_cburst is optional htbq_prio is mandantory htbq_quantum is optional htbq_interval is mandantory htbq_starttime is optional, defaults to unixtime 0 htbq_quota is mandantory htbq_squota is optional, defaults to 0 (shape from beginning) Basic description: Case 1: already sent bytes are less than htbq_squota if htbq_{rate,ceil,burst,cburst,quantum} is set then do normal htb shaping with copied parameters else pass on packets directly to network device Case 2: already sent bytes are greater or equal than htbq_squota if htbq_{rate,ceil,burst,cburst,quantum} is set then do htb shaping with copied parameters except htb_rate=min(htbq_rate, (htbq_quota-alreadysent)/remtime) htb_ceil=min(htbq_ceil, (htbq_quota-alreadysent)/remtime) else do htb shaping with following parameters htb_rate=(htbq_quota-alreadysent)/remtime htb_ceil=(htbq_quota-alreadysent)/remtime This would surely be helpful for some admins who have to limit users to a certain quota without constantly shaping their network traffic or pulling the plug once the quota is full. Thoughts? Regards, Carl-Daniel -- http://www.hailfinger.org/
On Sat, 04 Jun 2005 14:45:30 +0200 Carl-Daniel Hailfinger <c-d.hailfinger.devel.2005@gmx.net> wrote:>Hi,Hi.>Since the accounting is done with ipt_ACCOUNT right now and the >netfilter framework obviously can''t know whether a packet was >dropped because the queue was full, dropped packets are counted as >traffic, but that is somewhat unfair.I did some tests about a year ago and arrived to the conclusion that this difference can be ignored for practical purposes (~2%). Yours sincerely, Peter
Hi, Peter Surda schrieb:> On Sat, 04 Jun 2005 14:45:30 +0200 Carl-Daniel Hailfinger > >>Since the accounting is done with ipt_ACCOUNT right now and the >>netfilter framework obviously can''t know whether a packet was >>dropped because the queue was full, dropped packets are counted as >>traffic, but that is somewhat unfair. > > I did some tests about a year ago and arrived to the conclusion that this > difference can be ignored for practical purposes (~2%).I know that it can be ignored most of the time, but certain types of communication using UDP packets don''t adjust their rates like a TCP connection would. One pathological case was >70% dropped packets and the netfilter counters were complete garbage. Regards, Carl-Daniel -- http://www.hailfinger.org/
Carl-Daniel Hailfinger wrote:> Proposal: > ---------------------------------- > Another idea would be to create a qdisc HTBQ (HTB with quota) > derived from HTB with the following characteristics: > > htb_rate=min(htbq_rate, (alreadysent=>htbq_squota)?((htbq_quota-alreadysent)/remtime):htbq_rate)Why do you want to decrease speed as the quota is approached? Wouldn''t a simple per-class quota or a quota-ematch work as well? Regards Patrick
On Sat, 04 Jun 2005 15:21:36 +0200 Carl-Daniel Hailfinger <c-d.hailfinger.devel.2005@gmx.net> wrote:>Hi,Hi,>I know that it can be ignored most of the time, but certain types >of communication using UDP packets don''t adjust their rates like >a TCP connection would. One pathological case was >70% dropped >packets and the netfilter counters were complete garbage.In that case, on the same website as wrr ( http://wipl-wrr.sf.net/ ), there is another program, wipl. It is supposed to do IP-accounting based on tc (I don''t know if it depends on wrr, I never used it, it just says it was designed for the purpose you require).>Regards, >Carl-DanielYours sincerely, Peter
Patrick McHardy schrieb:> Carl-Daniel Hailfinger wrote: > >>Proposal: >>---------------------------------- >>Another idea would be to create a qdisc HTBQ (HTB with quota) >>derived from HTB with the following characteristics: >> >>htb_rate=min(htbq_rate, (alreadysent=>htbq_squota)?((htbq_quota-alreadysent)/remtime):htbq_rate) > > > Why do you want to decrease speed as the quota is approached?We have two phases (simplified): 1. Already sent traffic is less than htbq_squota -> Do not limit anything. 2. Already sent traffic is more than htbq_squota -> Limit the rate to something which allows the quota to be filled completely in the remainig time. Most people stay below htbq_squota and do not notice anything at all, i.e. they get full wire speed. Power users will cause more traffic than htb_squota and be limited so they can''t get over htbq_quota. Since it is impossible to send faster than htb_rate, htb_rate will stay constant if it is fully utilized. If htb_rate is not fully utilized, the speed will actually *increase* over time.> Wouldn''t a simple per-class quota or a quota-ematch work as > well?That would be easier, but I can''t see how to realize the process above with a quota-ematch. Especially the dynamic rate adaption needs something more than just quota. Probably one could combine quota-ematch with some userspace hackery to achieve what I want, but it would require to statically set up 65536 classes for a /16 network. Hm. The only difference to my solution would be that we need a quota ematch instead of a htb_quota qdisc and rate control would be done in userspace. So where can I find code doing a quota ematch? Regards, Carl-Daniel -- http://www.hailfinger.org/
Carl-Daniel Hailfinger wrote:> Patrick McHardy schrieb: > >>Why do you want to decrease speed as the quota is approached? > > > We have two phases (simplified): > 1. Already sent traffic is less than htbq_squota > -> Do not limit anything. > 2. Already sent traffic is more than htbq_squota > -> Limit the rate to something which allows the quota > to be filled completely in the remainig time. > > Most people stay below htbq_squota and do not notice > anything at all, i.e. they get full wire speed. Power users > will cause more traffic than htb_squota and be limited so > they can''t get over htbq_quota. Since it is impossible to > send faster than htb_rate, htb_rate will stay constant if > it is fully utilized. If htb_rate is not fully utilized, > the speed will actually *increase* over time.Ok, so why do you want to prevent people from sending from htbq_squota to htbq_quota at full speed? Isn''t the important point that noone sends more than their quota? Dynamic rate adaption is not easy, HTB needs pre-calculated rate tables, with HFSC it is even more complicated and can cause short periods of unfairness.>>Wouldn''t a simple per-class quota or a quota-ematch work as >>well? > > That would be easier, but I can''t see how to realize the > process above with a quota-ematch. Especially the dynamic > rate adaption needs something more than just quota. > Probably one could combine quota-ematch with some userspace > hackery to achieve what I want, but it would require to > statically set up 65536 classes for a /16 network. Hm. > The only difference to my solution would be that we need > a quota ematch instead of a htb_quota qdisc and rate control > would be done in userspace. > > So where can I find code doing a quota ematch?Nowhere I guess, but shouldn''t take more than a couple of minutes to write one. It would have the same problems as with iptables however, it doesn''t get feedback about dropped packets. A per-class quota inside the qdisc is probably the best way. Regards Patrick