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

标签 windows linux performance network-programming

背景

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

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

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

General overview of my test system

我的问题

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

我想到了以下方法:

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

问题

是否有任何其他方法或框架已经可以做到这一点?为了获得一致的低延迟,我还需要考虑什么?推荐什么方法?

最佳答案

您提到要测试机器A的内部性能,但“需要单独的机器”;然而,您不想测试网络基础设施性能。

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

Looped Machine

这有几个原因:

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

如果使用这种测试方法,一定要注意以下几点:

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

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

仅供引用:

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

关于windows - 低延迟/高性能网络(以太网)消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8723937/

相关文章:

c++ - FindFirstFile 未记录的通配符或错误?

c - 你如何清除 C 中的控制台屏幕?

linux - 如何通过Shell将温度和对应的时间存储到文件中?

c++ - CSV 解析器的性能瓶颈

c# - 搜索可枚举的最有效方法

python - 如何在Win10/powershell上获取免费/开放的本地端口以进行ssh转发

java - 线程中的异常 "AWT-EventQueue-0"java.lang.ArrayIndexOutOfBoundsException : 10 for Inventory

linux - 如果没有传递参数,如何显示帮助文本

linux - 如何在 Linux 中启用类似 RTS_CONTROL_TOGGLE 的功能

javascript - Nodejs 中如何处理异步性?