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用于高频交易.据我所知,今天的基础知识仍然相同.以下是我决定不使用它的一些原因:
bind()样式回调.这里有一些开销.libev,libevent和libuv更久经沙场,并避免一些不利方面.以下是来自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 _ *()函数和“可扩展”类型要求的形式提供了逃生舱口。
克里斯,干杯