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

时间:2017-06-08 23:19:44

标签: c++ boost server boost-asio low-latency

可以使用Boost ASIO构建低延迟应用程序,例如HFT(高频交易)吗?

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

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

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

3 个答案:

答案 0 :(得分:11)

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

  1. Asio依赖于bind()样式回调。这里有一些开销。
  2. 如何安排某些低级别操作在正确的时刻或正确的方式发生并不明显。
  3. 在一个区域中存在相当多的复杂代码,这对于优化非常重要。针对特定用例优化复杂的通用代码更加困难。认为你不需要查看封面是错误的。
  4. 在HFT应用程序中几乎不需要可移植性。特别是,对多路复用机制进行“自动”选择与任务相悖,因为每个机制必须单独进行测试和优化 - 这会产生更多的工作而不是减少它。
  5. 如果要使用第三方库,libevlibeventlibuv等其他人会更加强硬,并避免其中一些缺点。
  6. 相关:C++ Socket Server - Unable to saturate CPU

答案 1 :(得分:3)

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

  

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

     

通常:

     
      
  • 以最低的延迟可以找到基于硬件的解决方案。

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

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

  •   
     

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

     

我对使用Asio进行低延迟工作的人的建议可以总结   如:“旋转,固定和插入”。

     

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

     

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

     

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

     

此建议与特定的协议实现分离   正在使用。因此,作为Beast用户,您可以应用以下技术   现在,如果您这样做了,您将拥有一个HTTP实现   大约10秒钟的延迟(从空中拔出的N.B.数字,没有实际的基准测试   执行)。当然,特定的协议实现仍应   注意可能会影响延迟的内容,例如编码和   解码效率,内存分配等。

     

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

     
      
  • 批处理数据报系统调用(即sendmmsg,recvmmsg)。

  •   
  • 某些套接字选项。

  •   
     

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

     

干杯,克里斯

答案 2 :(得分:2)

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

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

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

第三,您需要“旋转,固定和插入”。不知道现在是什么意思,但是在Google Groups的SG14帖子中对此进行了讨论(一直存在一些问题)。 spin()表示调用io_context :: poll,pin表示将异步执行链“固定”到特定处理器,而“ drop-in”表示使用我所指的内核旁路模块(它在链接时替换为调用epoll和套接字I / O。