我有一个C#应用程序,它使用本地库,使用UDP通过Internet将视频发送到其他IP.我对该库没有流量控制.
我的应用程序还调用另一台服务器的Web服务,使用WebRequest
我可以控制它们.
问题是:
当我的互联网带宽较低时,视频流会占用我所有的带宽.因此,在此期间我无法获得我的Web服务方法的响应.
有没有办法优先考虑WebRequest
或为他们节省一些带宽,以便我可以安全地获得响应?
在我的工作中,我发现tc可以进行出口整形,并且只能进行入口监管.我想知道为什么tc没有实现入口整形?
代码示例:
#ingress
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol ip prio 50 \
u32 match ip src 0.0.0.0/0 police rate 256kbit \
burst 10k drop flowid :1
#egress
tc qdisc add dev eth0 root tbf \
rate 256kbit latency 25ms burst 10k
Run Code Online (Sandbox Code Playgroud)
但我不能这样做:
#ingress shaping, using tbf
tc qdisc add dev eth0 ingress tbf \
rate 256kbit latency 25ms burst 10k
Run Code Online (Sandbox Code Playgroud)
我发现一个名为IFB(更新后的IMQ)的解决方案可以将流量重定向到出口.但它似乎不是一个好的解决方案,因为它浪费CPU.所以我不想用这个.
入口整形是否有意义?为什么tc不支持它?
我正在尝试测试使用数据库连接的应用程序.我想做的是将带宽限制在1 MBit等,以便在现实条件下更好地感受应用程序.
我已经使用Wireshark来查看与DB的通信,我希望Wireshark有这样的功能,但似乎没有办法做那样的事情.
有什么建议?
在Linux上使用流量整形(tc),尝试将吞吐量限制在2个级别.
等级1:20继承自1:10,但交通限制不适用.流量正在使用最后一个类的限制进行限制.
class htb 1:1 root rate 1Gbit ceil 1Gbit burst 15125b cburst 1375b
class htb 1:10 parent 1:1 rate 4Mbit ceil 5Mbit burst 15Kb cburst 1600b
class htb 1:20 parent 1:10 leaf 200: prio 0 rate 9Mbit ceil 10Mbit burst 15Kb cburst 1600b
class htb 1:30 parent 1:10 leaf 300: prio 0 rate 9Mbit ceil 10Mbit burst 15Kb cburst 1600b
Run Code Online (Sandbox Code Playgroud)
我使用以下过滤器对每个站点进行过滤:
filter parent 1: protocol all pref 5 u32
filter parent 1: protocol all pref 5 u32 fh 800: …
Run Code Online (Sandbox Code Playgroud) 对于我使用netty nio lib在Java中开发的下载客户端,我还实现了带宽限制功能.从技术上讲,我是通过GlobalTrafficShapingHandler对象完成的.基于这个类'JavaDoc我初始化nio客户端管道如下:
...
trafficHandler = new GlobalTrafficShapingHandler(
new HashedWheelTimer(), 0, 0, 1000);
execHandler = new ExecutionHandler(
new OrderedMemoryAwareThreadPoolExecutor(20, 0, 0));
...
public ChannelPipeline getPipeline() throws Exception
{
// create default pipeline
ChannelPipeline pipeline = pipeline();
// traffic shaping handler
pipeline.addLast("global-traffic-shaping", trafficHandler);
// SSL support
if(useSSL)
{
SSLEngine sslEngine = createSSLEngine();
pipeline.addLast("ssl", new SslHandler(sslEngine));
}
// memory executor
pipeline.addLast("memory-executor", execHandler);
// business logic
pipeline.addLast("data-processing",
new NettyNioClientHandler(
nettyNioClient, localer, logger, ncMgr, username, useSSL));
return pipeline;
}
Run Code Online (Sandbox Code Playgroud)
然后在运行时我设置最大值.通过下载速度
public void setDlSpeedLimit(long limit) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试对 Docker 容器进行带宽限制。为了限制下行带宽,我可以先找到容器和使用TC的VETH接口:tc qdisc add dev vethpair1 root tbf rate 1mbit latency 50ms burst 10000
。如果我想限制上行带宽,我需要指定--cap-add=NET_ADMIN
何时启动容器并eth0
在容器内部使用相同的 tc 命令。是否有任何非侵入性的方法来做到这一点,以便我可以管理任何容器而不授予它特权?
我听说如果你使用端口443(通常用于https的端口)用于ssh,加密的数据包看起来与你的isp相同.
这可能是一种避免流量整形/限制的方法吗?
我是使用 tc 命令的新手。
我正在编写一个测试脚本来为接口添加延迟。这是使用python和fabric api完成的
所以脚本将执行以下操作:
sudo tc qdisc 添加 dev eth1 root netem 延迟
在脚本结束时我们会做
sudo tc qdisc del dev eth1 root netem
但同时我想在最开始的时候确保系统上没有现有的 tc 控制。所以我想在整个脚本开始之前运行删除命令。但是如果没有完成 tc 配置,这会给我一个错误。
abc@abcvmm:~$ sudo tc qdisc del dev eth1 root netem
RTNETLINK 答案:无效参数
有没有办法仅在完成现有 tc 配置时删除配置的接口,否则不会。
我想在特定的 docker 容器上设置较低的优先级,这样它就不会导致其他容器的网络容量不足。我正在寻找的模型是这样的:
tc filter add dev eth0 protocol ip parent 10: prio 2
Run Code Online (Sandbox Code Playgroud)
我想我想在启动 docker 容器时设置它,以便退出该容器的虚拟接口的所有数据包都被标记为较低的优先级(较高的数字)。期望的结果是:如果没有拥塞,一切正常。当队列备份时,来自目标容器的流量将被取消优先级。
我看到了添加延迟、设置带宽上限或损坏的示例,但没有看到有关设置优先级的示例。
另外,我是否需要在 docker 桥/nat 接口上启用队列以便读取 TOS 优先级?
默认情况下,虚拟设备在不附加 qdisc 的情况下运行(出于性能原因)
在哪里可以了解如何在Linux下控制/查询网络接口?我想获得特定的应用程序上传/下载速度,并强制执行特定应用程序的速度限制.
我特别喜欢可以帮助我使用Python编写流量整形应用程序的信息.
我正在尝试对从特定进程组生成的数据包进行优先级排序,以便首先选择它们以从PC传输出去。我的目标是通过使用cgroups和tc来做到这一点,但似乎不起作用。
首先,我在ubuntu上设置了cgroup,如下所示:
modprobe cls_cgroup # load this module to get net_cls
mkdir /sys/fs/cgroup/net_cls # mount point
mount -t cgroup net_cls -onet_cls /sys/fs/cgroup/net_cls/
mkdir /sys/fs/cgroup/net_cls/foo # new cgroup
echo 0x00010001 > /sys/fs/cgroup/foo/net_cls.classid # echo in a class id
echo 2348 > /sys/fs/cgroup/net_cls/foo/tasks # echo in pid of firefox
tc qdisc add dev eth0 root handle 1: pri
tc qdisc add dev eth0 parent 1:1 handle 10: sfq
tc qdisc add dev eth0 parent 1:2 handle 20: sfq
tc qdisc add dev …
Run Code Online (Sandbox Code Playgroud) 我将通过提供一些关于我们正在做什么和我们面临的问题的背景来开始我的问题。
目前,我们没有限制或限制租户在给定时间段内可以发出的请求数量的策略。考虑到上面的最后两个考虑因素,很容易看出这是一个问题,因为租户提出的请求超出我们的处理能力几乎是微不足道的,从而导致服务质量下降(即使对于其他租户也是如此)共享资源方法)。
我们正在考虑限制/节流或一般准备系统以“隔离”租户的策略,因此一个租户不能通过发出超出我们处理能力的更多请求来降低其他租户的性能:
现在,我们倾向于采用选项 4。我们希望以这样一种方式实施请求限制(流量整形),即所有在先前与租户商定的速率(由合同强制执行)内提出的请求都将传递给服务毫不拖延。由于我们事先知道每个租户每分钟将发出多少请求(至少是估计的),因此我们可以相应地调整我们的基础设施(加上安全裕度)。
如果突发到达,多余的请求将被排队(达到限制),然后以固定速率释放(使用漏桶或类似算法)。这将确保租户不会影响其他租户的性能,因为请求将以预定义的速率命中服务。理想情况下,允许的请求率将是“动态的”,这样租户可以使用其他不使用它们的租户的“每分钟请求数”(在安全限制内)。我相信这被称为“动态速率泄漏桶”算法。目标是最大限度地利用资源。
我的问题是:
非常感谢你,米克尔。
我正在使用tc
内核2.6.38.8进行流量整形.限制带宽工作,增加延迟工作,但是当使用延迟整形两个带宽时,如果限制大于1.5 Mbps左右,实现的带宽总是远低于限制.
例:
tc qdisc del dev usb0 root
tc qdisc add dev usb0 root handle 1: tbf rate 2Mbit burst 100kb latency 300ms
tc qdisc add dev usb0 parent 1:1 handle 10: netem limit 2000 delay 200ms
Run Code Online (Sandbox Code Playgroud)
产生201 ms的延迟(从ping开始),但容量仅为1.66 Mbps(来自iperf).如果我消除延迟,带宽恰好是2 Mbps.如果我指定1 Mbps和200 ms RTT的带宽,一切正常.我也尝试过ipfw + dummynet,它会产生类似的结果.
我尝试HZ=1000
在Kconfig中使用重建内核- 这并没有解决问题.其他想法?
trafficshaping ×13
linux ×6
networking ×4
bandwidth ×3
docker ×2
api ×1
c# ×1
https ×1
ipfw ×1
java ×1
kernel ×1
netty ×1
python ×1
simulation ×1
ssh ×1
throttling ×1
traffic ×1
ubuntu ×1
webrequest ×1
wireshark ×1