【问题标题】:Queueing or not queueing for low latency排队或不排队以获得低延迟
【发布时间】:2020-01-09 02:20:22
【问题描述】:

我正在用 C++ 编写一个低延迟程序,它从源接收数据、处理数据并通过 TCP 套接字发送到目标。我对所有这 3 个模块都有一个单独的线程,接收者线程、处理器线程、发送者线程。所有这些线程都在与无锁队列进行通信。
您是否认为直接发送消息而不使用发送方部分的队列会降低延迟?会不会影响性能稳定性?
谢谢

【问题讨论】:

  • 我认为不可能在所有情况下都给出一个通用的是或否答案。这取决于很多事情,只有测量才能真正给你一个好的答案。
  • 三个线程的目的是什么?让一个线程接收数据,处理它,然后发送回复而不浪费时间切换线程不是更快吗?更多线程如何降低延迟?
  • @DavidSchwartz 如果应用程序不能丢弃数据,您需要这样的设计(分离的接收器和处理器线程,中间有一个事件缓冲区)来处理容量峰值。使用线程 CPU 固定并使用无锁数据结构,没有时间浪费在切换线程上。但是同步 CPU 缓存需要一点成本。 @ xyzt 通常有处理器线程来发送数据。从理论上讲,发送者线程只是将数据写入套接字缓冲区,对吧? (话虽如此,我从未对此进行基准测试。请随时对其进行基准测试以证明理论)
  • @SPD 我认为单线程异步会以同样的方式工作。如果它不能足够快地处理数据包,它就会出现不同类型的问题,并且最终无论如何都会耗尽内存。所以我想这是内核的 RX 队列大小、负载测试、基准测试和重要的分析的问题。 @ xyzt 没有挥手的争论会在这里提供帮助。您必须同时完成这三个操作才能获得明确的答案:分析时进行基准测试和负载测试。
  • @TomTrebicky 取决于数据包流的弹性要求/特征,应用级消息队列是处理网络数据包量激增的一种方式。如果处理速度一直慢于数据包到达速度,那就完全不同了。

标签: c++ sockets low-latency


【解决方案1】:

如果将三个线程固定到不同的物理内核,则使用单独的发送者线程将比执行发送操作的处理器线程提供更低的延迟,尤其是在发送过程中发生重试的情况下。即使是尽最大努力异步发送,您仍然可以节省写入套接字所需的边际时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多