Can Boost ASIO可用于构建低延迟应用,例如HFT(高频交易)吗?
但是可以使用Boost.ASIO + TOE + OpenOnload构建低延迟应用程序吗?
几年前,我评估过Boost Asio用于高频交易。据我所知,今天的基础知识仍然相同。以下是我决定不使用它的一些原因:
bind()
风格的回调。这里有一些开销。libev
,libevent
和libuv
则更具战争性并避免其中一些缺点。这是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确实以本机_ *()函数和“可扩展”类型要求的形式提供了一个逃生舱口。
干杯,克里斯
认为Boost.Asio,Asio和Networking TS(它们都是一样的东西)不能用于构建低延迟,高性能应用程序的人不可能更加错误。这个领域已经有很多公司多年来一直在这样做,特别是高频交易。实现最低可能延迟的技术不是特定于asio的。
首先,您需要确保使用正确的硬件。焊接到主板上的以太网适配器不适合您。相反,您需要一个针对低延迟进行优化的网络硬件平面。
其次,您需要为您的硬件获取“内核旁路”模块,该模块通常由特殊设备的供应商提供。
第三,你需要“旋转,固定和插入”。不确定这意味着什么,但在第14组的Google网上论坛(已经遇到一些问题)中进行了讨论。 spin()表示调用io_context :: poll,pin表示将您的异步执行链“固定”到特定处理器,“drop-in”表示使用我引用的内核旁路模块(它在链接时替换,调用epoll和socket I / O)。