Linux kernel cpumask如何影响linux内核中其他进程的调度?

Linux kernel cpumask如何影响linux内核中其他进程的调度?,linux-kernel,scheduling,affinity,Linux Kernel,Scheduling,Affinity,我在安装了ubuntu的机器上使用Linux2.6.x内核(刚刚提到了ubuntu,以防发生任何变化)。内核在一台有8个内核的机器上运行。这台机器也运行openvz,但我认为这不会改变问题的背景 我安装了一个只允许使用两个CPU的软件,它在第一个和两个CPU(cpumask 3)上设置了一个硬CPU关联。我在问自己其他进程的调度是如何受此影响的。我想我读过一些关于它的文章,但我现在假设进程很可能连接到第一个CPU。内核试图将进程始终保持在同一个CPU上,以避免缓存失效 在这台机器上有相当多的进程

我在安装了ubuntu的机器上使用Linux2.6.x内核(刚刚提到了ubuntu,以防发生任何变化)。内核在一台有8个内核的机器上运行。这台机器也运行openvz,但我认为这不会改变问题的背景

我安装了一个只允许使用两个CPU的软件,它在第一个和两个CPU(cpumask 3)上设置了一个硬CPU关联。我在问自己其他进程的调度是如何受此影响的。我想我读过一些关于它的文章,但我现在假设进程很可能连接到第一个CPU。内核试图将进程始终保持在同一个CPU上,以避免缓存失效


在这台机器上有相当多的进程在运行。内核如何处理这种情况?是否可能是因为硬CPU关联进程在绑定到拥挤区域时受到影响而运行较慢?内核是如何关心硬关联的。

从长远来看,调度程序的负载平衡代码将把更多未绑定的任务移动到CPU的其余部分,从而将此任务绑定到前两个

它的工作方式是,每个任务在创建它的CPU上启动,在微级别,Linux任务调度器在每个CPU上执行调度决策,而不考虑其他CPU。但是还有一个更宏观的进程迁移负载平衡代码,它会显示:“这个cpu上的运行队列(等待调度的进程列表)比那个cpu长,让我们移动一些以平衡负载”


当然,由于您的特定任务绑定到前两个CPU,负载平衡将选择其他任务移动-因此,从长远来看,绑定的任务将“推出”足够多的其他非绑定任务到其他CPU,并将保持平衡。

我认为,硬件中断也可能锁定在某些第一个CPU上。此外,如果您有NUMA,内核将努力保持进程及其数据的接近。但是,如果有一些软件锁定在1和2个CPU上(并且两个CPU都在积极使用),那么更有可能在3-8核上计划其他软件,它们的负载会更小。谢谢您的回答。流程创建呢?它们总是在同一个地方创建,然后移动。或者任务列表的长度是在进程创建时计算的,并且进程是在空空间中创建的?据我所知,新任务(多线程程序中的新线程或新进程的第一个线程)总是在创建线程(调用克隆系统调用的线程)的CPU上创建的他当时正在跑步。它可能会在不久之后被移动(甚至是在创建它的过程中)。啊,这是有道理的。这详细回答了我的问题。这样就不会有问题,因为一旦进程移动到另一个CPU,它们就会在另一个CPU上创建子进程,并且不会影响坚持在第一个CPU上运行的任何东西(好吧,大致上)。