Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost ASIO能否用于构建低延迟应用程序?_C++_Boost_Server_Boost Asio_Low Latency - Fatal编程技术网

C++ Boost ASIO能否用于构建低延迟应用程序?

C++ Boost ASIO能否用于构建低延迟应用程序?,c++,boost,server,boost-asio,low-latency,C++,Boost,Server,Boost Asio,Low Latency,Boost ASIO能否用于构建低延迟应用程序,如HFT(高频交易) 因此Boost.ASIO使用特定于平台的最佳解复用机制:IOCP、epoll、kqueue、poll\u set、/dev/poll 还可以与TOE(TCP/IP卸载引擎)和OpenOnload(内核旁路BSD套接字)一起使用以太网适配器 但是,使用Boost.ASIO+TOE+OpenOnload可以构建低延迟应用程序吗?几年前,我评估了Boost-ASIO在高频交易中的使用情况。据我所知,今天的基本情况还是一样的。以下

Boost ASIO能否用于构建低延迟应用程序,如HFT(高频交易)

  • 因此Boost.ASIO使用特定于平台的最佳解复用机制:IOCP、epoll、kqueue、poll\u set、/dev/poll

  • 还可以与TOE(TCP/IP卸载引擎)和OpenOnload(内核旁路BSD套接字)一起使用以太网适配器


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

几年前,我评估了Boost-ASIO在高频交易中的使用情况。据我所知,今天的基本情况还是一样的。以下是我决定不使用它的一些原因:

  • Asio依赖于
    bind()
    样式的回调。这里有一些开销
  • 如何安排某些低级操作在适当的时机或以适当的方式进行,这一点并不明显
  • 有相当多的复杂代码在一个领域,这是重要的优化。为特定用例优化复杂、通用的代码比较困难。认为你不需要看封面下的东西是错误的
  • 在HFT应用程序中几乎不需要可移植性。特别是,对多路复用机制进行“自动”选择与任务背道而驰,因为每个机制都必须分别进行测试和优化——这会产生更多的工作,而不是减少工作
  • 如果要使用第三方库,其他库(如
    libev
    libevent
    libuv
    )则更具战斗力,可以避免这些缺点

  • 相关:

    这是Asio作者的建议,发布到公共SG-14谷歌集团(不幸的是,该集团出现了问题,他们已经转移到另一个邮件列表系统):

    我从事超低延迟金融市场系统的工作。像许多人一样 在业内,我无法透露项目细节。然而,我 将尝试回答您的问题

    一般而言:

    • 以最低的延迟,您将找到基于硬件的解决方案

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

    • 然后:供应商提供的drop-in(即LD_PRELOAD)内核旁路库,它以一种 对应用程序透明

    Asio可以很好地使用内嵌式内核旁路库。使用 这些基于Asio的应用程序可以实现标准的财务 销售协议,处理多个并发连接,并期望 中位1/2往返延迟约为2 usec,抖动低且高 消息速率

    我对那些使用Asio进行低延迟工作的人的建议可以总结如下 如:“旋转、固定和降落”

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

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

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

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

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

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

    • 某些插座选项

    这些不包括在内,因为它们(目前)是特定于操作系统的,并且 不是POSIX的一部分。然而,Asio和网络TS确实提供了 转义图案填充,以本机函数和 “可扩展”类型需求

    干杯,克里斯


    我能看见。5.和(有点)4。大约2点。当涉及到正确处理与自定义处理程序类型相结合的股时,我同意。这就是你所说的“以正确的方式”吗?我真的不知道如何需要(1.)bind风格的回调,更不用说异步完成可以避免最小的开销了。(3.)您指的是库代码还是呼叫代码?也许你有一个引人注目的例子?@sehe:我没有使用Boost.Asio的示例代码-当我们意识到它行不通时,我们放弃了用它构建的原型。那时,
    libuv
    是不可行的,但是
    libev
    libevent
    是——我们仍然选择走自己的路。我所说的“以正确的方式”是指需要(a)在特定时间使用特定的sockopts/ioctl,(b)完全控制多个连接的优先级(包括故意饥饿),以及(c)使用特定的、不可移植的API,如
    accept4()
    (Asio即使在今天也没有使用,因此不能使用原子
    SOCK\u CLOEXEC
    )。啊。你说的“以正确的方式”是指与外部需求相关的(我假设你指的是“针对Asio”).Atomic SOCK_CLOEXEC是我遇到并不得不解决的问题之一。我不希望有任何示例代码,只是这些示例澄清了您对抽象项目符号文本的想法:)饥饿确实是一个问题。我