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