低延迟/高性能网络(以太网)消息传递

时间:2012-01-04 08:25:03

标签: windows linux performance network-programming

背景

我想创建一个测试应用程序来测试不同系统的网络性能。为此,我计划让该机器通过专用(非繁忙)网络将以太网帧发送到另一台机器(或设备),该机器只接收该消息并将其发回。发送应用程序将记录总往返时间(以及其他内容)。

测试的目的是了解特定的系统(OS +组件等)在网络流量方面的表现。这在下图中显示为机器A.请注意,我网络基础设施(交换机,电缆等)的性能不感兴趣 - 我正在尝试测试机器A内网络流量的性能(即从它到达网卡直到它到达用户空间的时候)

我们将(尝试)测量所有类型的东西,一件事是消息的总往返,还有机器A的中断延迟,一般驱动程序开销等。机器A将是一个实时系统。但是为了支持这些测试,我需要一个可以反弹消息的独立机器,并以其他方式为测试系统添加网络刺激。这个单独的机器是下图中的机器B,是这个问题的关键。

General overview of my test system

我的问题

我想开发一个应用程序,它可以尽可能一致地(最好是低)延迟接收和返回这些消息。我希望至少在几微秒内得到一致的延迟。为简单起见,我想在Windows或Linux等通用操作系统上执行此操作,但我愿意接受其他建议。除操作系统和我的测试应用程序外,机器上不会有其他负载(CPU或其他)。

我想到了以下方法:

  • 在具有高优先级的用户空间中运行的普通应用程序
  • 在内核空间中运行的线程,以避免用户空间/内核空间转换
  • 已经执行此操作的现成设备(我还没有找到)

问题

是否还有其他方法或框架可以做到这一点?还需要考虑什么才能获得一致且低延迟?建议采用什么方法?

2 个答案:

答案 0 :(得分:9)

您提到要测试机器A的内部性能,但“需要一台单独的机器”;但是,您不希望测试网络基础架构的性能。

你比我更了解你的要求;但是,如果我在机器A中测试网络基础设施,我会设置我的测试:

Looped Machine

这有几个原因:

  • 您可以使用以太网环回电缆来模拟机器B执行的“乒乓”功能
  • 在衡量绩效时,消除您不关心的基础设施的传输几乎总是更好的解决方案

如果您使用此测试方法,请务必注意以下几点:

  • 以太网在建立链路之前对铜缆进行信噪测试。如果你的环回弯曲太紧,如果由于电缆中的扭结,以太网决定回落到较低的速度,你可能会引入更多的延迟。铜以太网电缆没有最小长度。
  • 您可能知道,NIC /驱动程序版本/操作系统的组合会对主机内延迟产生重大影响。我在网络设备制造商工作,办公室里的一个人曾经担任SolarFlare的应用工程师。他声称许多华尔街交易系统都使用SolarFlare的NIC,因为SolarFlare为他们的产品设计了低延迟;他还说SolarFlare的驱动程序为您提供了对NIC缓冲区的用户空间访问。警告:第三手资料,我无法验证自己。
  • 如果将帧循环到机器A,请将源和目标mac-address设置为NIC上的烧录地址

即使您需要从机器B接收修改后的“pong”帧,您仍然可以使用此拓扑,只需在机器A的代码接收端重写数据包字段。放入尽可能多(或很少)的仪器在机器A的“模块”中按照您的意愿点来比较帧时间戳。

供参考:

我在您的问题评论中提到的嵌入式系统用于测量网络基础架构的延迟,而不是终端主机。这是我能够考虑用于检测主机延迟的最佳方法。

答案 1 :(得分:4)

作为现成的解决方案,我建议看看Solace,Tibco和AMQP。这些都是在交易应用程序中广泛使用的企业消息传递框架。 AMQP是开源的,能够处理每秒高达100,000条消息的吞吐量。我不确定其他框架的延迟。 AMQP消息路由器有Java或C ++实现。 C ++当然会返回更高的性能。

编辑我刚刚听说过一种名为UltraMessaging的新产品,它可以为Java,C ++或C#客户端提供每秒7,000,000条消息的吞吐量。 Crikey。

致以最诚挚的问候,