可以使用Boost ASIO构建低延迟应用程序,例如HFT(高频交易)吗?
So Boost.ASIO使用特定于平台的最佳解复用机制:IOCP,epoll,kqueue,poll_set,/ dev / poll
也可以使用带TOE(TCP / IP卸载引擎)的Ethernet-Adapter和OpenOnload(内核旁路BSD套接字)。
但是可以使用Boost.ASIO + TOE + OpenOnload来构建低延迟应用程序吗?
答案 0 :(得分:11)
几年前,我评估过Boost Asio用于高频交易。据我所知,今天的基础知识仍然相同。以下是我决定不使用它的一些原因:
bind()
样式回调。这里有一些开销。libev
,libevent
和libuv
等其他人会更加强硬,并避免其中一些缺点。答案 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。