我将首先描述我的任务,然后在下面提出我的问题。
我正在尝试为我们的分布式数据采集系统实现“单线程一连接”方案。我在 Linux 平台上将 Boost 用于线程(thread_group),将 ASIO 用于套接字。
我们有 320 个联网的 DAQ 模块。大约每 0.25ms 一次,其中大约一半会各自生成一个数据包(大小小于标准 MTU)并发送到 linux 服务器。每个模块都有自己的长寿命 TCP 连接到服务器上的专用端口。也就是说,服务器端应用程序运行 320 个线程 320 个 tcp 同步接收器,在 1Gbe NIC,8 个 CPU 内核上。
320 个线程不必对传入的数据进行任何计算 - 只需接收数据、生成和添加时间戳并将数据存储在线程拥有的内存中。套接字都是同步的,因此没有传入数据的线程会被阻塞。套接字在运行期间保持打开状态。
我们的要求是线程应该以尽可能短的时间延迟读取它们各自的套接字连接。阅读了 C10K和这篇文章后 ,我预计每个线程每秒都能轻松处理至少 1K 的 MTU 大小的数据包。
我的问题是这样的:我首先通过在服务器上触发时间同步数据来测试系统(不同套接字上的传入数据相隔不到几微秒)。当数据包的数量非常少(小于 10)时,我发现线程时间戳之间相隔几微秒。但是,如果超过 10 个,则时间戳会分散多达 0.7 秒。
我的问题是:
- 我是否完全误解了 C10K 问题并搞砸了实施?与C10K相比,320确实微不足道
- 关于出了什么问题的任何提示?
- 这真的可以重用线程和/或套接字吗?(我真的不知道如何在我的情况下实现重用,所以任何解释都值得赞赏。)