【问题标题】:What is the maximum data/speed transfer between 2 applications on the same computer同一台计算机上的 2 个应用程序之间的最大数据/速度传输是多少
【发布时间】:2012-02-09 21:06:49
【问题描述】:

我有一个使用 Indy TIdTCPServer 和 TIdTCPClient 在 delphiXe2 中编写的客户端/服务器应用程序,它们在同一台计算机上使用 TCP 地址 127.0.0.1 相互通信

当我使用大约每秒 1 兆(8 兆位)的数据时,一切正常。

但是,当我将数据设置为 20 兆/秒(160 兆位)等更高速度时,它会变慢并开始出现奇怪的行为。

对于这种速度,这是一种常见的行为吗? 此外,我似乎找不到任何基准或信息,说明 2 个本地应用程序之间的最大数据传输速度是多少。

问候

【问题讨论】:

  • 顺便说一句,你是如何测量带宽的?您在发送或接收字节时是否在计算字节数?

标签: windows delphi indy


【解决方案1】:

执行带宽测试。这就是我使用的(我附上了相关的服务器和客户端代码)。 FWIW,我的最高速度约为 500Mbps,尽管我无法以如此快的速度处理数据。

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  lData: TByteDynArray;
  lCaption: string;
  lMbps: Real;
  lLen: Integer;
begin
  AContext.Connection.IoHandler.CheckForDataOnSource;
  SetLength(lData, 0);
  AContext.Connection.IoHandler.InputBuffer.ExtractToBytes(TIdBytes(lData),
                                     AContext.Connection.IoHandler.InputBuffer.Size);
  lLen := Length(lData);
  if lLen > 0 then begin
    if FStartTime = 0 then begin
      Memo1.Lines.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz', CsiNow) +': Started test');
      FStartTime := CsiNow;
    end;
    Inc(FBytesReceived, lLen);
    lCaption := 'MBits Received: ' + CsiPadFloat(FBytesReceived * 1.0 / 125000, 3, 1);
    if lCaption <> FLastCaption  then begin
      Label1.Caption := lCaption;
      FLastCaption := lCaption;
    end;
    if FBytesReceived >= 12500000 then begin
      FStopTime := CsiNow;
      lMbps := 100000 / MilliSecondsBetween(FStopTime, FStartTime);
      Memo1.Lines.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz', CsiNow) +
                      ': Finished test (' + CsiPadFloat(lMbps, 3, 1) + ' Mbps)');
      FBytesReceived := 0;
      FStartTime := 0;
    end
  end;

  CsiSleep(0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  lData: TByteDynArray;
  lIndex: Integer;
begin
  IdTCPClient1.Host := Edit1.Text;
  IdTCPClient1.Connect;
  try
    SetLength(lData, 125000);
    for lIndex := 1 to 125000 do
      lData[lIndex - 1] := Ord('a');
    for lIndex := 1 to 100 do
      IdTCPClient1.IoHandler.Write(TIdBytes(lData));
  finally
    IdTCPClient1.Disconnect;
  end;
end;

【讨论】:

  • 谢谢您,我将手动对其进行基准测试并以这种方式找到限制。
【解决方案2】:

如果您(ab)使用 TCP/IP 作为在设计为在同一台机器上运行的进程之间进行 IPC 的一种方式,您将遇到这样的限制。通过使用 TCP/IP,尤其是本地连接,所有数据都被分段并通过 TCP 包交换系统推送。如果是这种情况,您应该查看以下其中一项:

  • 命名或未命名管道
  • 虚拟内存映射
  • 传递 WM_DATA 消息
  • COM
  • (请随意添加更多您认为他们应该在此处列出的人)

【讨论】:

  • 实际上考虑到 Indy 可以通过 TCP 管理 500Mbps,很明显 TCP 不是问题。我想知道什么样的应用程序之间需要超过 500Mbps 的带宽!问题很可能是无法更快地处理数据,而不是通信渠道是限制因素。
  • @Misha,有人说"640kb ought to be enough for anybody."。想象一个需要 500Mbps 的应用程序并不是特别困难(尤其是考虑到我的 PC 中有两个 Gbps 网卡,其中一个通过直电缆连接到服务器,没有交换机,只有最高速度和低延迟 - 我可能可以使用更多)
  • PS 由于 TCP 窗口大小,往返时间是大多数 TCP 通信的限制因素(请参阅en.wikipedia.org/wiki/TCP_tuning)。获得更好性能的方法是使用多个 TCP 连接,因为每个连接都有一个限制吞吐量。
  • @Misha “实际上,鉴于 Indy 可以通过 TCP 管理 500Mbps”我已经阅读了 Indy 文档,但我没有在任何地方找到该信息,但这正是我正在寻找的文档,如果你可以指出它会很好。
  • @Stijn Sanders 我正在为我的应用程序使用 TCP IP,因为现在它在同一台计算机上,但在不久的将来它可能会在两台计算机上。
【解决方案3】:

没有任何代码来重现问题,很难找出问题所在。

IP 通信在本地非常稳定(所有数据都保留在内存中,在操作系统缓冲区中)- 20 MB/s 对于当今硬件/软件的带宽速度来说根本不算什么。

我猜问题出在您的代码中,或者您达到了 Delphi 的(多线程?)限制,并且在处理数据时遇到了挫折。

当然,您是否尝试禁用防病毒数据包检查?其中一些在检查 IP 数据包时会大大降低 IP 流量(即使它不是 HTTP),这会导致这种随机的 IP 流量阻塞。

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多