UDP / TCP服务器中侦听器线程与工作线程的比率?

时间:2015-05-24 18:59:38

标签: c++ multithreading sockets networking

我正在编写一个处理UDP和TCP连接的服务器,并编写了一个基本的线程池库作为服务器的基础。我有一个侦听器线程,它执行accept / recvfrom系统调用(分别用于TCP和UDP)并将任务推送到线程池,但我不认为为n个工作线程设置一个侦听器线程,因为n增加到50以上或60个线程。例如,如果我有一个实例化的UDP服务器,其中包含60个工作线程和一个执行recvfrom的侦听器线程。如果处理器需要在所有这些线程之间进行上下文切换,我关心的是 -

  1. 侦听器线程将花费更多时间未安排,因此将丢弃的数据包超出可接受的数量

  2. 由于只有一个线程正在侦听,因此大多数工作线程都没有任务可执行,因此大部分时间都在休眠

  3. 听众和工人之间的比例是多少?我怎么能确定这个比例?

1 个答案:

答案 0 :(得分:2)

您所描述的内容是Thundering Herd Problem的变体。对于大量连接,N:N模型(每个请求一个工作者)由于上下文切换而开始崩溃。许多应用程序改为使用M:N模型,其中M是请求数,N是CPU数。大约N个工作线程被启动来处理请求,并且根据线程执行的CPU和I / O工作量以及系统上运行的其他进程,工作线程的数量可以分别增加到N或N以下。

高CPU工作流程的一个非常好的调度程序实现是scheduler in TBB。它还考虑了缓存关联性。即使仅仅是为了创意,也值得关注。