2010-05-07 37 views
4

我有一个问题,需要我计算可用的最大上载和下载,然后将我的程序的使用限制在一定百分比内。但是,我想不出找到最大值的好方法。以编程方式确定最大传输速率

目前,我唯一可以提出的解决方案是在客户端和服务器之间传输几兆字节,然后测量传输的方式。但是,这种解决方案非常不理想,因为拥有100,000个客户端可能会导致服务器带宽使用量增加太多(已经太高)。

有没有人有任何解决方案来解决这个问题?

请注意,我最感兴趣的是数据的传输限制,直到它离开ISP的网络;我认为这很可能会导致其他程序通信降级的瓶颈发生。如果我错了,请纠正我。

编辑:经过进一步调查,我不认为这是可能的;准确测量离开ISP网络时的最大传输速率涉及太多变量。尽管如此,如果有人提出了一个准确的解决方案,那么这个问题就会解决。

+0

你在编写代码的操作系统是什么?您可能至少可以检索特定界面的理论最大值,但执行此操作的方法会因操作系统而异。 – 2010-05-07 15:36:40

+0

Windows。我对接口的最大值不感兴趣,我对可以通过客户端的ISP传输的最大值感兴趣;如果允许,我们的程序将使用它提供的所有内容,这会降低其他应用程序的性能。从可用性的角度来看,让用户选择自己的限制是不可接受的。 – 2010-05-07 15:44:51

+0

除了在传输过程中对实际传输速率进行抽样以外,不要以为您有更多的选择。如果你不想粉碎你的服务器,你可以考虑使用现有的服务之一来衡量它 - 比如speakeasy.net。有人必须为你提供一个API。 – AlG 2010-05-07 15:53:48

回答

0

我看到的唯一答案是:

  1. 使用一个小样本的时间 传输速率。
  2. 计算块中的实际数据(如 1k)并报告平均值。

一些问题复杂化的问题:

  • 的 发送机的处理器带宽(即其它任务 运行)。
  • 网络上的流量密度。
  • 在客户机上运行的任务。
  • 所有机器的架构。

由于客户端可以运行其它任务,并且主机(发送机)将运行不同的任务,传输速率会有所不同。

我投了一个数据块来计时,发送另一个数据并计时。累积这些持续时间,并在块的数量上取平均值。这允许动态计时,这将比任何预先计算的计时更准确。

2

如果你可以限制代码到Windows Vista或更高版本(不太可能,但谁知道?),你可以使用SetPerTcpConnectionEStatsGetPerTcpConnectionEStats随着TCP_ESTATS_BANDWIDTH_RW_v0让Windows估计带宽的连接,后来检索估计。然后,根据这个估算,你可以节制你使用的带宽。

那么会发生什么情况是,您将像现在这样开始运行应用程序,收集一段时间的统计数据,然后根据您在初始时间段内测量的数据进行限制。

这样做的好处是避免发送额外的数据只有收集带宽信息 - 它只是收集你发送的数据的统计数据。它有一个缺点(我怀疑它几乎是不可避免的),它仍然使用接近全带宽的东西,直到估计出可用的带宽为止(并且,如上所述,这是在Windows Vista中添加的,因此它甚至不太接近普遍可用)。

+0

不幸的是,我们必须支持Windows XP。 :( – 2010-05-10 18:59:37

0

如果问题是原始带宽,那么反馈机制可以在这里工作。 当您开始会话时,服务器会以最快的速度告诉客户端它将发送数据。客户端可以以最高速度收到数据。如果接收数据的速率低于数据发送速率(可以使用此处的阈值,比如低于90%),则客户端通知服务器节流数据速率并再次启动该过程。这将作为基本的QoS机制。

如果问题是连接具有较高的延迟和/或抖动,请尝试以较小的包(实际的IP/TCP包)发送信息。通常系统会尝试使用最大数据包大小,但互联网上的数据包碎片可能会延迟流量。如果这仍然不能改善延迟,那么你可以使用UDP而不是TCP。但这不能确保数据传输。

1

如果在连接的两端都有Windows设备,则可以使用后台智能传输服务(BITS)将信息和警报移出整个带宽问题。 (几乎)始终安装的组件在http://msdn.microsoft.com/en-us/library/aa362708(VS.85).aspx中描述。

您不说是否需要带宽友好性或仅仅是成本问题,因此这可能不合适。

0

一种选择是在客户端和服务器之间实现类似uTorrent's UDP transport protocol的操作,以延迟等待时间。当其他进程开始使用带宽时,仅测量原始吞吐量也无济于事,从而减少了免费的带宽量。

相关问题