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