首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Boost ASIO可以用来构建低延迟的应用程序吗?

Boost ASIO可以用来构建低延迟的应用程序吗?
EN

Stack Overflow用户
提问于 2017-06-08 23:19:43
回答 2查看 5.6K关注 0票数 22

可用于构建低延迟应用程序,如高频交易( HFT )?

  • 因此,Boost.ASIO使用特定于平台的最优解复用机制: IOCP、epoll、kqueue、poll_set、/dev/poll。
  • 还可以使用带有TOE (TCP/IP卸载引擎)和OpenOnload (内核旁路BSD套接字)的以太网适配器。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-08 23:50:57

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

  1. Asio依赖于bind()风格的回调。这上面有一些东西。
  2. 如何安排某些低级别的操作在正确的时间或方式进行并不明显。
  3. 在一个需要优化的领域中,有相当多的复杂代码。很难为特定用例优化复杂的通用代码。以为你不需要在被子底下看就错了。
  4. 在HFT应用程序中几乎不需要可移植性。特别是,“自动”选择多路复用机制与任务相反,因为每个机制都必须分别进行测试和优化--这将产生更多的工作,而不是减少。
  5. 如果要使用第三方库,libevlibeventlibuv等其他库就会更加强硬,并避免其中的一些不利因素。

相关:C++ Socket Server - Unable to saturate CPU

票数 18
EN

Stack Overflow用户

发布于 2019-02-23 22:44:42

这是Asio作者的建议,他向公众发布了SG-14 Google Group (不幸的是,他们有问题,他们已经转移到另一个邮件列表系统):

我确实从事超低延迟金融市场系统的工作。就像业内的许多人一样,我无法透露项目的细节。不过,我会尝试回答你的问题。 一般而言:

  • 在最低延迟时,您将找到基于硬件的解决方案。
  • 然后:特定于供应商的内核绕过API。例如,您可以对帧进行编码和解码,或者使用不遵循BSD套接字API模型的(部分) TCP/IP堆栈实现。
  • 然后:供应商提供的插入(即LD_PRELOAD)内核绕过库,它以对应用程序透明的方式重新实现BSD套接字API。

Asio在插入内核旁路库时工作得很好。使用这些,基于Asio的应用程序可以实现标准的金融市场协议,处理多个并发连接,并期望中间的1/2往返延迟为~2 usec,低抖动和高消息率。

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

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

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

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

此建议将与正在使用的特定协议实现解耦。因此,作为Beast用户,您现在可以应用这些技术,如果您应用了这些技术,那么您将有一个具有~10 usec延迟的HTTP实现(请注意,从空气中提取编号,不执行实际的基准测试)。当然,特定的协议实现仍然应该注意可能影响延迟的事情,例如编码和解码效率、内存分配等等。

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

  • 批处理数据报系统(即sendmmsg,recvmmsg)。
  • 某些套接字选项。

这些内容不包括在内,因为它们(目前)是操作系统特有的,而不是POSIX的一部分。但是,Asio和Networking确实提供了一个转义舱口,其形式是native_*()函数和“可扩展”类型需求。

干杯,克里斯

票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44446984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档