현재 시스템을 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 : 나는 여전히 문제를 보여주는 간단한 테스트 의 다른 질문 에 몇 가지 결과를 추가했습니다 .
select
거기 에 관한 코드 변경을 찾으셨습니까 ?