본문 바로가기
scheduler

Scheduler Domains

by jsh91 2023. 11. 23.

각 CPU는 "default" scheduling domain (constructed_domain)을 가지고 있다. 도메인 계층은 -> parent pointer를 통해 이러한 기본 도메인으로부터 구축된다. -> parents는 NULL로 종료되어야 하며 도메인 구조는 잠금 없이 업데이트되므로 CPU 단위여야 한다.

 

각 스케줄링 도메인은 여러 CPU에 걸쳐 있습니다( ->span 필드의 stored). 도메인의 span은 하위 span 의 상위 집합이어야 하며(필요한 경우 이 제한이 완화될 수 있음), CPU i의 기본 도메인은 적어도 i에 걸쳐야 합니다. 각 CPU의 최상위 도메인은 일반적으로 시스템의 모든 CPU에 걸쳐 있지만 허용되는 마스크를 명시적으로 설정하지 않는 한 일부 CPU에는 실행할 작업이 할당되지 않을 수 있습니다. 스케줄링된 도메인의 span은 "이들 CPU 간의 균형을 맞추는 프로세스 로드"를 의미합니다

 

각 스케줄링 도메인에는 ->groups 포인터에서 원형 일방향 링크된 목록으로 구성된 하나 이상의 CPU 그룹(structched_group)이 있어야 합니다. 이러한 그룹의 cpumasks 조합은 도메인의 span과 동일해야 합니다. ->groups 포인터로 가리키는 그룹에는 도메인이 속한 CPU가 포함되어 있어야 합니다. CPU가 설정된 후에는 읽기 데이터만 포함되어 있으므로 그룹이 공유될 수 있습니다. 이러한 두 그룹의 cpumasks 교차점은 비어 있지 않을 수 있습니다. 이 경우 SD_OVERLAP 플래그가 해당 스케줄링 도메인에 설정되어 있고 해당 그룹은 CPU 간에 공유되지 않을 수 있습니다.

 

그룹 간에 스케줄링된 도메인 내에서 밸런싱이 발생합니다. 즉, 각 그룹은 하나의 엔티티로 취급됩니다. 그룹의 부하는 각 멤버 CPU의 부하의 합으로 정의되며, 그룹의 부하가 균형을 잃었을 때에만 그룹 간에 이동되는 작업입니다.

 

kernel/sched/core.c에서 trigger_load_balance()는 scheduler_tick()을 통해 각 CPU에서 주기적으로 실행됩니다. 현재 실행 대기열에 대한 다음 정기적으로 예약된 재조정 이벤트가 도착한 후 Softirq를 상승시킵니다. 실제 로드 밸런싱 워크호스인 run_rebalance_domains()->rebalance_domains()는 Softirq 컨텍스트(SCHED_SOFTIRQ)에서 실행됩니다.

 

후자의 함수는 현재 CPU의 실행 대기열과 scheduler_tick()이 발생한 시점에 CPU가 유휴 상태였는지 여부, 그리고 기본 도메인에서 시작하여 -> 상위 체인으로 올라가는 모든 스케줄링된 도메인에서 반복됩니다. 그런 다음 현재 도메인이 재조정 간격을 모두 사용했는지 확인합니다. 그런 경우 해당 도메인에서 load_balance()를 실행합니다. 그런 다음 상위 sched_domain(있는 경우)과 상위 도메인의 상위를 확인합니다.

 

후자의 함수는 현재 CPU의 실행 대기열과 scheduler_domain이 발생한 시점에 CPU가 idle 상태인지 여부, 그리고 기본 도메인에서 시작하여 -> 상위 체인으로 올라가는 것과 같이 CPU가 있는 모든 스케줄링된 도메인에서 반복됩니다. 그렇게 하는 동안 현재 도메인이 재조정 간격을 모두 사용했는지 확인합니다. 그런 경우 해당 도메인에서 load_balance ()를 실행합니다. 그런 다음 상위 sched_domain(존재하는 경우)과 상위 도메인의 상위를 확인합니다.

 

Implementing sched domains

기본 도메인은 계층 구조의 첫 번째 수준을 "span"할 것입니다. SMT의 경우 물리적 CPU의 모든 형제들에 걸쳐 있으며, 각 그룹은 하나의 가상 CPU입니다.

SMP에서 기본 도메인의 상위 도메인은 노드의 모든 물리적 CPU에 걸쳐 있습니다. 각 그룹은 하나의 물리적 CPU입니다. 그런 다음 NUMA를 사용하면 SMP 도메인의 상위 도메인이 전체 시스템에 걸쳐지고 각 그룹은 노드의 cpumask를 가집니다. 또는 다중 수준 NUMA 또는 Opteron을 수행할 수 있습니다. 예를 들어, 하나의 NUMA 수준을 포함하는 도메인이 하나뿐일 수 있습니다.

구현자는 include/linux/sched/sd_flags.h: SD_*의 코멘트를 읽어 sched_domain의 SD 플래그에 대해 구체적인 정보와 튜닝할 내용을 파악해야 합니다.

아키텍처는 sched_domain_topology_level 배열을 생성하고 이 배열을 매개 변수로 하여 set_sched_topology()를 호출하여 주어진 토폴로지 수준에 대한 일반 도메인 빌더와 기본 SD 플래그를 재정의할 수 있습니다.

Sched-domains 디버깅 인프라스트럭처는 CONFIG_SCHED_DEBUG를 활성화하고 cmdline에 'sched_verbose'를 추가하여 활성화할 수 있습니다. cmdline을 조정하는 것을 잊었다면 /sys/kernel/debug/sched/verbose 노브를 뒤집을 수도 있습니다. 이렇게 하면 발생 가능한 오류를 대부분 포착해야 하는 Scheddomain의 오류 검사 구문 분석이 가능합니다(위에서 설명함). 또한 도메인 구조를 시각적 형식으로 출력합니다

 

'scheduler' 카테고리의 다른 글

Energy Aware Scheduling  (1) 2023.11.26
Capacity Aware Scheduling  (2) 2023.11.26
CFS Scheduler  (1) 2023.11.22
CFS Bandwidth Control  (1) 2023.11.22
CPU Scheduler implementation hints for architecture specific code  (1) 2023.11.22

댓글