2011-11-20 108 views
1

我在我的机器上安装了Ubuntu的Linux 2.6.x内核(Ubuntu刚刚提到,以防万一这会改变什么)。内核在具有8个内核的机器上运行。该机器也运行openvz,但我不认为这确实会改变问题的上下文。cpumask如何影响linux内核中其他进程的调度?

我安装了一个软件,只允许使用两个CPU,并且它在第一个CPU(cpumask 3)上设置了一个硬件CPU关联。我在问自己,其他进程的调度是如何受这个影响的。我想我读了一些关于它的内容,但我现在认为这些进程可能会附加到第一个CPU上。内核总是试图保持同一CPU上的进程,以避免缓存失效。

在机器上有相当多的进程在运行。内核如何处理这种情况?难道是因为它们在绑定到拥挤区域时受到影响,所以CPU亲和力处理的运行速度较慢?内核如何关心硬亲和力。

+0

我想,硬件中断可能会锁定在一些第一个CPU上。而且,如果你有NUMA,那么内核就会努力保持进程和数据的关闭。但是,如果有一些软件锁定到1和2个CPU(并且两个CPU都被主动使用),那么更有可能在核心3-8上计划其他软件,它们的负载较小。 – osgx

回答

2

从长远来看,会发生什么情况是调度程序的负载均衡代码会将更多未绑定任务移动到其余CPU,以解决将此任务绑定到前两个任务的问题。

它的工作方式是每个任务都从创建它的CPU开始,而在微观层次上,Linux任务调度程序在每个CPU上调度决策时不考虑其他任务。但是接下来会有更多的宏观级进程迁移负载平衡代码,它们会提升并说:“在这个cpu上的运行队列(等待调度的进程列表)比那个cpu长,让我们移动一些来平衡负载”。

当然,由于您的特定任务必须与前两个cpus绑定,所以负载均衡会选择其他任务来移动 - 因此,您的绑定任务将在长期运行中将“推出”足够的其他非绑定任务其他的cpus和balance会被保留下来。

+0

感谢您的回答。关于流程创建呢?他们是否总是在同一个地方创造,然后移动。还是在创建进程时评估任务列表的长度,并在空闲空间创建进程? –

+0

就我所知,总是在创建线程(称为克隆系统调用的线程)的CPU上创建新任务(多线程程序中的新线程或新进程的第一个线程)在当时运行。它可能会在此后不久移动(甚至通过创建中途移动)。 – gby

+0

啊,这是有道理的。这详细解答了我的问题。这样就不会有问题,因为一旦进程移动到另一个CPU上,他们就会在另一个CPU上创建子进程,并且不会影响坚持在第一个进程上运行的任何内容(大致)。 –