Linux CPU 스케줄러에서 사용하는 시간 조각 길이를 변경하는 방법은 무엇입니까?

Linux CPU 스케줄러에서 사용하는 시간 조각 길이를 변경하는 방법은 무엇입니까?

Linux CPU 스케줄러가 프로세스 실행을 허용하는 시간 길이를 늘릴 수 있습니까? 어떻게 해야 하나요?

배경 지식

이 질문은 커널이 동일한 CPU에서 실행되는 서로 다른 프로세스 간에 강제로 전환하는 빈도를 줄이는 방법을 묻습니다. 이는 "선점형 멀티태스킹"으로 설명되는 커널 기능입니다. 이 기능은 단일 프로세스가 CPU를 과도하게 사용하여 시스템이 완전히 응답하지 않게 만드는 것을 방지하므로 일반적으로 좋습니다. 그러나 프로세스 간 전환비용이 있다이므로 절충이 필요합니다.

한 프로세스가 얻을 수 있는 모든 CPU 시간을 사용하는 경우 다른 프로세스가 사용자와 상호 작용하는 동안 더 자주 전환하면 지연 응답이 줄어들 수 있습니다.

얻을 수 있는 모든 CPU 시간을 사용하는 두 개의 프로세스가 있는 경우 전환 빈도를 낮추면 동일한 시간에 더 많은 작업을 수행할 수 있습니다.

동기 부여

이 질문에 대한 나의 초기 반응을 토대로 이 글을 게시합니다. Linux 컨텍스트 전환 빈도를 변경하는 방법은 무엇입니까?

개인적으로 저는 시간 분할을 변경하고 싶지 않습니다. 그러나 나는 이것이 CONFIG_HZ빌드 타임 옵션이 있는 것이라는 것을 막연하게 기억합니다. 그래서 지금은 어떤 상황인지 궁금하네요. CPU 스케줄러 시간 분할은 여전히 ​​기반입니까 CONFIG_HZ?

게다가 실제로 빌드 시간 조정은 매우 제한적입니다. Linux 배포판에서는 CPU 아키텍처당 하나의 코어를 갖고 런타임이나 적어도 부팅 시 구성할 수 있도록 하는 것이 더 실용적입니다. 시간 조각 조정이 여전히 관련이 있는 경우 빌드 시 시간 조각을 잠그지 않는 새로운 방법이 있습니까?

답변1

대부분의 RHEL7 서버의 경우 RedHat에서는 sched_min_granularity_ns10ms와 sched_wakeup_granularity_ns15ms로 늘릴 것을 권장합니다. (원천. 기술적으로 링크에는 10μs라고 나와 있으며 이는 1000배 더 작습니다. 이것은 실수입니다.)

우리는 이 제안을 더 자세히 이해하려고 노력할 수 있습니다.

sched_min_grainarity_ns 증가

현재 Linux 커널에서는 CPU 시간 조각이 CFS(Completely Fair Scheduler)에 의해 작업에 할당됩니다. sysctlCFS를 조정하는 데 사용할 수 있는 몇 가지 설정이 있습니다 .

  • kernel.sched_min_granularity_ns
  • kernel.sched_latency_ns
  • kernel.sched_wakeup_granularity_ns

다음 재부팅 때까지 sysctl을 일시적으로 설정하거나 부팅할 때마다 적용되는 구성 파일에 영구적으로 설정할 수 있습니다. 이러한 설정을 적용하는 방법을 알아보려면 "sysctl"을 찾거나 짧은 소개를 읽어보세요.여기.

sched_min_granularity_ns가장 눈에 띄는 설정입니다. 원본에서는계획설계-CFS.txt이는 "스케줄러를 '데스크톱'(낮은 대기 시간)에서 '서버'(양호한 배치) 워크로드로 조정"하는 유일한 "조정 가능" 설정으로 설명됩니다.

즉, 이 설정을 변경하여 컨텍스트 전환의 오버헤드를 줄이고 응답성("대기 시간")을 희생하여 처리량을 늘릴 수 있습니다.

내 생각에 이 CFS 설정은 이전 빌드 타임 설정을 모방한 것 같습니다.구성_HZ. CFS 코드의 첫 번째 버전에서 기본값은 1밀리초였으며 이는 "데스크톱"에서 사용되는 1000Hz에 해당합니다. CONFIG_HZ 기타 지원되는 값은 250Hz(기본값) 및 "서버" 측에서는 100Hz입니다. 100Hz는 매우 느린 CPU에서 Linux를 실행할 때도 유용합니다. 이것이 주어진 이유 중 하나입니다.CONFIG_HZ가 X86의 빌드 설정으로 처음 추가되었을 때.

이 값을 10ms(즉, 100Hz)로 변경하고 측정해 보면 합리적인 것 같습니다. sysctl은 다음으로 측정된다는 점을 기억하세요.나노초. 1밀리초 = 1,000,000나노초.

우리는 이러한 "서버"의 구식 조정이 일부 고부하 벤치마크의 처리량에 대해 2011년에도 여전히 매우 관련이 있다는 것을 알 수 있습니다.https://events.static.linuxfound.org/slides/2011/linuxcon/lcna2011_rajan.pdf

어쩌면 다른 설정이 있을 수도 있습니다.

위 세 가지 설정의 기본값은 비교적 가까운 것으로 보입니다. 이로 인해 나는 일을 단순하게 유지하고 모든 것에 동일한 요소를 곱하고 싶습니다 :-). 하지만 이에 대해 조사해 본 결과 처리량을 조정하고 있으므로 좀 더 구체적인 조정도 관련성이 있을 수 있는 것 같습니다.

sched_wakeup_granularity_ns"웨이크 선점"이 포함됩니다. 즉, 이벤트에 의해 활성화된 작업이 현재 실행 중인 프로세스를 즉시 선점할 수 있는 시점을 제어합니다. 2011 슬라이드에서는 이 설정의 성능 차이도 보여줍니다.

이 항목의 "WAKEUP_PREEMPT 비활성화"도 참조하세요.2010년 IBM 표창, 이는 "일부 작업 부하의 경우" 기본적으로 활성화된 이 기능이 "CPU 사용률의 몇 퍼센트 포인트를 소비할 수 있음"을 암시합니다.

SUSE Linux에는 이 값을 절반보다 크게 설정하면 sched_latency_ns웨이크 선점을 효과적으로 비활성화하고 "짧은 듀티 사이클 작업은 CPU 호그와 효과적으로 경쟁할 수 없게 됩니다"라고 제안하는 문서가 있습니다.

SUSE 설명서에서는 다른 설정에 대한 좀 더 자세한 설명도 제안합니다. 그러나 자신의 시스템에서 현재 기본값이 무엇인지 확실히 확인해야 합니다. 예를 들어 내 시스템의 기본값은 SUSE 설명서에 나와 있는 것과 약간 다른 것 같습니다.

https://www.suse.com/documentation/opensuse121/book_tuning/data/sec_tuning_taskscheduler_cfs.html

이러한 스케줄링 변수 중 하나를 사용하려고 하면 세 가지 변수 모두 CPU 수의 1+log_2만큼 확장(곱하기)된다는 점도 알아야 한다고 생각합니다. 이 크기 조정은 를 사용하여 비활성화할 수 있습니다 kernel.sched_tunable_scaling. 뭔가 빠졌을 수도 있지만 이는 놀라운 것 같습니다. 예를 들어 대화형 애플리케이션을 제공하고 전체/거의 전체 로드에서 실행되는 서버의 응답성과 해당 응답성이 각 서버에 따라 어떻게 확장되는지 생각하는 경우 숫자에 따라 다릅니다. CPU의.

워크로드에 스레드/프로세스 수가 많은 경우 권장 사항

또한 다른 설정의 경우 워크로드에 스레드 수가 많으면 상당한 처리량을 얻을 수 있다는 2013년 제안을 접했습니다. (또는 더 정확하게는 CFS 이전 코어에서 달성한 처리량을 다시 얻습니다.)

소홀히 하다CONFIG_HZ

CONFIG_HZ무엇을 설정했는지 걱정할 필요는 없다고 생각합니다 . 내 이해는 합리적인 타이머 하드웨어가 있다고 가정하면 현재 코어와 독립적이라는 것입니다. 당신은 또한 볼 수 있습니다커밋 8f4d37ec073c, "sched: 고해상도 선점 확인됨", 변경 사항에 대한 스레드의 이 댓글을 통해 찾을 수 있습니다.https://lwn.net/Articles/549754/.

(커밋을 보면 에 따라 걱정하지 않을 것입니다 SCHED_HRTICK. X86최근 일부 커밋에서는 요구 사항이 제거된 것 같습니다.)

답변2

schedtool다른 스케줄러에서 프로세스를 실행 하려면 배치 스케줄러가 필요한 것 같습니다 . 예를 들어schedtool -B «Command to be run in batch mode»

답변3

(설명이어야 하는데 좀 깁니다.)

덜 빈번한 컨텍스트 전환이 더 높은 처리량을 허용해야 합니다.

커널이 작업을 선점하고 다시 실행 대기열에 넣을 때만 가능합니다.

일반적으로 이는 발생하는 경우 드물고 수명이 짧아야 합니다. 종종 작업은 어떤 일이 일어나기를 기다리기 위해 명시적으로 양보합니다. 로드가 CPU 수보다 지속적으로 높은 경우에만 이점을 얻을 수 있습니다. 그러나 대응 능력을 상실할 위험도 있습니다.

관련 정보