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

Isa*_*avo 10 linux windows performance network-programming

背景

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

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

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

我的测试系统概述

我的问题

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

我想到了以下方法:

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

问题

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

Mik*_*ton 9

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

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

循环机

这有几个原因:

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

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

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

即使您需要从机器B接收修改后的"乒乓"帧,您仍然可以使用此拓扑,只需在机器A的代码接收端重写数据包字段.尽可能多地(或少数)检测点比如在机器A的"模块"中比较帧时间戳.

供参考:

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