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

C++ UDP/TCP服务器中侦听器线程与工作线程的比率?,c++,multithreading,sockets,networking,C++,Multithreading,Sockets,Networking,我正在编写一个同时处理UDP和TCP连接的服务器,并编写了一个基本的线程池库作为服务器的基础。我有一个监听器线程,它执行accept/recvfrom系统调用(分别针对TCP和UDP)并将任务推送到线程池,但我不认为为n个工作线程提供一个监听器线程会在n增加超过50或60个线程时表现良好。例如,如果我有一个具有60个工作线程的实例化UDP服务器和一个执行recvfrom的侦听器线程。如果处理器需要在所有这些线程之间切换上下文,我关心的是- 侦听器线程将花费更多的未计划时间,因此丢弃的数据包将超过

我正在编写一个同时处理UDP和TCP连接的服务器,并编写了一个基本的线程池库作为服务器的基础。我有一个监听器线程,它执行accept/recvfrom系统调用(分别针对TCP和UDP)并将任务推送到线程池,但我不认为为n个工作线程提供一个监听器线程会在n增加超过50或60个线程时表现良好。例如,如果我有一个具有60个工作线程的实例化UDP服务器和一个执行recvfrom的侦听器线程。如果处理器需要在所有这些线程之间切换上下文,我关心的是-

  • 侦听器线程将花费更多的未计划时间,因此丢弃的数据包将超过可接受的数量

  • 因为只有一个线程在侦听,所以大多数工作线程将没有任务要执行,因此大部分时间将花在睡眠上


  • 听众和员工的比例是多少?我怎样才能确定这个比率呢?

    您所描述的是这个比率的一个变体。对于较大数量的连接,N:N模型(每个请求一个工作者)确实会因为上下文切换而开始崩溃。许多应用程序所做的是使用M:N模型,其中M是请求数,N是CPU数。大约有N个工作线程被启动来处理请求,根据线程所做的CPU与I/O工作以及系统上运行的其他进程的多少,工作线程的数量可以分别增加到N以上或N以下


    对于高CPU工作进程,一个非常好的调度器实现是。它还考虑了缓存相关性。即使只是为了想法,也值得一看。

    “听众和员工的比例是多少?”很抱歉,没有现成的公式。这完全取决于您的实际用例、部署和需求。我想没有公式。然而,我不知道如何确定这个比率。你所说的“侦听线程”到底是什么意思?调用
    accept()
    以侦听传入连接的线程?或者一个线程监听来自已经连接的客户端的数据?前者,在TCP的情况下,对于UDP,侦听器调用recvfrom并将结果数据推送到threadpoolOne hack只需让侦听线程以比使用者更高的调度程序优先级运行,所以它总是优先考虑另一个优秀的工具集是。它们需要相当多的工作和理解才能正确设置,但一旦完成,它们在内核级阻塞检测和线程资源管理方面就具有巨大的优势。在几乎任何IO api上调用阻塞调用都会使当前线程处于运行但等待的状态,从而推动IOCP池管理器针对当前挂起的工作负载释放另一个线程。如果Windows是目标平台,那么值得一看。