에 기록된 대로https://www.kernel.org/doc/Documentation/cpu-load.txt의사 파일 /proc/stat의 정보는 타이머 인터럽트에 의해 업데이트됩니다. 이는 /proc/stat가 CPU 사용량에 대한 실제 보기를 제공하지 않을 수 있음을 의미합니다.
/proc/에 있는 정보도 마찬가지인가요?PID/stat도 타이머 인터럽트에 의해 업데이트됩니까? 그렇지 않은 경우 해당 정보는 언제/어떻게 업데이트됩니까?
답변1
kernel/sched/cputime.c
읽을 때 값 쿼리가 있는 함수가 포함되어 있으므로 Linux 커널에서 데이터를 읽어야 합니다 .task_cputime_adjusted
/proc/…/stat
특히, 의견은 cputime_adjust
귀하의 문서가 오래되었을 수 있음을 나타냅니다.
스케줄러 런타임 통계를 기반으로 틱 기반 CPUTime 무작위 정밀도를 조정합니다
.틱 기반 CPU 시간 청구는 작업이 타이머에 의해 중단되는지 여부에 따라 무작위로 예약된 시간 조각에 따라 달라집니다. 상황에 따라 이러한 인터럽트 수는 실제 사용자 및 시스템 CPU 시간을 다양한 정확도로 일치시키기 위해 너무 낙관적이거나 충분히 낙관적이지 않을 수 있습니다.
이 문제는 CFS 스케줄러가 기여하는 총 실행 시간을 기준으로 이러한 틱 기반 값을 조정하여 해결됩니다.
이 코드는 다음과 같은 보장을 제공합니다.
stime + utime == rtime stime_i+1 >= stime_i, utime_i+1 >= utime_i
당신이 말하는 경우
rtime_i+1 >= rtime_i
.
따라서 여기서 일어나는 일은 kernel/sched.c
프로세스가 어떤 이유로든 생성될 때마다 프로세스에서 소비한 시간이 업데이트되지만(적어도 사용자 공간에서는) 통계가 시스템 주기당 한 번(또는 그 이하) 업데이트된다는 것입니다. 물론 이는 멀티 코어 시스템에서는 모호하므로 cputime_adjust
여러 코어가 동시에 동일한 데이터를 업데이트하려는 것을 방지하려면 스핀록이 필요합니다.
즉, 부분 업데이트는 프로세스가 CPU 코어 제어권을 양보할 때마다 수행되고 부분 업데이트는 시스템 클록 사이클마다 수행되며 일정 시간 후에만 수행되며 양보 순간이 시스템 클록 사이클에 상대적이라고 가정합니다. /proc/…/stat에 표시된 값이 실제 값으로 수렴될 때까지 상관관계가 적용됩니다.