RHEL6/RHEL7에서 "kernel.sched_min_capsularity_ns" 매개변수의 의미

RHEL6/RHEL7에서 "kernel.sched_min_capsularity_ns" 매개변수의 의미

RHEL6에서 RHEL7까지의 커널 동작을 연구하는 동안 우리는 다음과 같은 사실을 발견했습니다.RHEL6 커널 매개변수 설명:

> kernel.sched_min_grinderity_ns

sched_min_capsularity_ns는 스케줄러 기간의 초기 값입니다. 스케줄러 기간은 실행 가능한 모든 작업이 최소한 한 번 실행되도록 허용되는 기간입니다. CFS에는 시간 조각 개념이 없지만 기간을 초기 시간 블록으로 생각한 다음 이를 시간 조각으로 균등하게 나눌 수 있습니다. 각 시간 조각은 실행 가능한 프로세스에 해당합니다. 이 조정 가능 항목은 초기 값만 지정합니다. 실행 가능한 작업이 너무 많으면 스케줄러는 실행 시간이 너무 단축되지 않도록 기간을 늘립니다.

/usr/share/doc/kernel-doc-2.6.32/Documentation/scheduler/sched-design-CFS.txt

>kernel.sched_latency_ns

CPU 집약적 작업에 대한 대상 선점 지연을 구성합니다.

매개변수에 대한 설명은 kernel.sched_min_granularity_ns우리를 혼란스럽게 합니다. 이 매개변수에 대한 우리의 이해는 실행 가능한 각 작업이 CPU에서 실행될 수 있는 최소 시간(즉, 실행 가능한 각 작업에 대해 제공되는 시간 조각)이라는 것입니다. 의 경우 kernel.sched_latency_ns실행 가능한 모든 작업이 한 번 이상 실행되는 기간입니다.

우리는 다른 많은 기사에서 이해를 얻었습니다.이것그리고저것. 일부 링크는 다른 커널 버전을 참조할 수 있지만 매개변수에 대한 일반적인 설명은 바뀌어서는 안 됩니다.

답변1

동의하다. RHEL6 설명서는 참조하는 설명서와 일치하지 않습니다. 무시해.

https://elixir.bootlin.com/linux/v2.6.32/source/Documentation/scheduler/sched-design-CFS.txt#L95

따라서 CFS 스케줄러에는 이전 스케줄러와 같은 "시간 조각" 개념이 없으며 경험적 방법도 없습니다. 중앙 조정 가능 매개변수는 하나만 있습니다(CONFIG_SCHED_DEBUG를 활성화해야 함).

/proc/sys/kernel/sched_min_granularity_ns

스케줄러를 "데스크톱"(즉, 낮은 대기 시간) 워크로드에서 "서버"(즉, 양호한 배치) 워크로드로 조정하는 데 사용할 수 있습니다. 기본값은 데스크톱 워크로드에 적합한 설정입니다.

동일한 버전에서 이 값의 기본값은 1ms입니다. 이는 타임 슬라이스의 최소값입니다(이전 CONFIG_HZ=1000에 해당).

https://elixir.bootlin.com/linux/v2.6.32/source/kernel/sched_fair.c#L40

"모든 실행 가능한 작업이 적어도 한 번 실행되도록 허용해야 하는 기간"이라는 합리적인 기본값의 경우 1ms는 너무 작습니다.

/*
 * Targeted preemption latency for CPU-bound tasks:
 * (default: 5ms * (1 + ilog(ncpus)), units: nanoseconds)
 *
 * NOTE: this latency value is not the same as the concept of
 * 'timeslice length' - timeslices in CFS are of variable length
 * and have no persistent notion like in traditional, time-slice
 * based scheduling concepts.
 *
 * (to see the precise effective timeslice length of your workload,
 *  run vmstat and monitor the context-switches (cs) field)
 */
unsigned int sysctl_sched_latency = 5000000ULL;

/*
 * Minimal preemption granularity for CPU-bound tasks:
 * (default: 1 msec * (1 + ilog(ncpus)), units: nanoseconds)
 */
unsigned int sysctl_sched_min_granularity = 1000000ULL;

답변2

링크한 문서다음 정의가 포함되어 있습니다.

  • kernel.sched_latency_ns
    sched_latency_ns는 스케줄러 기간의 초기 값입니다. 스케줄러 기간은 실행 가능한 모든 작업이 최소한 한 번 실행되도록 허용되는 기간입니다. CFS에는 시간 조각 개념이 없지만 기간을 초기 시간 블록으로 생각한 다음 이를 시간 조각으로 균등하게 나눌 수 있습니다. 각 시간 조각은 실행 가능한 프로세스에 해당합니다. 이 조정 가능 항목은 초기 값만 지정합니다. 실행할 수 있는 작업이 너무 많으면 스케줄러는 대신 kernel.sched_min_grinderity_ns를 사용합니다.
    /usr/share/doc/kernel-doc-2.6.32/Documentation/scheduler/sched-design-CFS.txt

  • kernel.sched_min_grinderity_ns
    sched_min_capsularity_ns는 단일 작업이 실행되는 대상 최소 스케줄러 기간을 지정합니다. 이 조정 가능 항목은 작동 부하가 높은 경우에만 사용됩니다. sched_latency_ns와 달리 이 튜너블은 모든 작업이 동시에 실행되어야 하는 시간이 아니라 각 작업에 할당된 대상 런타임을 지정합니다.

따라서 웹페이지는 수정되었습니다. 즉, 질문을 게시한 지 약 4일 후에 "업데이트된 2018-08-30T21:11:42+00:00"이라고 표시됩니다.

관련 정보