Multithreading Boost:多线程性能,线程/套接字的重用

Multithreading Boost:多线程性能,线程/套接字的重用,multithreading,sockets,boost,c10k,Multithreading,Sockets,Boost,C10k,我将首先描述我的任务,然后在下面提出我的问题 我正在尝试为我们的分布式数据采集系统实现“一线程一连接”方案。我在Linux平台上使用了Boost for threads(线程组)和ASIO for Socket 我们有320个网络化DAQ模块。大约每0.25ms一次,其中大约一半将生成一个数据包(大小小于标准MTU)并发送到linux服务器。每个模块都有自己的长寿命TCP连接到服务器上的专用端口。也就是说,服务器端应用程序在1Gbe NIC、8个CPU核上运行320个线程320个tcp同步接收器

我将首先描述我的任务,然后在下面提出我的问题

我正在尝试为我们的分布式数据采集系统实现“一线程一连接”方案。我在Linux平台上使用了Boost for threads(线程组)和ASIO for Socket

我们有320个网络化DAQ模块。大约每0.25ms一次,其中大约一半将生成一个数据包(大小小于标准MTU)并发送到linux服务器。每个模块都有自己的长寿命TCP连接到服务器上的专用端口。也就是说,服务器端应用程序在1Gbe NIC、8个CPU核上运行320个线程320个tcp同步接收器

320个线程不必对传入数据进行任何计算,只需接收数据、生成和添加时间戳,并将数据存储在线程拥有的内存中。套接字都是同步的,因此没有传入数据的线程被阻塞。套接字在运行期间保持打开状态

我们的要求是,线程应该以尽可能少的时间延迟读取各自的套接字连接。在阅读了C10K之后,我希望每个线程能够轻松地每秒处理至少1K MTU大小的数据包

我的问题在于:我首先通过在服务器上触发时间同步数据(不同套接字上的传入数据相隔不到几微秒)来测试系统。当数据包的数量非常少(少于10)时,我发现线程时间戳之间的间隔只有几微秒但是,如果时间戳超过10,则时间戳的间隔最多为0.7秒。

我的问题是:

  • 我是否完全误解了C10K问题,并把实现搞砸了?320与C10K相比似乎微不足道
  • 关于哪里出了问题,有什么提示吗
  • 这真的是重用线程和/或套接字的情况吗?(在我的例子中,我真的不知道如何实现重用,因此任何解释都非常感谢。)

  • 320个线程在资源方面是一个巨大的变化,但是调度可能会带来问题

    320*0.25=每秒80个请求,这意味着至少有80个上下文切换,因为您决定必须在一个线程上建立每个连接

    我只是建议:不要这样做。众所周知,每个连接的线程数不可伸缩。而且它几乎总是意味着进一步锁定任何共享资源上的争用(假设所有响应都不是完全无状态的)


    Q.读过C10K和这篇文章后,我希望每个线程每秒都能轻松处理至少1K MTU大小的数据包

    对。(在大多数系统上)一个线程就可以很容易地支持这一点但是显然,如果有数百个线程尝试使用相同的线程,争夺一个物理核心,那么这就不再是事实了

    因此,为了获得最大吞吐量和低延迟,拥有比可用(!)物理内核更多的线程几乎没有任何用处


    Q.这真的是线程和/或套接字重用的情况吗?(在我的例子中,我真的不知道如何实现重用,因此任何解释都非常感谢。)

    好消息是Boost Asio使使用单个线程(或有限的线程池)从其服务队列服务异步任务变得非常容易

    也就是说,假设您已经使用了ASIO API函数的
    *\u async
    版本

    我认为绝大多数(如果不是全部的话)异步IO的Boost Asio示例展示了如何仅在有限数量的线程上运行服务


    荣誉+1是为了实际进行测量。你缺乏的任何理解都会很快伴随着这种调查心态而来。如果你保持这个习惯,你就不会陷入可伸缩性陷阱,以为你已经看到了一切:)