我有一个侦听特定端口的服务器应用程序Foo和一个连接到Foo的客户端应用程序Bar(两者都是.NET应用程序)。
一切正常。到目前为止,这么好吗?
但是当连接速度减慢或者需要很长时间直到Foo响应时,Bar会发生什么?我必须测试它。
我的问题是,如何模拟这种减速?
一般不是那么大的问题(有一些免费的工具),但Foo和Bar都在生产机器上运行(是的,有生产机器开发。我知道,这很糟糕,但相信我,那是不是我的决定)。所以我不能只使用限制网络适配器整个带宽的工具。
是否有工具可以限制带宽或延迟特定端口的连接?是否有可能在.NET / C#中实现这一点,以便我可以编写适当的单元/集成测试?
答案 0 :(得分:2)
此问题基于预先存在的假设 - 您的应用程序的典型用法将通过慢速链接。这是一个有效的假设吗?
也许您应该问以下问题:
这是一个TCP连接,是否可以在异常缓慢的介质上运行,例如拨号?
为了使申请成功,您能量化最低可接受的吞吐量吗?
这种高度互动的连接是什么(在这种情况下,延迟会成为问题,而不仅仅是带宽)?
是的,我在质疑你的问题隐含的假设。
假设您已经回答了上述问题,并且您对应用程序的指标和成功标准非常满意,并且您仍然认为需要某种压力测试来证明问题,那么几种方法。
使用工具模拟“慢速连接”。我知道Linux流量控制的东西很先进,可以模拟任何东西(参见LARTC) - 如果你真的想要灵活,那么将Linux虚拟机设置为路由器并设置你的PC的默认值路线。对于Windows来说,可能有一些功能较少的功能可以执行类似的操作。
编写一个接受TCP连接的自定义代理应用程序,并根据您选择的某个配置文件使用自定义Thread.Sleep
执行“传递”。这样可以合理地模拟片状TCP连接,但有点不科学(TCP退避算法有点毛茸茸,很难准确模拟)。
答案 1 :(得分:1)
我用http://netlimiter.com/来测试这种东西。有些工具甚至可以让你模拟数据包丢失。
答案 2 :(得分:1)
在我的工作中,我有时必须通过缓慢/不可靠的链接测试传输代码。我发现最好的免费方法就是在FreeBSD中使用dummynet模块。我设置了一些虚拟机,它们之间有一个freebsd框作为透明网桥。我使用dummynet来阻止通过网桥的流量来模拟我想要的任何延迟和数据包丢失。
我前一段时间在我的博客上写了一篇关于它的文章,标题为Simulating Slow WAN Links with Dummynet and VMWare ESX。只要您可以控制网络接口的运行方式,它也应该适用于VMWare Workstation或其他虚拟化产品。
答案 3 :(得分:0)
您可能会在代码中放入sleep()命令以减慢它的速度,但我认为这不是一个好主意。
说实话,这真的取决于你的网络设置,我的建议是做一些基于QOS的流量整形,或类似的。