【问题标题】:Bandwidth Shaping in my C# application我的 C# 应用程序中的带宽整形
【发布时间】:2017-04-25 19:26:10
【问题描述】:

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

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

问题是:

当我的互联网带宽较低时,视频流会占用我所有的带宽。所以在那段时间里我没有从我的网络服务方法中得到响应。

有什么方法可以优先处理WebRequest 或为他们节省一些带宽以便我可以安全地得到回复?

【问题讨论】:

  • AFAIK,流量整形通常在使用 QoS 的路由器中完成。
  • 您对网络有任何控制权吗?或者它是移动的?您说“当您的互联网带宽较低时”。是因为应用程序可能在多个位置运行,还是因为有时您的互联网运行缓慢?如果你有控制权并且是一个业务网络,你应该可以为不同的连接设置不同的预留带宽。因此,您可以通过拆分 API 并为它们提供保留的带宽来做到这一点。尽管如果您无法控制网络或 lib 流,那么可能很难对其进行限制。
  • @Amy 我无权访问路由器配置。
  • @AustinWinstanley 不,我对网络没有任何控制权。互联网运行缓慢。
  • 你能把代码分成 2 个不同的项目并以较低的优先级运行流式传输吗?

标签: c# webrequest bandwidth trafficshaping low-bandwidth


【解决方案1】:

我不知道 C# 中有任何方法可以以这种方式优先处理流量。

我知道这不是一个堆栈溢出类型的答案,但是当您没有适当的网络基础设施访问权限时,这就是我处理流媒体服务的方式,而不是杀死我的环境中的带宽,这是执行此操作的“正确”方式。

当您确定要使用哪种方法时,我建议您查看https://superuser.com,它应该能够解决您在实施解决方案时遇到的任何绊脚石。

解决方案一。

拆分为 2 个服务并通过每个服务中的 REST API 或数据库轮询进行通信。 然后使用网络限制程序对其中一项服务的流量进行优先级排序。 https://www.netlimiter.com/https://netbalancer.com/ 是可以做到这一点的软件示例,但还有更多。

优势:您将对流媒体服务进行动态限制。

缺点:您必须在服务器上运行另一个程序,而且它绝对不是免费的。

解决方案二。

使用 IIS,在 IIS https://www.iis.net/configreference/system.applicationhost/weblimits 中有一个内置的节流阀并查看 maxGlobalBandWidth。 然后你有 2 个网站通过 REST 或数据库轮询进行通信。 优点:开箱即用的简单解决方案。

缺点:您的限制不是动态的,而是在您的配置文件中。

请注意,如果您的 Internet 网络速度变化很大,则不应使用此方法。

【讨论】:

  • 他说他无法控制第一个库,它是一个 UDP 视频流,所以我不认为它是一个 REST API,也不认为它会转到 IIS 端点。
  • 他不需要对第一个库有任何控制权。照原样使用它。然后,当他需要发布他的控制消息时,他的应用程序使用 rest api 告诉其他服务发送消息。从他的 cmets 我假设它只是一个嵌入在服务中的流媒体库
  • 他的问题表明图书馆是他的应用程序的一部分,而不是服务。
  • 确实如此,如果他的应用程序不能作为服务运行,那么 IIS 将无法运行。在解决方案一中,它是 winform、wpf 还是服务都没有关系。
  • 我更喜欢第一个解决方案,因为应用程序在客户端而不是服务器上运行。现在的问题是如何嵌入 netlimiter?如何编写自己的 netlimiter?
【解决方案2】:

为简单的 UDP 流设置 UDP 中继服务器非常简单,然后您可以根据需要使用它来限制流量。你可以把它放在你的应用程序中,这样一切都是独立的,并且你的中继服务器知道何时发出 Web 请求。创建一个 UdpClient 以接收 127.0.0.1 上的流量,并让视频流库连接到该地址而不是您的实际服务器。然后创建另一个 UdpClient,它将流量中继到您通常与库连接的实际目的地。

您可以使用此方法通过多种方式限制带宽,具体操作方式最终取决于您的要求。您可以在启动 Web 请求时暂停转发 UDP 帧,如果可以接受暂停,则在收到响应后继续转发它们。如果没有,那么您可以在中继数据时跟踪平均 UDP 帧/秒,并通过在您的网络请求待处理时向中继服务器插入适当的延迟来动态地将速率限制为 50%(或其他)。

您可以在此处查看 DNS 请求的简单 UDP 中继服务器实现示例,基本原理相同:

https://social.msdn.microsoft.com/Forums/en-US/ce062e62-395f-4110-a4dd-3e9ed3c88286/udp-relay-server?forum=netfxnetcom

【讨论】:

  • 这是一个非常有趣的解决方案。你有这方面的实际使用经验吗?如果有多个流,我会有点担心 IO 量会增加一倍。
  • 我已经像这样构建了基于 TCP 的中继服务器,没有遇到任何问题。由于您要发送到 localhost 它实际上不会留下内存,因此与其他所有事情(解码,编码等)相比,我认为它应该是相当小的开销,但您必须对其进行测试。您可以用大约 15 行代码编写一个简单的中继服务器,看看它如何影响您的流。
  • 我刚刚检查了一个用 C# 编写的 TCP 中继应用程序的 CPU 使用率,同时以 90Mbps 的速度传输数据,它在 3Ghz Xeon 上使用了 1 个 CPU 的约 5%。峰值下载速度完全不受中继的影响。尽你所能:)
  • 那真是太好了。 Cpu 并不有趣,因为中继的东西应该很清楚。我想知道IO。我的东西是流 json 和 20 MB/s (160 mbps) 的峰值,我正在将部分流中继到其他服务器并遇到问题。 (虚拟机和 SAN 设置)
  • 我认为 CPU 使用率是此类中继唯一有趣的指标,因为发送到 localhost 实际上并不使用任何真正的 IO,它只是一个 memcpy,因为它在操作系统网络堆栈中移动。它实际上并没有通过网络适配器或类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
相关资源
最近更新 更多