Can Boost ASIO可用于构建低延迟应用程序吗?

问题描述 投票:9回答:3

Can Boost ASIO可用于构建低延迟应用,例如HFT(高频交易)吗?

  • 因此Boost.ASIO使用特定于平台的最佳解复用机制:IOCP,epoll,kqueue,poll_set,/ dev / poll
  • 也可以使用带TOE(TCP / IP卸载引擎)的Ethernet-Adapter和OpenOnload(内核旁路BSD套接字)。

但是可以使用Boost.ASIO + TOE + OpenOnload构建低延迟应用程序吗?

c++ boost server boost-asio low-latency
3个回答
12
投票

几年前,我评估过Boost Asio用于高频交易。据我所知,今天的基础知识仍然相同。以下是我决定不使用它的一些原因:

  1. Asio依靠bind()风格的回调。这里有一些开销。
  2. 如何安排某些低级别操作在正确的时刻或以正确的方式发生并不明显。
  3. 在一个区域中有相当多的复杂代码,这对于优化很重要。针对特定用例优化复杂的通用代码更加困难。认为你不需要掩盖下来就是一个错误。
  4. 在HFT应用程序中几乎不需要可移植性。特别是,对多路复用机制进行“自动”选择与任务相反,因为必须分别测试和优化每个机制 - 这会产生更多的工作而不是减少它。
  5. 如果要使用第三方库,其他如libevlibeventlibuv则更具战争性并避免其中一些缺点。

相关:C++ Socket Server - Unable to saturate CPU


4
投票

这是Asio作者的建议,发布给公众SG-14谷歌集团(遗憾的是它有问题,他们已经转移到另一个邮件列表系统):

我在超低延迟金融市场系统上工作。与业内许多人一样,我无法透露项目细节。但是,我会尝试回答你的问题。

一般来说:

  • 在最低的延迟时间内,您将找到基于硬件的解决方案。
  • 然后:供应商特定的内核绕过API。例如,您对帧进行编码和解码,或使用不遵循BSD套接字API模型的(部分)TCP / IP堆栈实现。
  • 然后:供应商提供的插件(即LD_PRELOAD)内核旁路库,它以对应用程序透明的方式重新实现BSD套接字API。

Asio非常适合使用drop-in内核旁路库。使用这些,基于Asio的应用程序可以实现标准的金融市场协议,处理多个并发连接,并期望中等1/2的往返延迟~2 usec,低抖动和高消息速率。

我对使用Asio进行低延迟工作的人的建议可归纳为:“旋转,引脚和插入”。

旋转:不要睡觉。不要上下文切换。使用io_service :: poll()而不是io_service :: run()。首选单线程调度。禁用锁定和线程支持。禁用电源管理。禁用C状态。禁用中断合并。

引脚:分配CPU亲和力。分配中断亲和力。为NUMA节点分配内存。考虑NIC的物理位置。将核心与一般OS使用隔离。使用具有单个物理CPU的系统。

Drop-in:根据插入式内核旁路库的性能和可用性选择NIC供应商。使用内核旁路库。

该建议与正在使用的特定协议实现分离。因此,作为Beast用户,您现在可以应用这些技术,如果您这样做,您将拥有一个具有~10 usec延迟的HTTP实现(N.B.号从空中拨号,不执行实际的基准测试)。当然,特定的协议实现仍应注意可能影响延迟的事情,例如编码和解码效率,内存分配等。

就低延迟空间而言,Asio和Networking TS缺少的主要内容是:

  • 批处理数据报系统调用(即sendmmsg,recvmmsg)。
  • 某些套接字选项。

这些不包括在内,因为它们(目前)是特定于操作系统的,而不是POSIX的一部分。但是,Asio和Networking TS确实以本机_ *()函数和“可扩展”类型要求的形式提供了一个逃生舱口。

干杯,克里斯


2
投票

认为Boost.Asio,Asio和Networking TS(它们都是一样的东西)不能用于构建低延迟,高性能应用程序的人不可能更加错误。这个领域已经有很多公司多年来一直在这样做,特别是高频交易。实现最低可能延迟的技术不是特定于asio的。

首先,您需要确保使用正确的硬件。焊接到主板上的以太网适配器不适合您。相反,您需要一个针对低延迟进行优化的网络硬件平面。

其次,您需要为您的硬件获取“内核旁路”模块,该模块通常由特殊设备的供应商提供。

第三,你需要“旋转,固定和插入”。不确定这意味着什么,但在第14组的Google网上论坛(已经遇到一些问题)中进行了讨论。 spin()表示调用io_context :: poll,pin表示将您的异步执行链“固定”到特定处理器,“drop-in”表示使用我引用的内核旁路模块(它在链接时替换,调用epoll和socket I / O)。

© www.soinside.com 2019 - 2024. All rights reserved.