프로세스 CPU 합계가 top/htop에 표시된 총 CPU 소비량보다 높습니다.

프로세스 CPU 합계가 top/htop에 표시된 총 CPU 소비량보다 높습니다.

둘 다 그렇게 낮은 CPU 사용률을 top/htop보고하는 이유는 무엇입니까 ? /proc/stat프로세스 CPU 사용률 수치(스크린샷에서는 67.5%)가 올바른 것으로 보입니다. 여기에 이미지 설명을 입력하세요.

때로는 다음과 같은 예상 결과가 표시됩니다. 여기에 이미지 설명을 입력하세요.

일부 세부정보: Linux(커널 버전 4.19.0)는 Zynq 7z010(듀얼 코어 ARM Cortex-A9 프로세서)에서 실행됩니다. 신호 처리 응용 프로그램( server.elf스크린샷 참조)은 대부분의 리소스를 소비합니다. 대부분의 처리는 두 개의 스레드에서 발생합니다. 하나는 Receiver_010밀리초마다 깨어나는 스레드이고 다른 하나는 Spectrum_017밀리초마다 깨어나는 스레드입니다. 이러한 스레드는 SCHED_FIFO 스케줄러를 사용하여 예약됩니다.

답변1

나는 무슨 일이 일어나고 있는지 발견했습니다. Linux 커널 문서(https://www.kernel.org/doc/html/latest/admin-guide/cpu-load.html/proc/stat)은 ( top/ 이 데이터를 사용하여) htop에 표시된 데이터가 수집된 방법을 설명합니다.

타이머 인터럽트가 신호를 받을 때마다 커널은 그 순간에 어떤 유형의 작업이 실행되고 있는지 확인하고 해당 작업 유형/상태에 해당하는 카운터를 증가시킵니다. 이에 대한 문제는 시스템이 두 타이머 인터럽트 사이에 다양한 상태 사이를 여러 번 전환할 수 있지만 카운터는 마지막 상태에 대해서만 증가한다는 것입니다.

앞서 말했듯이 내 경우 대부분의 데이터 처리는 짧은 버스트(2..4ms이면 청크 처리를 완료하는 데 충분함)로 주기적으로(10ms마다) 발생합니다. 동작은 예제(https://www.kernel.org/doc/html/latest/admin-guide/cpu-load.html#example) - 모든 처리는 시스템 상태 샘플 간에 수행되므로 시스템은 항상 유휴 상태라고 생각합니다.

 system state sampled in timer interrupt (10ms period on my system)
     |                                        |
     v                10ms                    v
...--|----------------------------------------|-------------------------...
           ^    3ms   ^             7ms             ^   3ms    ^
   sleep   |  active  |            sleep            |  active  |  sleep
...------> | <------> | <-------------------------> | <------> | <------...

/proc/[pid]/stat다른 프로세스도 CPU를 사용하기 때문에 데이터 처리를 처리하는 프로세스(열에 표시된 것과 동일한 정보)의 CPU 사용률을 계산하기 위해 카운터를 사용하여 top이 문제를 해결했지만 제 경우에는 CPU 사용률이 무시할 수 있습니다.%CPU

관련 정보