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