计算Web服务下载的吞吐量

时间:2009-12-19 03:02:27

标签: c# web-services file-transfer

我有一个客户端服务器应用程序,它为客户端请求的数据交换XML文档。本质上,用户输入一些搜索约束(要匹配的属性),客户端与两个系统通信以获取数据(来自数据库的一些数据和来自文件服务器的一些数据)。

从文件服务器返回的数据(存档数据的文件)比从服务器返回的元数据要大得多,相应地需要更多的时间来执行。

用户要求我提供一些指标,说明下载存档数据所需的时间以及下载速度(下载后)。

客户端服务器与异步I / O和众多线程进行通信,因此我不能只使用启动/停止计时器来完成此任务。

我目前的实施方式如下:

  1. 记录当前的Ticks(这是一个长时间运行的过程,因此刻度分辨率很好)
  2. 将请求转交给Webservice Asyncronously。
  3. ---等等---
  4. 获取当前的滴答声
  5. 获取返回文档的大小(从SOAP信封中没有考虑到一些开销,但我认为这没关系)
  6. 费率=(文件大小/ 1024)/(结束刻度 - 开始刻度)*刻度/秒(我让一个时间跨度对象执行此操作)
  7. 起初我认为这种方法还可以,但我有用户报告说,小样本的速率比大样本的速率要低得多,而且一次执行的速率变化很大。

    有没有更好的方法来计算这个更能免疫的速度?有意义的是,对于较大的档案,速率会更高,但在测试中我发现它比具有大小的文件高10-40倍,这没有意义。

1 个答案:

答案 0 :(得分:2)

在问题中测量的吞吐量假定转移时间是同质的。它不是。在会话开始时有一个设置成本,包括TCP 3次握手和产生结果所需的服务器时间。设置完成后,其余部分主要由网络吞吐量决定。

对于大型有效负载,设置时间只占总传输时间的一小部分,因此计算的吞吐量接近您的预期。对于小型有效载荷,测量的时间主要是设置时间!因此,计算出的吞吐量可能会下降几个数量级。

你能做什么?找到一种方法从设备中删除设置组件。

  1. 如果您可以在数据开始到达时收到通知,则可以在那里开始计时。这应该适用于除最短响应之外的所有响应(内容适合单个网络数据包。)

  2. 或者,让服务器在发送之前将时间戳附加到响应。您可以将其用作开始时间,注意调整机器之间的任何时钟差异。