3.9. 스케줄러 TuneD 플러그인의 기능
스케줄러
TuneD 플러그인을 사용하여 스케줄링 우선 순위, CPU 코어 격리 및 프로세스, 스레드 및 IRQ afinities를 제어하고 조정합니다.
CPU 격리
프로세스, 스레드 및 IRQ가 특정 CPU를 사용하지 못하도록 하려면 isolated_cores
옵션을 사용합니다. 프로세스 및 스레드 특성을 변경하고 IRQ에 대한 default_smp_affinity
매개변수를 설정합니다.
CPU 선호도 마스크는 sched_setaffinity()
시스템 호출의 성공 여부에 따라 ps_whitelist
옵션과 일치하는 모든 프로세스 및 스레드에 맞게 조정됩니다. ps_whitelist
정규식의 기본 설정은 모든 프로세스 및 스레드 이름과 일치하는 .*
입니다. 특정 프로세스 및 스레드를 제외하려면 ps_blacklist
옵션을 사용합니다. 이 옵션의 값은 정규식으로도 해석됩니다. 프로세스 및 스레드 이름은 해당 표현식과 일치합니다. 프로필 롤백을 사용하면 일치하는 모든 프로세스 및 스레드를 모든 CPU에서 실행하고 profile 애플리케이션 전에 IRQ 설정을 복원합니다.
ps_whitelist
및 ps_blacklist
옵션은 .로 구분된 여러 정규식이 지원됩니다.
\;
은 문자 그대로 사용됩니다.
예 3.9. CPU 2-4 분리
다음 구성은 CPU 2-4를 분리합니다. ps_blacklist
정규식과 일치하는 프로세스 및 스레드는 격리와 관계없이 모든 CPU를 사용할 수 있습니다.
[scheduler] isolated_cores=2-4 ps_blacklist=.*pmd.*;.*PMD.*;^DPDK;.*qemu-kvm.*
IRQ SMP 선호도
/proc/irq/default_smp_affinity
파일에는 모든 비활성 인터럽트 요청(IRQ) 소스에 대해 시스템의 기본 대상 CPU 코어를 나타내는 비트마스크가 포함되어 있습니다. IRQ가 활성화되거나 할당되면 /proc/irq/default_smp_affinity
파일의 값이 IRQ의 선호도 비트마스크를 결정합니다.
default_irq_smp_affinity
매개변수는 /proc/irq/default_smp_affinity
파일에 쓰는 TuneD 를 제어합니다. default_irq_smp_affinity
매개변수는 다음 값과 동작을 지원합니다.
calc
isolated_cores
매개변수에서/proc/irq/default_smp_affinity
파일의 내용을 계산합니다.isolated_cores
매개변수의 반전은 격리되지 않은 코어를 계산합니다.그러면 격리되지 않은 코어와
/proc/irq/default_smp_affinity
파일의 이전 콘텐츠가/proc/irq/default_smp_affinity
파일에 기록됩니다.default_irq_smp_affinity
매개변수가 생략된 경우 기본 동작입니다.ignore
-
tuned 는
/proc/irq/default_smp_affinity
파일을 수정하지 않습니다. - CPU 목록
1
과 같은 단일 숫자 형식,1,3
과 같은 쉼표로 구분된 목록 또는3-5
와 같은 범위를 가져옵니다.CPU 목록의 압축을 풀고
/proc/irq/default_smp_affinity
파일에 직접 씁니다.
예 3.10. 명시적 CPU 목록을 사용하여 기본 IRQ smp 유사성 설정
다음 예제에서는 명시적 CPU 목록을 사용하여 기본 IRQ SMP 선호도를 CPU 0 및 2로 설정합니다.
[scheduler] isolated_cores=1,3 default_irq_smp_affinity=0,2
스케줄링 정책
프로세스 또는 스레드 그룹의 우선 순위 및 선호도를 조정하려면 다음 구문을 사용합니다.
group.groupname=rule_prio:sched:prio:affinity:regex
여기서 rule_prio
는 규칙의 내부 TuneD 우선 순위를 정의합니다. 규칙은 우선 순위에 따라 정렬됩니다. 이는 상속이 이전에 정의된 규칙을 다시 정렬할 수 있도록 하는 데 필요합니다. 동일한 rule_prio
규칙을 정의한 순서대로 처리해야 합니다. 그러나 이것은 Python 인터프리터에 의존하는 것입니다. 그룹 이름에
대해 상속된 규칙을 비활성화하려면 다음을 사용합니다.
group.groupname=
Sched는
다음 중 하나여야 합니다.
f
- for first in, first out (FIFO)
b
- 일괄 처리의 경우
r
- 라운드 로빈의 경우
o
- 기타의 경우
*
- for do not change
유사성
은 16진수의 CPU 선호도입니다. 변경하지 않으려면 *
를 사용하십시오.
P rio
는 스케줄링 우선 순위입니다( chrt -m
참조).
regex
는 Python 정규식입니다. ps -eo cmd
명령의 출력과 일치합니다.
지정된 프로세스 이름은 둘 이상의 그룹과 일치할 수 있습니다. 이러한 경우 마지막 일치 regex
는 우선 순위 및 스케줄링 정책을 결정합니다.
예 3.11. 스케줄링 정책 및 우선순위 설정
다음 예제에서는 스케줄링 정책 및 우선순위를 커널 스레드 및 워치독으로 설정합니다.
[scheduler] group.kthreads=0:*:1:*:\[.*\]$ group.watchdog=0:f:99:*:\[watchdog.*\]
스케줄러
플러그인은 perf
이벤트 루프를 사용하여 새로 생성된 프로세스를 식별합니다. 기본적으로 perf.RECORD_COMM
및 perf.RECORD_EXIT
이벤트를 수신합니다.
perf_process_fork
매개변수를 true
로 설정하면 플러그인이 perf.RECORD_FORK
이벤트를 수신 대기하도록 지시합니다. 즉, fork()
시스템 호출에 의해 생성된 하위 프로세스가 처리됩니다.
perf
이벤트를 처리하면 상당한 CPU 오버헤드가 발생할 수 있습니다.
스케줄러 런타임
옵션을 사용하여 0
으로 설정하여 스케줄러 플러그인의 CPU 오버헤드를 완화할 수 있습니다. 이렇게 하면 동적 스케줄러 기능이 완전히 비활성화되고 perf 이벤트가 모니터링되지 않고 작동합니다. 이에 대한 단점은 프로세스 및 스레드 튜닝이 프로필 애플리케이션에서만 수행된다는 것입니다.
예 3.12. 동적 스케줄러 기능 비활성화
다음 예제에서는 CPU 1과 3을 격리하는 동안 동적 스케줄러 기능을 비활성화합니다.
[scheduler] runtime=0 isolated_cores=1,3
mmapped
버퍼는 perf
이벤트에 사용됩니다. 로드가 많은 경우 이 버퍼가 오버플로될 수 있으므로 플러그인이 누락된 이벤트를 시작하고 새로 생성된 일부 프로세스를 처리하지 못할 수 있습니다. 이러한 경우 perf_mmap_pages
매개변수를 사용하여 버퍼 크기를 늘립니다. perf_mmap_pages
매개변수의 값은 2의 power여야 합니다. perf_mmap_pages
매개변수가 수동으로 설정되지 않은 경우 기본값 128이 사용됩니다.
cgroup
을 사용한 제한
스케줄러
플러그인은 cgroups
v1을 사용하여 프로세스 및 스레드 제한을 지원합니다.
cgroup_mount_point
옵션은 cgroup 파일 시스템을 마운트할 경로를 지정하거나 TuneD 에서 마운트할 것으로 예상합니다. 설정되지 않은 경우 /sys/fs/cgroup/cpuset
이 예상됩니다.
cgroup_groups_init
옵션이 1
로 설정된 경우TuneD 는 cgroup*
옵션으로 정의된 모든 cgroup
을 생성하고 제거합니다. 이는 기본 동작입니다. cgroup_mount_point
옵션이 0
으로 설정된 경우 다른 방법으로 cgroup
을 사전 설정해야 합니다.
cgroup_mount_point_init
옵션이 1
로 설정된 경우TuneD 는 cgroup 마운트 지점을 생성하고 제거합니다. cgroup_groups_init = 1
임을 의미합니다. cgroup_mount_point_init
옵션이 0
으로 설정된 경우 cgroups
마운트 지점을 다른 방법으로 사전 설정해야 합니다. 이는 기본 동작입니다.
cgroup_for_isolated_cores
옵션은 isolated_cores
옵션 기능의 cgroup
이름입니다. 예를 들어 시스템에 CPU가 4개인 경우 isolated_cores=1
은 Tuned 가 모든 프로세스와 스레드를 CPU 0, 2 및 3으로 이동함을 의미합니다. 스케줄러
플러그인은 계산된 CPU 선호도를 지정된 cgroup의 cpuset.cpus
제어 파일에 작성하고 일치하는 모든 프로세스 및 스레드를 이 그룹으로 이동하여 지정된 코어를 분리합니다. 이 옵션이 설정되지 않은 경우 sched_setaffinity()
를 사용하여 클래식 cpuset 선호도가 CPU 선호도를 설정합니다.
cgroup.cgroup_name
옵션은 임의의 cgroup
에 대한 연결을 정의합니다. hierarchic cgroups도 사용할 수 있지만 계층 구조를 올바른 순서로 지정해야 합니다. tuned 는 cgroup_mount_point
옵션에 의해 지정된 위치에 cgroup
을 강제 적용하는 것을 제외하고 여기에 정당성 검사를 수행하지 않습니다.
group
으로 시작하는 스케줄러 옵션의 구문은 16진수 선호도
대신 cgroup.cgroup_name
을 사용하도록 보강되었습니다. 일치하는 프로세스가 cgroup
cgroup_name
으로 이동합니다. 위에 설명된 대로 cgroup.
옵션에 정의되지 않은 cgroup을 사용할 수도 있습니다. 예를 들어 cgroup
은 TuneD 에서 관리하지 않습니다.
모든 cgroup
이름은 모든 마침표(.
)를 슬래시(/
)로 교체하여 종료됩니다. 이렇게 하면 플러그인이 cgroup_mount_point
옵션으로 지정된 위치 외부에 기록되지 않습니다.
예 3.13. 스케줄러
플러그인과 함께 cgroups
v1 사용
다음 예제에서는 cgroup
2개,group1
및 group2
를 생성합니다. cgroup group1
선호도를 CPU 2로 설정하고 cgroup
group2
를 CPU 0 및 2로 설정합니다. 4 CPU 설정이 지정된 경우 isolated_cores=1
옵션은 모든 프로세스와 스레드를 CPU 코어 0, 2 및 3으로 이동합니다. ps_blacklist
정규식으로 지정된 프로세스 및 스레드는 이동되지 않습니다.
[scheduler] cgroup_mount_point=/sys/fs/cgroup/cpuset cgroup_mount_point_init=1 cgroup_groups_init=1 cgroup_for_isolated_cores=group cgroup.group1=2 cgroup.group2=0,2 group.ksoftirqd=0:f:2:cgroup.group1:ksoftirqd.* ps_blacklist=ksoftirqd.*;rcuc.*;rcub.*;ktimersoftd.* isolated_cores=1
cgroup_ps_blacklist
옵션은 지정된 cgroup
에 속하는 프로세스를 제외합니다. 이 옵션으로 지정된 정규식은 /proc/PID/cgroups
의 cgroup
계층 구조와 일치합니다. 쉼표(,
)는 정규식과 일치하기 전에 cgroup
v1 계층을 /proc/PID/cgroups
에서 분리합니다. 다음은 정규식이 일치하는 콘텐츠의 예입니다.
10:hugetlb:/,9:perf_event:/,8:blkio:/
여러 정규 표현식은 together(;)으로 구분할 수 있습니다.
together는 논리 '또는' 연산자를 나타냅니다.
예 3.14. cgroup을 사용하여 스케줄러에서 프로세스 제외
다음 예에서 스케줄러
플러그인은 cgroup /daemons
에 속하는 프로세스를 제외하고 모든 프로세스를 코어 1에서 이동합니다. \b
문자열은 단어 경계와 일치하는 정규식 메타 문자입니다.
[scheduler] isolated_cores=1 cgroup_ps_blacklist=:/daemons\b
다음 예에서 스케줄러
플러그인은 hierarchy-ID가 8이고 controller-list blkio
인 cgroup에 속하는 모든 프로세스를 제외합니다.
[scheduler] isolated_cores=1 cgroup_ps_blacklist=\b8:blkio:
최근 커널은 sysctl
유틸리티에서 관리하는 /proc/sys/kernel
디렉터리에서 일반적으로 /sys/kernel/
디렉터리에 마운트된 일부 debug
sched_
및 numa_balancing_
커널 런타임 매개변수를 /proc/sys/kernel 디렉터리에 이동했습니다. tuned는 스케줄러
플러그인을 통해 다음 매개변수에 대한 추상화 메커니즘을 제공합니다. 여기서 사용된 커널을 기반으로 TuneD 는 지정된 값을 올바른 위치에 씁니다.
-
sched_min_granularity_ns
-
sched_latency_ns
, -
sched_wakeup_granularity_ns
-
sched_tunable_scaling
, -
sched_migration_cost_ns
-
sched_nr_migrate
-
numa_balancing_scan_delay_ms
-
numa_balancing_scan_period_min_ms
-
numa_balancing_scan_period_max_ms
numa_balancing_scan_size_mb
예 3.15. 마이그레이션 결정에 대한 작업의 "캐시 핫" 값을 설정합니다.
이전 커널에서 다음 매개변수를 설정하면
sysctl
이/proc/sys/kernel/sched_migration_cost_ns
파일에500000
값을 작성했습니다.[sysctl] kernel.sched_migration_cost_ns=500000
이는
스케줄러
플러그인을 통해 다음 매개변수를 설정하는 것과 동일한 최신 커널에서 다음과 같습니다.[scheduler] sched_migration_cost_ns=500000
즉 TuneD 는
/sys/kernel/debug/sched/migration_cost_ns
파일에500000
값을 씁니다.