표준 *nix 도구를 사용하여 bash 스크립트를 통해 코어당 CPU 사용량을 얻는 방법

표준 *nix 도구를 사용하여 bash 스크립트를 통해 코어당 CPU 사용량을 얻는 방법

dwm를 사용하기 위해 bash 스크립트를 작성 중입니다 xsetroot. 모든 것이 예상대로 작동합니다. 현재 내가 놓치고 있는 것은 *nix표준 도구만 사용하여 시스템의 각 코어(코어가 4개 있음)에 대한 현재 로드를 제공하는 쉬운 방법입니다. 예를 들어 를 사용하여 이 작업을 수행하는 방법을 모르겠습니다 top. 지금까지 이 사이트에서 찾은 다른 모든 게시물은 로드 평균만 다룹니다. 전에 이런 일을 해본 사람이 있나요?

내가 모든 코어에 적용하려는 주된 이유는 프로그램이 내가 병렬로 작성한 일부 코드(예: 모든 루프)를 실행하고 있는지 확인할 수 있는 저렴하고 조잡한 도구를 갖기 위해서입니다.

답변1

그러면 요소가 CPU당 로드인 bash 배열이 생성됩니다.

loads=($(mpstat -P ALL 1 1 | awk '/Average:/ && $2 ~ /[0-9]/ {print $3}'))

Bash 배열은 0부터 시작하여 번호가 매겨지기 때문에 두 번째 CPU의 로드는 다음과 같이 인쇄됩니다.

echo ${loads[1]}

이를 위해서는 유틸리티가 필요합니다 mpstat. Debian 계열 시스템에 설치하려면 다음을 실행하세요.

apt-get install sysstat

어떻게 작동하나요?

결과적으로 다소 장황한 출력은 mpstat다음과 같습니다.

$ mpstat -P ALL 1 1
Linux 3.2.0-4-amd64 (MyMachine)     08/30/2014      _x86_64_        (2 CPU)

10:12:35 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:12:36 PM  all    1.49    0.00    1.49    0.00    0.00    0.00    0.00    0.00   97.01
10:12:36 PM    0    0.00    0.00    2.02    0.00    0.00    0.00    0.00    0.00   97.98
10:12:36 PM    1    1.96    0.00    1.96    0.00    0.00    0.00    0.00    0.00   96.08

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
Average:     all    1.49    0.00    1.49    0.00    0.00    0.00    0.00    0.00   97.01
Average:       0    0.00    0.00    2.02    0.00    0.00    0.00    0.00    0.00   97.98
Average:       1    1.96    0.00    1.96    0.00    0.00    0.00    0.00    0.00   96.08

이는 모든 CPU를 표시하도록 -P ALL지시 하고 매개변수는 매초마다 출력을 인쇄하고 첫 번째 초 후에 중지하도록 지시합니다.mpstat1 1

원하는 값만 선택하려면 awk다음 명령을 사용하십시오.

awk '/Average:/ && $2 ~ /[0-9]/ {print $3}'

이렇게 하면 마지막 몇 개의 행만 선택됩니다( 및 로 시작하는 행 Average:, 두 번째 열에 숫자가 있는 행만 선택됨). 이러한 행에 대해 세 번째 열(CPU 로드)이 인쇄됩니다.

괄호 사용으로 인해 mpstat- awk파이프의 출력이 bash 배열로 캡처됩니다.

답변2

코어당 평균 사용량 계산/proc/stat

지금까지 내가 생각해낸 최고의 솔루션은 bc부동 소수점 연산을 계산하는 것입니다.

# Calculate average cpu usage per core.
#      user  nice system   idle iowait irq softirq steal guest guest_nice
# cpu0 30404 2382   6277 554768   6061   0      19    0      0          0
A=($(sed -n '2,5p' /proc/stat))
# user         + nice     + system   + idle
B0=$((${A[1]}  + ${A[2]}  + ${A[3]}  + ${A[4]}))
B1=$((${A[12]} + ${A[13]} + ${A[14]} + ${A[15]}))
B2=$((${A[23]} + ${A[24]} + ${A[25]} + ${A[26]}))
B3=$((${A[34]} + ${A[35]} + ${A[36]} + ${A[37]}))
sleep 2
# user         + nice     + system   + idle
C=($(sed -n '2,5p' /proc/stat))
D0=$((${C[1]}  + ${C[2]}  + ${C[3]}  + ${C[4]}))
D1=$((${C[12]} + ${C[13]} + ${C[14]} + ${C[15]}))
D2=$((${C[23]} + ${C[24]} + ${C[25]} + ${C[26]}))
D3=$((${C[34]} + ${C[35]} + ${C[36]} + ${C[37]}))
# cpu usage per core
E0=$(echo "scale=1; (100 * ($B0 - $D0 - ${A[4]}   + ${C[4]})  / ($B0 - $D0))" | bc)
E1=$(echo "scale=1; (100 * ($B1 - $D1 - ${A[15]}  + ${C[15]}) / ($B1 - $D1))" | bc)
E2=$(echo "scale=1; (100 * ($B2 - $D2 - ${A[26]}  + ${C[26]}) / ($B2 - $D2))" | bc)
E3=$(echo "scale=1; (100 * ($B3 - $D3 - ${A[37]}  + ${C[37]}) / ($B3 - $D3))" | bc)
echo $E0
echo $E1
echo $E2
echo $E3

코어당 평균 CPU 사용량은 직접 계산할 수 있습니다 /proc/stat(사용 팁을 제공한 @mikeserv에게 감사드립니다 /proc/stat).

# Here we make use of bash direct array assignment
A0=($(sed '2q;d' /proc/stat))
A1=($(sed '3q;d' /proc/stat))
A2=($(sed '4q;d' /proc/stat))
A3=($(sed '5q;d' /proc/stat))
# user         + nice     + system   + idle
B0=$((${A0[1]} + ${A0[2]} + ${A0[3]} + ${A0[4]}))
B1=$((${A1[1]} + ${A1[2]} + ${A1[3]} + ${A1[4]}))
B2=$((${A2[1]} + ${A2[2]} + ${A2[3]} + ${A2[4]}))
B3=$((${A3[1]} + ${A3[2]} + ${A3[3]} + ${A3[4]}))
sleep 0.2
C0=($(sed '2q;d' /proc/stat))
C1=($(sed '3q;d' /proc/stat))
C2=($(sed '4q;d' /proc/stat))
C3=($(sed '5q;d' /proc/stat))
# user         + nice     + system   + idle
D0=$((${C0[1]} + ${C0[2]} + ${C0[3]} + ${C0[4]}))
D1=$((${C1[1]} + ${C1[2]} + ${C1[3]} + ${C1[4]}))
D2=$((${C2[1]} + ${C2[2]} + ${C2[3]} + ${C2[4]}))
D3=$((${C3[1]} + ${C3[2]} + ${C3[3]} + ${C3[4]}))
# cpu usage per core
E0=$(((100 * (B0 - D0 - ${A0[4]} + ${C0[4]})) / (B0 - D0)))
E1=$(((100 * (B1 - D1 - ${A1[4]} + ${C1[4]})) / (B1 - D1)))
E2=$(((100 * (B2 - D2 - ${A2[4]} + ${C2[4]})) / (B2 - D2)))
E3=$(((100 * (B3 - D3 - ${A3[4]} + ${C3[4]})) / (B3 - D3)))
echo $E0
echo $E1
echo $E2
echo $E3

또는 bash 직접 배열 할당을 광범위하게 사용하여 단축합니다.

# Here we make use of bash direct array assignment by assigning line
# 2 to 4 to one array


A=($(sed -n '2,5p' /proc/stat))
# user         + nice     + system   + idle
B0=$((${A[1]}  + ${A[2]}  + ${A[3]}  + ${A[4]}))
B1=$((${A[12]} + ${A[13]} + ${A[14]} + ${A[15]}))
B2=$((${A[23]} + ${A[24]} + ${A[25]} + ${A[26]}))
B3=$((${A[34]} + ${A[35]} + ${A[36]} + ${A[37]}))
sleep 0.2
# user         + nice     + system   + idle
C=($(sed -n '2,5p' /proc/stat))
D0=$((${C[1]}  + ${C[2]}  + ${C[3]}  + ${C[4]}))
D1=$((${C[12]} + ${C[13]} + ${C[14]} + ${C[15]}))
D2=$((${C[23]} + ${C[24]} + ${C[25]} + ${C[26]}))
D3=$((${C[34]} + ${C[35]} + ${C[36]} + ${C[37]}))
# cpu usage per core
E0=$((100 * (B0 - D0 - ${A[4]}  + ${C[4]})  / (B0 - D0)))
E1=$((100 * (B1 - D1 - ${A[15]} + ${C[15]}) / (B1 - D1)))
E2=$((100 * (B2 - D2 - ${A[26]} + ${C[26]}) / (B2 - D2)))
E3=$((100 * (B3 - D3 - ${A[37]} + ${C[37]}) / (B3 - D3)))
echo $E0
echo $E1
echo $E2
echo $E3

top솔루션 기반

추가 도구를 설치하지 않고도 이 작업을 수행할 수 있습니다 top(나중에 이 내용을 사용했습니다).우편 엽서.) 기본적으로 top시작 시 평균 CPU 로드만 표시되지만 을 누르면 모든 CPU가 표시됩니다 1. 배치 출력 모드에서 CPU 출력을 사용하려면 시작 시 이를 기본 동작 top으로 설정해야 합니다 . top이는 파일을 사용하여 수행할 수 있습니다 ~/.toprc. 다행스럽게도 이 파일은 자동으로 생성될 수 있습니다. top을 누르고 1누르면 홈 폴더에 파일이 생성 W됩니다 . ~/.toprc지금 실행해보면 이제 모든 코어가 출력되는 top -bn 1 | grep -F '%Cpu'것을 볼 수 있습니다 . top이제 우리는 작업을 완료하는 데 필요한 모든 것을 갖추고 있습니다. 필요한 모든 정보는 3의 출력이 될 배열 열에 있습니다 top.

한 가지 문제가 있습니다. 특정 코어의 CPU 사용량이 100%명령에 의해 어레이 출력에 도달하면 현재 로드가 있는 열이 한 열에서 3다른 열로 이동됩니다 2. 따라서 열의 출력이 awk '{print $3}'표시됩니다 . 괜찮다면 그냥 떠나세요. 그렇지 않은 경우 인쇄 막대를 사용할 수도 있습니다 . 그러면 그렇게 해 . 이러한 모든 함정을 피하는 솔루션은 다음과 같습니다.us,3awk2:

top -bn 2 | grep -F '%Cpu' | tail -n 4 | gawk '{print $2 $3}' | tr -s '\n\:\,[:alpha:]' ' '

모든 줄 바꿈 및 문자의 출력을 제거 \n하고 공백 하나만 제외한 모든 것을 제거합니다.,[:alpha:]-s

답변3

나는 이 솔루션을 생각해 냈고 그것은 나에게 효과적입니다.

echo print `top -n 1 | tr -s " " | cut -d$" " -f10 | tail -n +8 | head -n -1 | paste -sd+ | bc`/ `nproc` | python

출처(작성): https://mohammadg.com/programming/how-to-get-overall-cpu-utilization-from-the-bash-command-line/

답변4

다음 명령을 사용하여 각 코어의 주파수를 볼 수 있습니다.

$ cat /proc/cpuinfo

관련 정보