RHEL 6과 RHEL 5의 CPU 사용량 증가 원인 격리


9

현재 시스템을 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 시스템에서는 CPU 사용률이 0 %로 유지되지만 RHEL 6이 설치된 동일한 하드웨어에서는 CPU의 약 0.5 %를 사용하므로 30 ~ 50 개의 프로그램이 실행 중일 select때 절전 모드를 수행합니다. 불필요하게 많은 양의 CPU.

나는 Bugzilla를 열었고 OProfile을 실행하려고 시도했으며 커널을 볼 때 응용 프로그램의 경우 100 %, poll_idle의 99 % 이상을 보여줍니다 (모든 옵션을 캡처 할 수 있도록 유휴 = 폴을 설정했습니다).

더 높은 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에서는 사용자와 sys 모두에서 CPU 사용량이 적습니다. 이 소스를 추적하고 수정하는 방법에 대한 아이디어가 있습니까?

또한 현재 Arch Linux 빌드 및 Ubuntu 11.10 에서이 테스트를 시도했으며 비슷한 동작을 보았으므로 RHEL 문제가 아닌 일부 커널 문제 인 것으로 보입니다.

UPDATE2 : 나는 그것이 큰 논쟁이라는 것을 알기 때문에 이것을 주저하기를 조금 주저했지만 우분투 11.10의 BFS 패치로 커널을 시도했지만 동일한 CPU CPU 사용량을 보여주지 못했습니다 (사용자 CPU 사용량은 똑같다).

이 높은 CPU 사용량이 인위적으로 높게 보이는 CPU 사용량을 고려할 때 차이가 있는지 테스트하기 위해 각각의 테스트를 실행할 수 있습니까? 또는 CFS가 실제 CPU주기를 도난 당하고 있습니까?

업데이트 3 :이 질문과 관련된 분석은 스케줄러와 관련이 있음을 나타내는 것으로 보이므로 결과를 논의하기 위해 새로운 질문 을 만들었습니다 .

UPDATE4 : 다른 질문에 더 많은 정보를 추가했습니다 .

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


RedHat이 이것을 GLibC에 정확하게 지적한 것처럼 보입니다. select거기 에 관한 코드 변경을 찾으셨습니까 ?
Nils

glibc 분류는 내가 원래 bugzilla를 제출했을 때 이루어졌습니다.
Dave Johansen

커널 문제가 아니라 나에게 합리적으로 들린다. 여러 개의 동시 수면으로 비슷한 결과를 얻습니까? Ubuntu 11.10, Arch Linux 및 RHEL6의 glibc 버전은 무엇입니까?
Nils

예, 폴링과 수면 모드가 1ms 동안 동일한 결과입니다. glibc까지 RHEL 5는 2.5, RHEL 6은 2.12, 우분투 11.10은 2.13이며 아치는 2.15라고 생각하지만 확인해야합니다.
Dave Johansen

이 원래 질문에 대한 답을 직접 찾은 것 같습니다. 여기에 답변으로 게시하고 포인트를 얻으십시오!
Nils

답변:


1

물어:

이 높은 CPU 사용량이 인위적으로 높게 보이는 CPU 사용량을 고려할 때 차이가 있는지 테스트하기 위해 각각의 테스트를 실행할 수 있습니까? 또는 CFS가 실제 CPU주기를 도난 당하고 있습니까?

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

선택의 여지가 많습니다. 고전적인 조언은 항상 "당신이 가질 부하의 종류를 나타내는 것을 사용하십시오"입니다. 그러나 멋진 아이들은 항상 povray를 사용했습니다.


1
나는 그것이 내가 말하는 아이디어라고 생각합니다. 내가 사용할 수있는 일관된 타이밍 결과를 제공하는 벤치 마크 앱을 추천 하시겠습니까?
Dave Johansen

@DaveJohansen-povray에 노트 추가
ckhan

불행히도 RHEL과 함께 제공되지 않는 한 이러한 시스템에 소프트웨어를 설치하는 데 1 주일 이상이 걸릴 수 있습니다. 나는 내 자신의 작은 테스트 프로그램을 만들고 결과를 논의하기 위해 새로운 질문 을 만들었습니다 .
Dave Johansen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.