我有一个程序在 8 核服务器上启动大约 12 个线程。一些线程正在等待关键数据。在循环中使用recv的地方,recv将阻塞直到数据到来。但是,当有数据时,它需要尽快处理它。
我注意到的一件事是,有时连接安静时,线程没有太多活动。线程可能进入睡眠状态(怀疑?),然后当数据进入时,它需要先唤醒,因此浪费时间。我想知道是否有任何设置,所以线程不会被置于睡眠状态并稍后醒来?谢谢!
我有一个程序在 8 核服务器上启动大约 12 个线程。一些线程正在等待关键数据。在循环中使用recv的地方,recv将阻塞直到数据到来。但是,当有数据时,它需要尽快处理它。
我注意到的一件事是,有时连接安静时,线程没有太多活动。线程可能进入睡眠状态(怀疑?),然后当数据进入时,它需要先唤醒,因此浪费时间。我想知道是否有任何设置,所以线程不会被置于睡眠状态并稍后醒来?谢谢!
正如 Martin James 所说,阻塞是一件很正常的事情,无论是通过简单的recv
还是通过epoll
事件驱动的服务器。如果您没有观察到真正可测量的延迟问题,我不会担心。你正在做每个人都会做的事情。
通过真正可测量的延迟问题,我的意思是您明确定义的目标之间的差异(例如,在特定负载模式下在客户端测量的 1 毫秒的 50% 延迟,100 毫秒的 99.9% ile 延迟,如果您是担心阻塞)和现实。
也就是说,我听说过非常关注延迟的人抱怨当没有足够的工作来保持处理器忙碌时内核将处理器置于太深的睡眠状态,从而导致唤醒时延迟过多。我认为这将是您想要在内核级别控制的东西,而不是您的应用程序。我没有看到任何关于延迟的数字,所以这也是你想要测量的东西:找到(或创建)一种方法来控制它使用的最深睡眠状态并测量效果。
这不仅仅是你的线程,还有其他线程。在大范围内,您实际拥有多少线程并不重要。当您的线程在recv
. 因此,当有数据可以让您recv
返回时,您的线程将准备好运行,并且可能会被调度程序选择执行。如果所有内核都被优先级高于您的线程的线程占用,并且如果它们的时间片不仅幸运地结束,那么您的线程将不得不等待 cpu。但是,为了在有数据之后立即安排线程recv
,您应该提高线程优先级。在这种情况下recv
return 将使您的线程“可运行”,并且调度程序将在考虑任何其他较低优先级的线程之前切换到它。如果有必要,它甚至会停止线程的较低优先级的线程。