RHEL 6 및 RHEL 5에서 높은 CPU 사용량의 원인을 파악합니다.

RHEL 6 및 RHEL 5에서 높은 CPU 사용량의 원인을 파악합니다.

현재 시스템을 RHEL 5에서 RHEL 6으로 마이그레이션하는 것을 고려하고 있지만 RHEL 6 시스템에서 CPU 사용량이 예기치 않게 높아졌습니다. 이는 적어도 부분적으로는 중단 가능한 수면을 사용하기 때문일 수 있는 것으로 보입니다 select. 다음은 동작을 보여주는 간단한 예입니다.

#include <sys/select.h>

int main()
{
  timeval ts;
  for (unsigned int ii=0; ii<10000; ++ii) {
    ts.tv_sec = 0;
    ts.tv_usec = 1000;
    select(0, 0, 0, 0, &ts);
  }

  return 0;
}

RHEL 5 시스템에서는 0% CPU 사용량을 유지하지만 RHEL 6이 설치된 동일한 하드웨어에서는 약 0.5%의 CPU를 사용하므로 절전 모드로 30~50개의 프로그램을 실행하면 select불필요하게 많은 CPU를 차지합니다.

하나 열었어요부기라OProfile을 실행해 보았는데 커널을 보면 애플리케이션의 메인에서는 100%만 표시되고 poll_idle에서는 99%가 조금 넘는 것으로 표시됩니다(모든 것을 캡처할 수 있도록 grub 옵션에서 유휴=poll을 설정했습니다).

높은 CPU 사용량의 원인을 파악하기 위해 할 수 있는 다른 방법이 있습니까?

업데이트: perf 도구를 찾았고 다음과 같은 결과를 얻었습니다.

# Events: 23K cycles
#
# Overhead  Command        Shared Object                                Symbol
# ........  .......  ...................  ....................................
#
    13.11%  test_select_sma  [kernel.kallsyms]    [k] find_busiest_group
     5.88%  test_select_sma  [kernel.kallsyms]    [k] schedule
     5.00%  test_select_sma  [kernel.kallsyms]    [k] system_call
     3.77%  test_select_sma  [kernel.kallsyms]    [k] copy_to_user
     3.39%  test_select_sma  [kernel.kallsyms]    [k] update_curr
     3.22%  test_select_sma  ld-2.12.so           [.] _dl_sysinfo_int80
     2.83%  test_select_sma  [kernel.kallsyms]    [k] native_sched_clock
     2.72%  test_select_sma  [kernel.kallsyms]    [k] find_next_bit
     2.69%  test_select_sma  [kernel.kallsyms]    [k] cpumask_next_and
     2.58%  test_select_sma  [kernel.kallsyms]    [k] native_write_msr_safe
     2.47%  test_select_sma  [kernel.kallsyms]    [k] sched_clock_local
     2.39%  test_select_sma  [kernel.kallsyms]    [k] read_tsc
     2.26%  test_select_sma  [kernel.kallsyms]    [k] do_select
     2.13%  test_select_sma  [kernel.kallsyms]    [k] restore_nocheck

CPU 사용량이 더 높은 것은 스케줄러에서 비롯되는 것 같습니다. 또한 다음 bash 스크립트를 사용하여 100개를 동시에 시작했습니다.

#!/bin/bash

for i in {1..100}
do
  ./test_select_small &
done

RHEL 5에서는 CPU 사용량이 0%에 가깝게 유지되지만 RHEL 6에서는 사용자와 시스템 모두에서 CPU 사용량이 높습니다. 이 문제의 실제 원인을 추적하고 해결하는 방법에 대한 아이디어가 있습니까?

또한 현재 Arch Linux 버전과 Ubuntu 11.10에서 이 테스트를 시도했는데 비슷한 동작을 보았으므로 이것은 단순한 RHEL 문제가 아닌 일종의 커널 문제인 것 같습니다.

업데이트 2: 이 질문이 큰 논쟁거리라는 것을 알고 있기 때문에 질문하는 것을 조금 주저했지만 Ubuntu 11.10에서 BFS 패치를 사용하여 커널을 시도했지만 시스템 CPU 사용량이 동일하게 높지는 않았습니다(사용자 CPU 사용량은 거의 같습니다).

이러한 높은 CPU 사용량이 단지 CPU 사용량 계산의 차이로 인해 인위적으로 높게 보이는지 테스트하기 위해 각각에 대해 몇 가지 테스트를 실행할 수 있습니까? 아니면 CFS가 실제 CPU 주기를 훔치고 있습니까?

업데이트 3: 이 문제와 관련된 분석 결과 스케줄러와 관련된 것으로 나타났으므로새로운 질문토론 결과.

업데이트 4: 더 많은 정보를 추가했습니다.다른 문제.

업데이트 5: 몇 가지 결과를 추가했습니다.다른 문제여전히 문제를 보여주는 간단한 테스트에서.

답변1

물어:

이러한 높은 CPU 사용량이 단지 CPU 사용량 계산의 차이로 인해 인위적으로 높게 보이는지 테스트하기 위해 각각에 대해 몇 가지 테스트를 실행할 수 있습니까? 아니면 CFS가 실제 CPU 주기를 훔치고 있습니까?

프로그램을 실행하는 동안 CPU 벤치마크를 실행하고 호스트 OS 버전에 따라 성능이 변하는지 확인하면 test_select_small어떻게 될까요 ?

많은 옵션이 있습니다. 고전적인 조언은 항상 "당신이 갖게 될 부하 유형을 대표하는 것을 사용하십시오"입니다. 하지만 멋진 아이들은 항상 그냥 사용포프라이

관련 정보