컨텐츠 바로가기

[CFS] scheduling domain

http://nzcv.egloos.com/5926026

multi-core 구조 하에서 scheduler 의 가장 큰 역할은 결국 load balancing 이다.
하지만 무턱대고 이 core 에서 저 core 로 task migration 을 수행하게 되면 cache incoherency 문제로
성능저하를 야기할 수 있다.
예를 들어, SMT 구조에서 한 cpu 내의 logical cpu 들은 동일한 cache 를 사용하므로
이들 사이에 높은 빈도로 task migration 이 이루어지더라도 overhead 가 없는데
각 core 가 local cache 를 가지고 있는 SMP 구조에서의 task migration 은 필연적으로 overhead 를 야기한다.
NUMA 구조 하에서 node 간의 task migration 은 당연히 더 큰 overhead 를 야기한다.

이와 같이 architecture 의 특성에 따라 load balancing 을 수행해야 하므로 이를 지원하기 위해
scheduling domain 개념이 추가 되었다. scheduling domain 을 이루는 자료구조는 sched_domain, sched_group 이다.

sched_domain 인은 property 와 policy 를 공유하는 CPU 집합으로 볼 수 있다. 이 하위 구조로 sched group 이 있는데 sched_group 에는 CPU 별로 할당되면서 동시에 여러 CPU를 묶어서 구성하기도 한다. sched_domain 은
한 개 이상의 sched_group 를 포함하고 있으며 서로 circular list 형태로 연결되어 있다.

간단히 다음과 같이 예를 들어 살펴보자 [2]

(a) 와 같은 2 core SMP 구조의 경우 sched_domain 하나에 두 개의 sched_group 을 가지게 되며,
각 sched_group 은 하나의 core 를 표현하게 된다.
(b) 의 경우 2 core SMP + HyperThreadind 구조인데 top-level sched_domain 아래 두 개의 sched_group 을 가지게 되며
각 sched_group 은 (a) 에서와 마찬가지로 하나의 physical core 에 대응된다.
다시 이 sched_domain 은 두 개의 child sched_doamin 을 가지게 되는데 각각의 sched_domain 은
두 개의 sched_group 을 가지고 각 sched_group 은 hyperthreading 으로 만들어지는 logical core 에 대응된다.

정확히 현재 사용하는 디바이스의 경우 어떤 hierarchy 를 갖는지 그려보고 싶은데 그것은....(TBD)


sched domain 에는 아래와 같은 flag 들이 설정될 수 있다.  (include/linux/sched.h)

#define SD_LOAD_BALANCE  0x0001                 /* Do load balancing on this domain. */
#define SD_BALANCE_NEWIDLE 0x0002             /* Balance when about to become idle */
#define SD_BALANCE_EXEC  0x0004                 /* Balance on exec */
#define SD_BALANCE_FORK  0x0008                 /* Balance on fork, clone */
#define SD_BALANCE_WAKE  0x0010                /* Balance on wakeup */
#define SD_WAKE_AFFINE  0x0020                    /* Wake task to waking CPU */
#define SD_SHARE_CPUPOWER 0x0080             /* Domain members share cpu power */
#define SD_SHARE_PKG_RESOURCES 0x0200    /* Domain members share cpu pkg resources */
#define SD_SERIALIZE  0x0400                         /* Only a single load balancing instance */
#define SD_ASYM_PACKING  0x0800                /* Place busy groups earlier in the domain */
#define SD_PREFER_SIBLING 0x1000                /* Prefer to place tasks in a sibling domain */
#define SD_OVERLAP  0x2000                          /* sched_domains of this level overlap */


SD_BALANCE_EXEC, SD_BALANCE_FORK  
exec 시에 SD_BALANCE_EXEC flag 가 set 되어 있는 highest domain 를 찾고 
이 domain 의 cpu 중 load 가 가장 적은 곳으로 process 이동

SD_BALANCE_NEWIDLE 
cpu가 idle 이 되었을 때 이 cpu 가 속한 domain 에 이 flag 가 set 되어 있으면, 
같은 도메인에 있는 busy cpu 로 부터 넘겨받을 process 를 탐색. 
NUMA system 의 경우 top level 은 아니고 NUMA node 에 이 flag 가 set 되곤 함. 


(TBD)

* References

덧글|신고