Chinaunix
标题:
请教:关于TC带宽控制“子类的rate之和 > 父类rate”???
[打印本页]
作者:
netwushen
时间:
2008-10-29 08:51
标题:
请教:关于TC带宽控制“子类的rate之和 > 父类rate”???
请教:看了不少关于使用TC后的带宽控制测试结论,说“子类的rate之和 > 父类rate”这种设计是无效的,
为什么我用TC后,测试时,“子类的rate之和 > 父类rate” 这种情况有效???
请帮忙分析:
网络环境:
host1 host2
|
| eth2 (192.168.1.11)
------------------
| FW |
------------------
| eth3 (172.16.1.1)
|
FTP server
TC规则如下:
$TC qdisc add dev eth2 root handle 3: htb default 21
$TC class add dev eth2 parent 3: classid 3:1 htb rate 100Mbit ceil 100Mbit
$TC class add dev eth2 parent 3:1 classid 3:21 htb rate 3Mbit ceil 3Mbit prio 1
$TC class add dev eth2 parent 3:21 classid 3:22 htb rate 2Mbit ceil 2Mbit prio 2
$TC qdisc add dev eth2 parent 3:22 handle 22: sfq
$TC class add dev eth2 parent 3:21 classid 3:23 htb rate 3Mbit ceil 3Mbit prio 3
$TC qdisc add dev eth2 parent 3:23 handle 23: sfq
做dnat后,host1,host2访问FTP,当我同时在host1 和 host2 上从FTP下载文件时,他们都能达到自己的rate,
上述测试存是否正确呢?
作者:
kns1024wh
时间:
2008-10-29 09:04
标题:
回复 #1 netwushen 的帖子
理论上是符合的,测试只有ftp的数据请求,没有其他的请求,当然都给ftp的用了。
多多交流呀
加QQ
作者:
netwushen
时间:
2008-10-29 09:14
???那为什么我把两个子类的rate都设置为5M, 父类rate仍为3M,为什么子类也可以达到各自的rate?
作者:
emmoblin
时间:
2008-10-29 13:58
我看了htb实现的原理,当子类的令牌能得到保证时就可以直接出队,
跟父类没有关系,只有当大于rate小ceil的时候,需要向父类借用带宽时,
才会跟父类有关系,看父类是否有令牌可以给子类。
所以并不是像表面上认为的,父类的令牌分给子类的令牌。其实每个类都有自己的
令牌桶,没有谁分给谁之说,只是子类的令牌不够时,把队列挂到父类的队列中。
这时就用父类的令牌桶提供令牌了。
所以子类,父类的rate和ceil并没有什么之和相等或者不可超过的关系。
如果我没说清楚,咱们再讨论。
作者:
netwushen
时间:
2008-10-29 14:09
谢谢各位的回复,继续琢磨测试中~~~~
作者:
lin_wang
时间:
2010-03-19 21:31
本帖最后由 lin_wang 于 2010-03-19 21:32 编辑
回复
4#
emmoblin
那请教下, 用 tc change 频繁更改(2秒一次) htb 的子类时 dmesg 里报 htb: too many events! 是怎么回事呢? 有什么影响?
我看了htb的源码, 那段不是很明白
/**
* htb_do_events - make mode changes to classes at the level
*
* Scans event queue for pending events and applies them. Returns time of
* next pending event (0 for no event in pq, q->now for too many events).
* Note: Applied are events whose have cl->pq_key <= q->now.
*/
static psched_time_t htb_do_events(struct htb_sched *q, int level,
unsigned long start)
{
/* don't run for longer than 2 jiffies; 2 is used instead of
1 to simplify things when jiffy is going to be incremented
too soon */
unsigned long stop_at = start + 2;
while (time_before(jiffies, stop_at)) {
struct htb_class *cl;
long diff;
struct rb_node *p = rb_first(&q->wait_pq[level]);
if (!p)
return 0;
cl = rb_entry(p, struct htb_class, pq_node);
if (cl->pq_key > q->now)
return cl->pq_key;
htb_safe_rb_erase(p, q->wait_pq + level);
diff = psched_tdiff_bounded(q->now, cl->t_c, cl->mbuffer);
htb_change_class_mode(q, cl, &diff);
if (cl->cmode != HTB_CAN_SEND)
htb_add_to_wait_tree(q, cl, diff);
}
/* too much load - let's continue after a break for scheduling */
if (!(q->warned & HTB_WARN_TOOMANYEVENTS)) {
printk(KERN_WARNING "htb: too many events!\n");
q->warned |= HTB_WARN_TOOMANYEVENTS;
}
return q->now;
}
复制代码
作者:
emmoblin
时间:
2010-03-21 14:19
回复
6#
lin_wang
多次频繁的change是没有问题的。
这个too many event的提示的意思的是,进入do_event的次数太多了,可能会有点控制的不准确,但影响不大
作者:
lin_wang
时间:
2010-03-22 08:51
哦, 酱紫, 多谢指教!
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2