linux – 使用现代操作系统调度程序,手动锁定特定CPU /内核的进程是否仍然有意义?

我最近了解到,有时人们会将特定的进程或线程锁定到特定的处理器或内核,并且认为这种手动调优将最好地分配负载.这对我来说有点违反直觉 – 我认为操作系统调度程序能够比人类更好地决定如何分散负载.我可以看到,对于较旧的操作系统来说,这可能是不正确的,例如它们在特定核心对之间的延迟,或者在一对核心之间共享缓存而不是另一对核心之间的共享缓存.但我认为像Linux,Solaris 10,OS X和Vista这样的“现代”操作系统应该有知道这些信息的调度程序.我错了他们的能力吗?我错了,操作系统实际上可以解决这个问题吗?我对Solaris和Linux的答案特别感兴趣.

结果是我是否需要告知用户我的(多线程)软件如何考虑在他们的盒子上进行平衡.

解决方法:

首先,“锁定”不是描述它的正确术语. “亲和力”是更合适的术语.

在大多数情况下,您不需要关心它.但是,在某些情况下,手动设置CPU /进程/线程关联可能是有益的.

操作系统通常不了解现代多核架构的细节.例如,假设我们有2插槽四核处理器,处理器支持SMT(=超线程).在这种情况下,我们有2个处理器,8个内核和16个硬件线程.因此,OS将看到16个逻辑处理器.如果操作系统无法识别此类层次结构,则极有可能失去一些性能提升.原因是:

>缓存:在我们的示例中,两个不同的处理器(安装在两个不同的套接字上)不共享任何片上缓存.假设一个应用程序有4个繁忙运行的线程,并且许多数据由线程共享.如果操作系统调度处理器中的线程,那么我们可能会丢失一些缓存局部性,从而导致性能下降.但是,线程不共享很多数据(具有不同的工作集),然后通过增加有效的缓存容量来分离到不同的物理处理器会更好.此外,可能会发生更棘手的情况,操作系统很难意识到这一点.
>资源冲突:让我们考虑一下SMT(= HyperThreading)案例. SMT共享许多重要的CPU资源,如缓存,TLB和执行单元.假设只有两个忙线程.但是,操作系统可能会愚蠢地在同一物理核心的两个逻辑处理器上安排这两个线程.在这种情况下,两个逻辑线程争用重要资源.

一个很好的例子是Windows 7.Windows 7现在支持考虑SMT的智能调度策略(related article). Windows 7实际上阻止了上述2.情况.以下是Windows 7中任务管理器的快照,Core i7负载为20%(具有超线程的四核处理器= 8个逻辑处理器):

alt text http://pds17.egloos.com/pds/200908/30/29/d0033129_4a9a0383c285f.png

CPU使用历史很有意思,不是吗? :)您可能会看到只使用了一对CPU,这意味着Windows 7可以避免同时在同一个内核上同时调度两个线程.这项政策肯定会减少资源冲突等SMT的负面影响.

我想说操作系统不是很聪明,无法理解现代多核架构,其中有很多缓存,共享最后一级缓存,SMT,甚至是NUMA.因此,您可能需要手动设置CPU /进程/线程关联性.

但是,我不会说这是真的需要.只有当您完全了解工作负载模式和系统体系结构时,才能尝试使用它.并且,看看您的尝试是否有效的结果.

上一篇:用于Java中高级作业调度的框架是什么?


下一篇:java – 检查周期性ScheduledFuture是否正在运行