两个应用程序在同一台计算机上的最大数据/速度传输是多少?

6

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

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

但是,当我将我的数据设置为更高的速度,例如20兆字节/秒(160兆比特),它就会变慢并开始表现出奇怪的行为。

这种速度的行为是否很常见?此外,我似乎找不到任何关于两个本地应用程序之间的最大数据传输速度的基准或信息。

谢谢!


顺便问一句,你是如何测量带宽的?你是在发送或接收字节时计算它们吗? - Misha
3个回答

4

进行带宽测试。这是我使用的方法(我已经附上了相关的服务器和客户端代码)。顺便说一句,我最高能获得大约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;

谢谢,我将手动进行基准测试并以此找到极限。 - Chadak

2
如果你在进程间通信时滥用TCP/IP作为手段,而这些进程旨在在同一台机器上运行,你会遇到像这样的限制。使用TCP/IP,特别是本地连接,所有数据都会被分割并通过TCP的数据包交换系统传输。如果是这种情况,你应该考虑以下其中一种方法:
  • 命名管道或匿名管道
  • 虚拟内存映射
  • 传递WM_DATA消息
  • COM
  • (如果你发现还有其他值得列出的,请随意添加)

2
实际上,鉴于Indy可以通过TCP管理500Mbps,很明显TCP不是问题所在。我想知道需要哪种类型的应用程序在它们之间需要超过500Mbps的带宽!问题很可能是数据无法更快地处理,而不是通信通道是限制因素。 - Misha
@Misha,有人曾说过:“640kb应该足以满足任何人的需要。”想象一个需要500Mbps的应用程序并不特别困难(尤其是考虑到我的PC上有两个Gbps网卡,其中一个使用直连电缆连接服务器,没有交换机,只有最大速度和低延迟 - 我可能能够使用更多)。 - Cosmin Prund
PS 往返时间是大多数TCP通信中的限制因素,因为TCP窗口大小有限(请参见http://en.wikipedia.org/wiki/TCP_tuning)。获得更好性能的方法是使用多个TCP连接,因为每个连接都具有限制吞吐量。 - Misha
@Misha “实际上,鉴于Indy可以通过TCP管理500Mbps”,我已经阅读了Indy文档,但是我没有在任何地方找到这些信息,但这正是我正在寻找的文档,如果您能指出它,那就太好了。 - Chadak
@Stijn Sanders,我正在使用TCP/IP协议进行我的应用程序开发,因为目前它在同一台电脑上,但在不久的将来可能会移到另外一台电脑上。 - Chadak
@Chadak,那是我的测试结果。 - Misha

0

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

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

我猜测问题出在你的代码上,或者你达到了(多线程?)Delphi的限制,并且在处理数据时产生了混乱。

当然,你尝试禁用防病毒软件的数据包检查了吗?其中一些在检查IP数据包时会严重减缓IP流量(即使不是HTTP),这会导致这种随机的IP流量拥堵。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接