标签: trafficshaping

我的C#应用​​程序中的带宽整形

我有一个C#应用程序,它使用本地库,使用UDP通过Internet将视频发送到其他IP.我对该库没有流量控制.

我的应用程序还调用另一台服务器的Web服务,使用WebRequest我可以控制它们.

问题是:

当我的互联网带宽较低时,视频流会占用我所有的带宽.因此,在此期间我无法获得我的Web服务方法的响应.

有没有办法优先考虑WebRequest或为他们节省一些带宽,以便我可以安全地获得响应?

c# trafficshaping bandwidth webrequest low-bandwidth

18
推荐指数
1
解决办法
650
查看次数

为什么tc不能做入口整形?入口整形是否有意义?

在我的工作中,我发现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不支持它?

linux networking trafficshaping network-traffic

12
推荐指数
2
解决办法
2万
查看次数

如何限制网络流量进行环境模拟?

我正在尝试测试使用数据库连接的应用程序.我想做的是将带宽限制在1 MBit等,以便在现实条件下更好地感受应用程序.

我已经使用Wireshark来查看与DB的通信,我希望Wireshark有这样的功能,但似乎没有办法做那样的事情.

有什么建议?

simulation networking trafficshaping bandwidth wireshark

10
推荐指数
1
解决办法
4836
查看次数

tc类ceil继承

在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)

linux trafficshaping bandwidth

9
推荐指数
1
解决办法
590
查看次数

如何使用Java netty正确限制带宽使用?

对于我使用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)

java trafficshaping netty

7
推荐指数
1
解决办法
2870
查看次数

使用 tc 来限制 Docker 容器的传出网络带宽

我正在尝试对 Docker 容器进行带宽限制。为了限制下行带宽,我可以先找到容器和使用TC的VETH接口:tc qdisc add dev vethpair1 root tbf rate 1mbit latency 50ms burst 10000。如果我想限制上行带宽,我需要指定--cap-add=NET_ADMIN何时启动容器并eth0在容器内部使用相同的 tc 命令。是否有任何非侵入性的方法来做到这一点,以便我可以管理任何容器而不授予它特权?

trafficshaping bandwidth-throttling docker

7
推荐指数
1
解决办法
2697
查看次数

通过在端口443上使用ssh来避免流量整形

我听说如果你使用端口443(通常用于https的端口)用于ssh,加密的数据包看起来与你的isp相同.

这可能是一种避免流量整形/限制的方法吗?

linux ssh https trafficshaping

6
推荐指数
1
解决办法
5929
查看次数

删除特定接口上的 tc 配置

我是使用 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 配置时删除配置的接口,否则不会。

trafficshaping traffic

6
推荐指数
2
解决办法
2万
查看次数

如何在 docker 容器上设置网络优先级?

我想在特定的 docker 容器上设置较低的优先级,这样它就不会导致其他容器的网络容量不足。我正在寻找的模型是这样的:

tc filter add dev eth0 protocol ip parent 10: prio 2
Run Code Online (Sandbox Code Playgroud)

我想我想在启动 docker 容器时设置它,以便退出该容器的虚拟接口的所有数据包都被标记为较低的优先级(较高的数字)。期望的结果是:如果没有拥塞,一切正常。当队列备份时,来自目标容器的流量将被取消优先级。

我看到了添加延迟、设置带宽上限或损坏的示例,但没有看到有关设置优先级的示例。

另外,我是否需要在 docker 桥/nat 接口上启用队列以便读取 TOS 优先级?

默认情况下,虚拟设备在不附加 qdisc 的情况下运行(出于性能原因)

networking trafficshaping docker docker-compose

6
推荐指数
0
解决办法
1444
查看次数

Linux下的流量整形

在哪里可以了解如何在Linux下控制/查询网络接口?我想获得特定的应用程序上传/下载速度,并强制执行特定应用程序的速度限制.

我特别喜欢可以帮助我使用Python编写流量整形应用程序的信息.

python linux ubuntu trafficshaping

5
推荐指数
2
解决办法
3700
查看次数

如何使用tc和cgroup对数据包进行优先处理

我正在尝试对从特定进程组生成的数据包进行优先级排序,以便首先选择它们以从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)

linux networking kernel trafficshaping

5
推荐指数
1
解决办法
4639
查看次数

用于租户隔离的 API 流量整形/节流策略

我将通过提供一些关于我们正在做什么和我们面临的问题的背景来开始我的问题。

  • 我们目前正在构建一个 SaaS(托管在 Amazon AWS 上),它由位于 API 网关(我们正在使用 Kong)后面的几个微服务组成。
  • 网关处理身份验证(通过具有 API 密钥的消费者)并公开我提到的这些微服务的 API,所有这些都是无状态的(没有会话、cookie 或类似的东西)。
  • 每项服务都使用 ECS 服务(在一台或多台 EC2 机器上运行的每个服务一个或多个 docker 容器)进行部署,并使用 Amazon Application Load Balancer (ALB) 进行负载平衡。
  • 所有租户(客户端)共享相同的环境,即完全相同的机器和资源。鉴于我们的商业模式,我们预计只有少数“大”租户(起初)。
  • 大多数对这些服务的请求在请求期间转化为大量资源使用(主要是 CPU)。处理一个请求所需的时间在 2-10 秒范围内(而不是像传统的“类网络”应用程序那样的毫秒)。这意味着我们每分钟处理的请求相对较少,每个请求都需要一段时间来处理(后台或批处理不是一种选择)。

目前,我们没有限制或限制租户在给定时间段内可以发出的请求数量的策略。考虑到上面的最后两个考虑因素,很容易看出这是一个问题,因为租户提出的请求超出我们的处理能力几乎是微不足道的,从而导致服务质量下降(即使对于其他租户也是如此)共享资源方法)。

我们正在考虑限制/节流或一般准备系统以“隔离”租户的策略,因此一个租户不能通过发出超出我们处理能力的更多请求来降低其他租户的性能:

  • 速率限制:定义租户可以发出的最大请求数/米。如果有更多请求到达,则丢弃它们。Kong 甚至有一个插件。遗憾的是,我们使用“按请求付费”的定价模型,而企业不允许我们使用这种策略,因为我们希望为尽可能多的请求提供服务,以便为它们付费。如果多余的请求需要更多的时间给租户,那很好。
  • 租户隔离:为每个租户创建一个隔离的环境。这个也被丢弃了,因为它使维护变得更加困难并导致资源使用率降低和成本增加。
  • 自动缩放:调出更多机器来吸收爆发。根据我们的经验,Amazon ECS 在这方面做得不是很快,当这些新机器准备好时,可能已经太晚了。
  • 请求“节流”:在 API 网关级别使用 Leaky Bucket 或 Token Bucket 等算法来确保请求以我们可以处理的速度命中服务。

现在,我们倾向于采用选项 4。我们希望以这样一种方式实施请求限制(流量整形),即所有在先前与租户商定的速率(由合同强制执行)内提出的请求都将传递给服务毫不拖延。由于我们事先知道每个租户每分钟将发出多少请求(至少是估计的),因此我们可以相应地调整我们的基础设施(加上安全裕度)。

如果突发到达,多余的请求将被排队(达到限制),然后以固定速率释放(使用漏桶或类似算法)。这将确保租户不会影响其他租户的性能,因为请求将以预定义的速率命中服务。理想情况下,允许的请求率将是“动态的”,这样租户可以使用其他不使用它们的租户的“每分钟请求数”(在安全限制内)。我相信这被称为“动态速率泄漏桶”算法。目标是最大限度地利用资源。

我的问题是:

  • 提议的策略是否可行?您知道此用例的任何其他可行策略吗?
  • 是否有开源、商业或 SaaS 服务可以提供这种流量整形功能?据我所知,Kong 或 Tyk 不支持这样的东西,所以......还有其他 API 网关吗?
  • 如果 Kong 不支持这一点,那么实现我所描述的插件之类的东西有多难?我们必须考虑到它需要一些共享状态(例如使用 Redis),因为我们正在使用多个 Kong 实例(用于负载平衡和高可用性)。

非常感谢你,米克尔。

api trafficshaping throttling rate-limiting

5
推荐指数
1
解决办法
1127
查看次数

使用tc进行流量整形是不准确的,带宽和延迟都很高

我正在使用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中使用重建内核- 这并没有解决问题.其他想法?

linux network-programming trafficshaping ipfw

0
推荐指数
1
解决办法
1902
查看次数