Documentation/cpu-load.txt는 Linux CPU 로드가 *오도될 수* 있음을 나타냅니다. 언급되지 않은 새로운(또는 기존) 완화가 있습니까?

Documentation/cpu-load.txt는 Linux CPU 로드가 *오도될 수* 있음을 나타냅니다. 언급되지 않은 새로운(또는 기존) 완화가 있습니까?

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.cLKML.org의 링크된 스레드에 따르면 CPU를 많이 사용할 수 있고 커널은 CPU 사용량의 몇 퍼센트 이하만 보고하는 샘플 프로그램이 포함되어 있습니다.

현재 시스템에서 컴파일하고 실행해 보았습니다. 커널은 프로그램의 CPU 사용량이 약 80%라고 보고합니다. 그래서 상황이 좀 바뀐 것 같아요. smallhog.c이 시스템이 왜 덜 효율적인지 정확히 알고 있습니까 ?

저는 "Intel(R) Core(TM) i5-5300U CPU"에서 64비트 모드로 실행되는 Fedora 30, Linux 커널 v5.2.0-rc5(대략)를 사용하고 있습니다.

  • lscpu표시 constant_tscnonstop_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는 온라인 상태를 유지해야 합니다...")

바라보다리눅스-5.2-rc5/init/Kconfig:

메뉴 "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. )
 */

관련 정보