linux多线程调度



我有一个程序在8核服务器上启动大约12个线程。一些线程正在等待关键数据。在循环中使用recv的情况下,recv将阻塞,直到数据到来。然而,当有数据时,它需要尽快处理。

我注意到的一件事是,从连接安静的时候开始,线程就没有太多活动。线程可能处于休眠状态(可疑?),然后当数据进入时,它需要先唤醒,从而浪费时间。我想知道是否有任何设置,这样线程就不会进入睡眠状态,稍后醒来?谢谢

这不仅仅是您的线程,还有其他线程。在很大的范围内,实际拥有多少线程并不重要。当您的线程在recv上等待时,调度程序可能会选择其他线程。因此,当有数据让recv返回时,线程将准备好运行,调度器可能会选择执行。如果所有核心都被优先级高于线程的线程占用,并且它们的时间片不太可能结束,那么线程将不得不等待cpu。但是,为了在recv有数据后立即调度线程,您应该提高线程的优先级。在这种情况下,recv返回将使您的线程"可运行",并且调度程序将在考虑任何其他优先级较低的线程之前切换到它。如果必要的话,它甚至会停止你的线程中优先级较低的线程。

正如Martin James所说,无论是通过简单的recv还是通过事件驱动服务器中的epoll,阻塞都是一件正常的事情。如果你还没有观察到真正可测量的延迟问题,我不会担心。你正在做每个人都在做的事情。

所谓真正可测量的延迟问题,我指的是你明确定义的目标(比如,在特定负载模式下,在客户端测量的1毫秒的50%延迟,100毫秒的99.9%ile延迟,如果你担心阻塞,可能是突发性的)和现实之间的差异。

也就是说,我听说过一些非常关注延迟的人抱怨内核在没有足够的工作来保持处理器繁忙时将处理器置于深度睡眠状态,从而导致唤醒延迟过大。我认为这将是您希望在内核级别控制的东西,而不是您的应用程序。我手头没有任何关于延迟的数字,所以这也是你想要测量的:找到(或创建)一种方法来控制它使用的最深睡眠状态并测量效果。

最新更新