CPU cgroup에서 cpu.cpu_quota_us를 설정하면 어떤 효과가 있나요?

CPU cgroup에서 cpu.cpu_quota_us를 설정하면 어떤 효과가 있나요?

cpu.cpu_quota_uscgroup 하위 시스템의 설정이 애플리케이션 성능에 영향을 미치는지 이해하려고 합니다 . cpu기본적으로 CPU 할당량은 줄이되 "유효한" CPU는 여전히 동일하도록 CPU 수를 늘려야 합니다. 이것이 애플리케이션에 영향을 미치나요? 예를 들어 4개 CPU 100% 할당량 구성은 8개 CPU 50% 할당량 구성과 동일합니까?

나는 이것이 애플리케이션 디자인과 CPU 또는 IO 바인딩 여부에 크게 좌우된다는 것을 알고 있습니다. 여기서는 CPU 집약적인 애플리케이션에만 관심을 두고 있습니다.

내 노력:

여기에서 찾을 수 있는 간단한 C 애플리케이션을 작성했습니다.https://github.com/ashu-mehra/cpu-quota-test.

프로그램은 "N"개의 스레드를 생성합니다. 각 스레드는 숫자 "n"부터 1000000까지 소수 계산을 시작합니다. 시작 번호 "n"은 스레드마다 다릅니다. 100개의 소수를 계산한 후 스레드는 고정된 시간 동안 절전 모드로 전환됩니다. 스레드가 1,000,000개에 도달하면 2부터 다시 시작합니다. 마지막으로 메인 스레드는 각 스레드가 계산한 소수의 누적 개수를 표시합니다. 나는 이것이 이 샘플 애플리케이션의 "처리량"이라고 생각합니다.

다음 구성으로 프로그램을 실행하고 있습니다.

  1. CPU가 4개이고 할당량 제한이 없는 cgroup에서.
  2. CPU가 8개이고 할당량이 50%인 cgroup에서.

/sys/devices/system/cpu/cpu/online`을 0으로 설정하여 하이퍼스레딩을 비활성화했습니다.

각 구성마다 스레드 수를 4개에서 32개로 변경했습니다. 다음은 예제 프로그램에서 생성된 "처리량" 결과입니다. 숫자는 10회 반복의 평균입니다.

스레드 CPU4quota100 CPU8quota50
4 66229.5 66079.4
8 128129 129768
16 189247 134882
24 188238 98917.8
32 176236 87252.5

스레드 16부터 시작하면 두 경우 사이의 처리량에 큰 차이가 있습니다. "cpu8quota50" 사례의 처리량은 24개 및 32개 스레드에서 크게 떨어집니다.

나는 perf stat또한 이러한 실행의 결과를 가지고 있습니다. 나는 cpu-migrations두 구성 perf사이에 큰 차이점을 발견했습니다. 이것은 비교이다

스레드 CPU4quota100 CPU8quota50
4 9.6 11.2
8 3252.2 37.9
16 2956.2 4490.5
24 472.6 2347
32 118.3 1727.2

스레드 4, 8, 16의 숫자는 의미가 있지만 "cpu4quota100" 사례에서 스레드 24와 32의 숫자는 이해할 수 없습니다. 스레드 16의 경우보다 훨씬 작기 때문입니다.

누군가 이 결과를 설명할 수 있나요? 또한 "CPU 마이그레이션"이 애플리케이션 성능에 영향을 미치나요?

글이 길어져서 죄송합니다!

편집 1:

위의 예제 프로그램을 실행하는 스크립트를 업데이트하여 time"cpu4quota100"과 "cpu8quota50" 사례 사이에 차이점이 있는지 확인하기 위해 명령을 사용하여 실행 시간을 정했습니다. 32개의 스레드만 실행했는데 결과는 다음과 같습니다.

시간 CPU4quota100 CPU8quota50
사용자 119.956초 120.076초
시스템 0.001초 0.009초
CPU 386.2% 386.5%

user따라서 두 경우의 시간 및 타이밍 차이는 그다지 크지 않지만 sys"처리량"은 cpu4quota100두 배나 높습니다 cpu8quota50.

편집 2:

CPU 주파수를 변경하는 커널 거버너는 cpu8quota50케이스 처리량 향상에 도움이 되는 것으로 보인다. 초기 데이터는 주파수 조정기 "절전"을 사용하여 얻었습니다. "절전" 조건에서는 코어의 CPU 주파수가 cpu4quota100최대치에 도달하지만 cpu8quota50실제로는 훨씬 낮습니다. 그러나 주파수 조정기를 "성능"으로 변경한 후 cpu8quota50해당 경우에는 CPU 주파수도 최대값에 가까워졌습니다. "성능"을 주파수 거버너로 실행하는 32개 스레드의 경우 다음 숫자를 얻습니다.

스레드 CPU4quota100 CPU8quota50
32 175804 163831

그 결과, 그 차이는 이제 거의 50%에서 6.8%로 줄었습니다.

그러나 위의 두 경우에서 "절전" 조정기의 동작에 차이가 있다는 점은 흥미롭습니다. cpu8quota50혹시 라도 예상대로 작동하는지 잘 모르겠습니다 .

관련 정보