도구 없이 프로세스 로드 평균을 얻는 방법

도구 없이 프로세스 로드 평균을 얻는 방법

내 프로그램에 프로세스와 해당 정보를 나열하고 싶습니다. /proc/[pid]에서 가장 많은 정보를 얻을 수 있습니다. top, htop 등은 프로세스의 평균 로드를 어떻게 얻나요?

답변1

이것실행 대기열(즉, 실행 중이거나 실행 대기 중)에 있는 프로세스(스레드)의 평균 수인 시스템의 평균 수(Linux의 경우)프로세스가 중단되지 않은 절전 상태에 있습니다., D다음 상태)를 일정 기간 내에 처리합니다.

/proc/loadavgLinux에서는 마지막 1분, 5분, 15분 동안 사용할 수 있습니다.

현재 이러한 스레드가 무엇인지 확인하려면(적어도 ps해당 /proc/pid/task/tid/stat파일을 읽을 때) 다음을 수행할 수 있습니다.

ps -eLo state,tid,args | awk '$1 ~ [RD]'

또는:

grep -ho '.*) [RD]' /proc/[1-9]*/task/*/stat

(대략적으로 프로세스 이름에 개행이나 )문자가 포함되어 있지 않다고 가정합니다. 정확하려면 세 번째 이상의 필드에 대해 )파일의 마지막 항목에서 시작해야 합니다.)

이것프로세스 부하실제로는 말이 되지 않습니다. 아마도 여러분이 생각하고 있는 것은 CPU가 일정 기간 동안 프로세스를 실행하는 데 소비하는 시간입니다.

예를 들어, top페이지가 1.5초마다 인쇄될 때 프로세스의 %CPU가 300%로 표시되면 이는 마지막 페이지가 인쇄된 이후 1.5초 동안 CPU가 해당 프로세스에 대해 총 작업/스레드를 실행했음을 의미합니다. 4.5초.

이 정보를 얻으려면 기간의 시작과 끝에서 utime(14) 및 (15) 필드의 합을 구하고(세부 사항 참조) stime기간에 대한 차이의 비율을 구합니다./proc/pid/statman 5 proc

예를 들어 다음과 같습니다 zsh.

zmodload zsh/zselect
period=100 # centi-seconds
((clk_tck = $(getconf CLK_TCK)))
for i (1 2) {
  read -rd '' stat < /proc/$pid/stat;
  t[i]=$((${(j:+:)${(s: :)stat##*\)}[12,13]}))
  ((i == 2)) || zselect -t $period
}
printf '%.4g%%\n' $(((t[2] - t[1]) * 100. * 100 / period / clk_tck))

통과되면프로세스 부하, 실행 대기열에 있는 해당 프로세스의 평균 스레드 수를 의미합니다(의견에서 @Patrick이 제안한 정의에 따라). 다음과 같은 몇 가지 예를 통해 근사치를 얻을 수 있습니다.

$ (repeat 100 grep -l ') [RD]' /proc/$pid/task/*/stat)|awk 'END{print NR/100}'
16.57

이 100개의 명령을 실행하는 데 걸린 시간 동안 $pid실행 대기열에는 평균 16.57개의 스레드가 있었습니다.

답변2

시스템 전체 로드 평균(및 기타 통계)을 보려면 를 확인하세요 proc/loadavg. 처음 세 필드는 1분, 5분, 15분 로드 평균이며, 이는 대부분의 시스템 모니터에 표시됩니다. 네 번째 필드는 슬래시로 구분된 두 개의 숫자로 구성됩니다. 첫 번째는 실행 가능한 프로세스 수이고 두 번째는 전체 프로세스 수(스레드 포함)입니다. 다섯 번째 필드는 시스템에 있는 최신 프로세스의 PID입니다.

더 자세한 통계를 원하면 netlink를 통해 커널과 통신하거나(특별히 쉽지 않음) 번호가 매겨진 디렉터리를 스캔해야 합니다 /proc(TOCTOU 경합으로 인해 신뢰할 수 없음). 원하는 관련 파일은 아마도 /proc/<PID>/stat대부분의 작업 관리자가 표시하는 기타 정보의 대부분을 포함하는 것입니다. 정확한 설명은 여기에 게시하기에는 약간 길지만 man procproc 파일 시스템의 매뉴얼 페이지(터미널)에 잘 설명되어 있습니다.

프로세스의 맥락에서 "부하"는 의미가 없다는 점은 주목할 가치가 있습니다. 로드 평균은 특정 기간 동안 실행 가능한 상태에 있는 프로세스의 평균 수입니다(시스템이 얼마나 바쁜지를 측정하는 것은 매우 형편없는 척도이지만 이는 또 다른 이야기입니다). 따라서 정의에 따르면 특정 프로세스에는 " 로드" 값입니다. 프로세스는 시스템에 로드를 생성하지만 프로세스 자체에는 "로드"가 없습니다. 이에 가장 가까운 것은 프로세스에서 사용하는 CPU 시간입니다. 이는 pollinb의 위 파일을 통해 쉽게 계산됩니다(Stéphane Chazelas의 답변에서 계산 방법이 꽤 잘 설명되어 있으므로 여기서는 반복하지 않겠습니다).

관련 정보