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

Ale*_*lex 12 c++ boost boost-asio low-latency server

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

  • 因此Boost.ASIO使用特定于平台的最佳解复用机制:IOCP,epoll,kqueue,poll_set,/ dev/poll

  • 也可以使用带TOE(TCP/IP卸载引擎)的Ethernet-Adapter和OpenOnload(内核旁路BSD套接字).

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

Joh*_*nck 12

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

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

相关:C++套接字服务器 - 无法使CPU饱和

  • @Alex:是的`SOCK_CLOEXEC`问题与链接中描述的问题相同.您显示的变通方法代码是好的但不是原子的,因此在某些多线程应用程序中不安全. (2认同)

Vin*_*lco 9

以下是来自Asio作者的建议,该建议已发布到SG-14 Google网上论坛(不幸的是,该论坛出现了问题,并且已经移至另一个邮件列表系统):

确实在超低延迟的金融市场系统上工作。像行业中的许多人一样,我无法透露项目细节。但是,我将尝试回答您的问题。

一般来说:

  • 以最低的延迟,您会发现基于硬件的解决方案。

  • 然后:供应商特定的内核旁路API。例如,在对帧进行编码和解码的情况下,或使用不遵循BSD套接字API模型的(部分)TCP / IP堆栈实现的情况。

  • 然后:供应商提供的插件(即LD_PRELOAD)内核旁路库,该库以对应用程序透明的方式重新实现BSD套接字API。

Asio与嵌入式内核绕过库一起很好地工作。使用这些,基于Asio的应用程序可以实现标准的金融市场协议,处理多个并发连接,并期望中位1/2往返延迟为〜2 usc,低抖动和高消息速率。

我对那些使用Asio进行低延迟工作的人的建议可以概括为:“旋转,固定和插入”。

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

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

嵌入式:根据嵌入式内核旁路库的性能和可用性选择NIC供应商。使用内核绕过库。

该建议与正在使用的特定协议实现分离。因此,作为Beast用户,您可以立即应用这些技术,并且如果您这样做,则HTTP实施的延迟约为10个使用时间(从空中拔出NB数字,不执行实际基准测试)。当然,特定的协议实现仍应注意可能影响延迟的因素,例如编码和解码效率,内存分配等。

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

  • 批处理数据报syscall(即sendmmsg,recvmmsg)。

  • 某些套接字选项。

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

克里斯,干杯

  • 谢谢!如果有人对命令和设备的特定示例的“旋转、固定和插入”技术感兴趣 http://www.alexeyab.com/2017/04/the-fastest-interconnect-for-hundreds.html (2认同)