我想限制Linux盒子的传入(下载)速度。
configuration的盒子和stream量来源(HTTP服务器)都连接到同一个交换机,如果没有configuration整形,下载速度是30MBps
我使用tc根据http://lartc.org/lartc.html
########## downlink ############# # slow downloads down to somewhat less than the real speed to prevent # queuing at our ISP. Tune to see how high you can set it. # ISPs tend to have *huge* queues to make sure big downloads are fast # # attach ingress policer: /sbin/tc qdisc add dev $DEV handle ffff: ingress # filter *everything* to it (0.0.0.0/0), drop everything that's # coming in too fast: /sbin/tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \ 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
但是,有效的下载速度比configurationless得多。 这是我的实验结果
固定利率,KBps : 实际利率,KBps
对于小的带宽整形工作相当好,但在1024 KBit有效比特率比预期的less75%。
有可能有效限制传入带宽?
体重低于预期
我认为你也必须相应地增加burst
。
有可能有效限制传入带宽?
我会说你一定可以实现类似的效果,丢弃数据包,而不是接收它们。 对于具有带宽自调整机制的TCP这样的原型,它将会有效地工作。 看看http://www.linuximq.net/faq.html
有可能有效限制传入带宽?
试图限制进入的带宽基本上是通过举起一个带有钻孔的板来限制stream水的stream量:你将减less打到你的水量,但是你仍然被stream水冲击。
进一步说,如果你需要100加仑的水,但限制了它的速度(通过举起带有孔的板),你仍然受到stream水力的冲击(交通),但是没有得到大部分的水(因为只有穿过这个洞的事情到达了你 – 其余的被你的防火墙放在地板上)。
阻塞所有的水的效果是,它需要更长的时间来填补你的100加仑桶。
使用防火墙阻止TCP数据包的效果稍微差一些,因为您触发了远程主机的congetion控制algorithm ,在理想的情况下,它会降低stream水线上的压力,有时会大大低于您希望的水平。
顺便说一下,这也是为什么本地防火墙无法为您节省DoS攻击的原因 – 即使只是做出忽略它的决定,您仍然必须处理所有stream量。 由于显而易见的原因,DoS攻击不太可能用于拥塞控制程序。
我已经听到了限制传入带宽的混合结果,但是这应该可以通过内核中的ifb设备来实现。 虽然有一个事实是@ voretaq7说的,如果你接受所有的input数据包,并将它们redirect或镜像到一个“I ntermediate F_unctional B_lock”设备,你可以“限制”input数据包。 “出口”过滤。
这可能听起来并不“有用”,因为您必须接受所有的stream量,但是接下来您需要确定从“持有”队列中出来的stream量到达系统的其余部分。
除非它们是低优先级的数据包,否则这具有不丢包的好处。 当然,如果你被拒绝了,关键的问题可能是入站总stream量高于你的线路能够维持的水平,所以试图用这种方法来影响这个是徒劳的。 这种方法只能在任何需要的协议(TCP,UDP,ICMP等)上的合法stream上工作。 也就是说,如果我想通过大容量下载优先考虑DNS,我可以做到这一点,但是,无论使用哪种stream量algorithm,如果您拥有30Mb /秒,那么以1000Hz的最快正常时钟中断,您仍然需要处理30Kb的交通/时钟滴答,这是假设你及时打电话。 这就是为什么你必须要有高的突发速率的主要原因,因为单独使用速率限制很难处理。
如果你的网卡有多个I / O队列,这将是有帮助的 。 那里的许多卡都有6-12个队列/方向,可以基于以太网卡上的通常更有限的过滤选项来提供一些“自动”分类到单独的队列中。
有什么更有用的 – 如果你可以将stream量分配到多个队列中,你可以设置队列的处理器关联。 如果你发现自己在CPU处理数据包方面受到限制,使用multiQ,那么这可以帮助将传入stream量分散到不同的Core处理器(不要使用超线程 – 它可能会导致性能问题,因为线程不运行在共享的数据上,而是分开的数据stream,处理这些最好的方式是使用独立的L1和L2caching(L3将仍然是共享的,通常在多个核心之间),但是你至less可以把L1和L2caching专用“stream”)。
由于吞吐量的问题,我有单排队和pipe理,我放弃了入口控制 – 我只有一个5Mb的传入时间(现在7Mb),所以我没有试图看到如何有效使用multiq和ifb正在进入塑造。 实际上,我通常使用应用程序级的整形和控制 – 并不理想,但相当可靠。
一个问题时不时出现,是由于线路问题或ISP拥堵,我不会得到我的最大体重,那么我的固定filter预设不适应…这是我没有工作的另一个原因在这个问题上太难了,因为我不确定需要多less工作才能使速率限制成为dynamic的,并感觉到这样的问题或问题,而且现在我的队列中还有太多其他更高优先级的项目…(和我的I / O速率远远低于我的以太网端口)… 😉