在NUMA
系统上,由于不同CPU
直接访问本地内存和远端内存的时间相差很大,所以更好地调度算法就显得很重要。Linux kernel
引入了scheduling domain
的概念。可以参看下面例子:
[root@localhost ~]# cd /proc/sys/kernel/sched_domain/
[root@localhost sched_domain]# ls
cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7
[root@localhost sched_domain]# ls -alt *
cpu0:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..
cpu1:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..
cpu2:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..
cpu3:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..
cpu4:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..
cpu5:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..
cpu6:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..
cpu7:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..
在/proc/sys/kernel/sched_domain/
目录下每个CPU
都有一个自己的目录,并且每个CPU
目录下都有和自己相关的domain
信息。
在multi-level
系统中,也拥有multi-level
的scheduling domain
(内核中结构体是struct sched_domain
)。每个scheduling domain
包含一组共享属性和调度策略的CPU
;每个scheduling domain
包含至少一个或多个CPU group
(内核中结构体是struct sched_group
),每个CPU group
会被scheduling domain
看做一个独立的单元。
scheduling domain
的核心代码位于kernel\sched\core.c
中,关于/proc/sys/kernel/sched_domain/cpu$/domain$
中各个文件的含义,都可以在这里找到。
在NUMA
系统上,如果一个node
利用率非常高,比如高于90%
,而另一个node
利用率可能只有60%
~70%
,这时可以尝试disable wakeup affinity
。
参考资料:
Scheduling domains;
sched-domains.txt;
Does domain0 in /proc/sys/kernel/sched_domain/cpu$ refer top-level domain in the system?;
How to understan /proc/sys/kernel/sched_domain/cpu$/domain$/flags?。