%20%EC%99%84%ED%99%94%EA%B0%80%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
linux-5.1/documentation/cpu-load.txt
[...]
대부분의 경우 이
/proc/stat
정보는 현실을 매우 밀접하게 반영하지만 커널이 이 데이터를 수집하는 방법/시기의 특성으로 인해 때로는 전혀 신뢰할 수 없는 경우도 있습니다.[...]
시스템에 다음과 같은 방식으로 주기를 주기적으로 소진하는 작업이 있다고 가정해 보겠습니다.
time line between two timer interrupts |--------------------------------------| ^ ^ |_ something begins working | |_ something goes to sleep (only to be awaken quite soon)
위의 경우 시스템의 부하는
/proc/stat
(시스템이 유휴 핸들러를 실행할 때 타이머 인터럽트가 항상 발생하기 때문에) 0%가 되지만 실제로는 부하는 99%에 가깝습니다.
이 파일은 2007년에 추가되었습니다.
예를 들어, 프로세스가 실행 가능 상태에서 대기 상태로 전환될 때마다 시간을 측정하도록 수정된 CPU 스케줄러(예: Schedule() 함수)가 있습니까? 충분히 저렴하고 신뢰할 수 있는 시간 소스(믿을 수 있는 TSC)?
문서에는 smallhog.c
LKML.org의 링크된 스레드에 따르면 CPU를 많이 사용할 수 있고 커널은 CPU 사용량의 몇 퍼센트 이하만 보고하는 샘플 프로그램이 포함되어 있습니다.
현재 시스템에서 컴파일하고 실행해 보았습니다. 커널은 프로그램의 CPU 사용량이 약 80%라고 보고합니다. 그래서 상황이 좀 바뀐 것 같아요. smallhog.c
이 시스템이 왜 덜 효율적인지 정확히 알고 있습니까 ?
저는 "Intel(R) Core(TM) i5-5300U CPU"에서 64비트 모드로 실행되는 Fedora 30, Linux 커널 v5.2.0-rc5(대략)를 사용하고 있습니다.
lscpu
표시constant_tsc
및nonstop_tsc
.journalctl -k | grep -iE "TSC|clocksource"
커널이 TSC의 문제를 감지하지 못하는 것 같습니다.cat /sys/devices/system/clocksource/clocksource0
"tsc"를 표시합니다.
링크된 스레드를 보니
이는 모든 아키텍처에 해당되는 것은 아니며 일부 아키텍처는 사용자/커널/인터럽트 전환 타이밍을 기록하여 보다 정확한 통계를 수행합니다.물론. 그러나 이것은 확실히 컴퓨터 아키텍처에 대한 일반적이고 더 지루한 접근 방식입니다.
(아마도헤틱개발이 이 문제에 영향을 미칠 가능성이 있습니까? 단지 악용을 더 어렵게 만드는 것일지라도. 아니면 더 쉬운가요? 아니면 악용하려면 약간 다른 코드가 필요합니까? ).
답변1
smallhog
프로세스의 CPU 시간이 80%로 표시된다고 하셨습니다 . CPU의 나머지 20% 시간은 인터럽트에 소비됩니다! Smallhog.c가 내 시스템에서 CPU 사용량을 100% 미만으로 표시하는 이유는 무엇입니까?
smallhog
인터럽트 집약적인 작업을 수행합니다. 그 구체적인 전술은 명백히 패배했다 IRQ_TIME_ACCOUNTING
. 아래를 참조하세요.
나는 타이머가 똑딱거리는 것을 피할 수 있는 방법이 아직 있다고 생각합니다 :-). 진드기가 언제 발생하는지 예측하려면 영리한 방법이 필요할 수 있습니다. 예를 들어 /proc/interrupts
.
config IRQ_TIME_ACCOUNTING
bool "Fine granularity task level IRQ time accounting"
depends on HAVE_IRQ_TIME_ACCOUNTING && !VIRT_CPU_ACCOUNTING_NATIVE
help
Select this option to enable fine granularity task irq time
accounting. This is done by reading a timestamp on each
transitions between softirq and hardirq state, so there can be a
small performance impact.
If in doubt, say N here.
이 기능은 Fedora 커널 구성에서 활성화됩니다(참고자료 참조 /boot/config-*
). x86 CPU에서는 TSC를 사용합니다. 이 기능은 시작 옵션 tsc=noirqtime
.[*]을 사용하여 비활성화할 수 있습니다.
보다 정확한 회계 방법
질문에서 언급했듯이 PowerPC/S390에는 각 컨텍스트 전환에 대한 CPU 시간을 계산하는 특정 코드가 있습니다. 이것은 ... 불리운다 VIRT_CPU_ACCOUNTING_NATIVE
. 하지만 x86 커널에는 이것이 없습니다.
VIRT_CPU_ACCOUNTING_GEN
.(GEN은 "general"의 약자) 이라는 일반적인 동등 항목이 있습니다 . 이 기능은 Fedora 커널에 내장되어 있습니다. 그러나 이 기능은 기본적으로 활성화되어 있지 않습니다.
주의 깊게 읽어야합니다 :-). VIRT_CPU_ACCOUNTING_GEN
오직"완전한 dynticks 시스템"을 활성화하십시오. Fedora 커널 구성에는 다음이 포함됩니다.NO_HZ_FULL
, Fedora는 기본적으로 "전체 dynticks"를 활성화하지 않습니다. "전체 dynticks"를 활성화하려면 시작 시 nohz_full=
"adaptive-ticks CPU" 목록과 함께 옵션을 지정해야 합니다 . ("마지막 하나아니요-adaptive-tick CPU는 온라인 상태를 유지해야 합니다...")
메뉴 "CPU/작업 시간 및 통계" VIRT_CPU_ACCOUNTING 구성 부울 값 선택하다 "CPU 시간 통계" 프롬프트 !PPC64인 경우 기본값 TICK_CPU_ACCOUNTING PPC64인 경우 기본값 VIRT_CPU_ACCOUNTING_NATIVE # 순전히 클럭 주기 기반 CPU 시간 계산을 위한 스텁 구성 TICK_CPU_ACCOUNTING 구성 bool "간단한 틱 기반 CPU 시간 계산" 에 따라! S390 && !NO_HZ_FULL 돕다 기본 클럭 주기를 기준으로 한 CPUTime 통계입니다. 각 jiffies에서 소비된 사용자, 시스템 및 유휴 시간에 대한 통계 세분성. 잘 모르겠으면 Y를 선택해주세요. VIRT_CPU_ACCOUNTING_NATIVE 구성 bool "결정적 작업 및 CPU 시간 통계" HAVE_VIRT_CPU_ACCOUNTING && !NO_HZ_FULL에 따라 다름 VIRT_CPU_ACCOUNTING을 선택하세요. 돕다 보다 정확한 작업 및 CPU 시간을 활성화하려면 이 옵션을 선택하십시오. 회계. 이는 각 프로세서의 CPU 카운터를 읽어 수행됩니다. 커널 시작 및 종료 및 커널 내 전환 시스템, 소프트 인터럽트 및 하드 인터럽트 상태 사이에는 성능에 미치는 영향은 작습니다. s390 또는 IBM POWER > 5인 경우, 이는 또한 논리 파티션에서 도난당한 시간에 대한 통계를 허용합니다. 체계. VIRT_CPU_ACCOUNTING_GEN 구성 bool "전체 동적 CPU 시간 통계" HAVE_CONTEXT_TRACKING에 따라 다름 HAVE_VIRT_CPU_ACCOUNTING_GEN에 따라 다름 GENERIC_CLOCKEVENTS에 따라 다름 VIRT_CPU_ACCOUNTING을 선택하세요. 상황별 추적 선택 돕다 작업 및 CPU 시간 통계를 완전히 활성화하려면 이 옵션을 선택하십시오. 딘틱스 시스템. 이 회계처리는 각 항목을 관찰하여 수행됩니다. 컨텍스트를 사용하여 하위 시스템의 커널-사용자 경계를 추적합니다. 따라서 회계는 몇 가지 중요한 비용을 희생하여 수행됩니다. 높은.현재 이는 완전한 작업을 수행하는 경우에만 유용합니다.dynticks 하위 시스템 개발.잘 모르겠으면 N을 선택해주세요. 최종 선택
마지막 문단은 오래되었기 때문에 선을 그었습니다. 이제 "완전한 dynticks 하위 시스템"이 개발되었습니다.
[*] TSC 참고 사항
x86 CPU에 TSC가 없으면 커널은 IRQ_TIME_ACCOUNTING
(또는 VIRT_CPU_ACCOUNTING_GEN
)에 대해 다른 하드웨어 클럭 소스를 사용하려고 시도하지 않습니다.
이 코드는 사용 가능한 TSC가 승인되었음을 나타냅니다. CPU 없이 CPU에서 이것이 어떻게 작동할지 모르겠습니다 constant_tsc
:-). 관련 유지관리자가 문제를 알고 있고 그것이 허용되는 이유를 물을 것이라고 99.9% 확신하지만.
바라보다Native_sched_clock()그리고tsc_init():
/*
* Fall back to jiffies if there's no TSC available:
* ( But note that we still use it if the TSC is marked
* unstable. We do this because unlike Time Of Day,
* the scheduler clock tolerates small errors and it's
* very important for it to be as fast as the platform
* can achieve it. )
*/