Linux 시스템 CPU 사용률 계산

6233 단어

Linux의 CPU 사용률 계산 원리 상세 정보


우리가 성능 테스트를 할 때 백엔드 서버의 CPU 이용률 모니터링은 자주 사용하는 수단이다.서버의 CPU 사용률이 높으면 서버가 매우 바쁘다는 것을 나타낸다.만약에 프론트 데스크톱의 응답 시간이 갈수록 커지고 백엔드 CPU 이용률이 시종 올라가지 않는다면 어느 곳에 병목이 생겼고 시스템이 개선되어야 한다는 것을 의미한다.이것은 기술을 모르는 사람이라도 쉽게 이해할 수 있는 일이다.
위에서 이해한 거 맞죠?나는 개인적으로 그다지 정확하지 않다고 생각한다.이것은 백그라운드에서 당신이 테스트하는 과정이 어떤 유형인지 보아야 한다.계산 집약형 프로세스라면 현재의 압력이 갈수록 커질 때 CPU 이용률을 높이기 쉽다.그러나 I/O 네트워크가 밀집된 프로세스라면 클라이언트의 요청이 많아지더라도 서버 CPU가 올라갈 수 있는 것은 아니다. 이것은 당신이 테스트하고자 하는 프로세스의 자연 속성에 의해 결정된다.비교적 흔히 볼 수 있는 것은 큰 파일의 빈번한 읽기와 쓰기의 cpu 비용이 작은 파일의 빈번한 읽기와 쓰기 비용보다 훨씬 적다는 것이다.입출력 처리량이 일정할 때 작은 파일의 읽기와 쓰기가 더욱 잦아지기 때문에 입출력 중단을 처리하기 위해 더 많은 cpu가 필요합니다.
Linux/Unix에서 CPU 이용률은 사용자 상태, 시스템 상태와 유휴 상태로 나뉘는데 각각 CPU가 사용자 상태에서 실행되는 시간, 시스템 내부 핵이 실행되는 시간, 유휴 시스템 프로세스가 실행되는 시간을 나타낸다.CPU 사용률이란 CPU가 비시스템 유휴 프로세스를 수행하는 시간/CPU 총 실행 시간입니다.
Linux 커널에는 Jiffies라는 글로벌 변수가 있습니다.Jiffies 대표 시간.그것의 단위는 하드웨어 플랫폼에 따라 다르다.시스템에는 초당 최소 시간 간격의 수를 나타내는 상수 HZ가 정의되어 있습니다.이렇게 jiffies의 단위는 1/HZ입니다.Intel 플랫폼 jiffies의 단위는 1/100초입니다. 이것이 바로 시스템이 분별할 수 있는 최소 시간 간격입니다.각 CPU 타임슬라이스에는 Jiffies가 1씩 추가됩니다.CPU의 이용률은 사용자 상태 + 시스템 상태를 실행하는 Jiffies를 전체 Jifffies로 나누는 것이다.
Linux 시스템에서/proc/stat 파일로 cpu의 이용률을 계산할 수 있습니다(자세한 설명은 참고할 수 있습니다:http://www.linuxhowtos.org/System/procstat.htm).이 파일은 모든 CPU 활동에 대한 정보를 포함하고 있으며, 이 파일의 모든 값은 시스템 시작 때부터 현재 시간까지 누적됩니다.
예:
[sailorhzr@builder ~]$ cat /proc/stat  cpu 432661 13295 86656 422145968 171474 233 5346 cpu0 123075 2462 23494 105543694 16586 0 4615 cpu1 111917 4124 23858 105503820 69697 123 371 cpu2 103164 3554 21530 105521167 64032 106 334 cpu3 94504 3153 17772 105577285 21158 4 24 intr 1065711094 1057275779 92 0 6 6 0 4 0 3527 0 0 0 70 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7376958 0 0 0 0 0 0 0 1054602 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ctxt 19067887 btime 1139187531 processes 270014 procs_running 1 procs_blocked 0

출력 해석
CPU 및 CPU0, CPU1, CPU2, CPU3 각 행의 매개 변수 의미(첫 번째 비헤이비어의 경우):
매개 변수
설명하다
user (432661) nice (13295) system (86656) idle (422145968) iowait (171474) irq (233) softirq (5346)  
시스템 시작부터 현재 시간까지 누적된 사용자 상태의 CPU 시간 (단위: jiffies) 은nice 값이 마이너스인 프로세스를 포함하지 않습니다.1jiffies=0.01초는 시스템 시작 시간부터 현재 시간까지 누적됩니다.nice값이 마이너스인 프로세스가 차지하는 CPU 시간(단위:jiffies)은 시스템 시작 시간부터 현재 시간까지 누적됩니다. 핵심 시간(단위:jiffies)은 시스템 시작 시간부터 현재 시간까지 누적됩니다. 하드디스크 IO 대기 시간을 제외한 다른 대기 시간(단위:jiffies)은 시스템 시작 시간부터 현재 시간까지 누적됩니다.하드 드라이브 IO 대기 시간 (단위: jiffies), 시스템 시작 시 누적 현재 시간, 하드 중단 시간 (단위: jiffies) 시스템 시작 시 누적 현재 시간, 소프트 중단 시간 (단위: jiffies)
CPU 시간 = user + system + nice + idle + iowait + irq + softirq
'intr'라는 줄은 중단된 정보를 제공합니다. 첫 번째는 시스템이 시작된 이래 발생한 모든 중단 횟수입니다.그리고 각 수는 시스템이 시작된 이래 발생하는 특정한 중단에 대응한다.
"ctxt"는 시스템이 시작된 이래 CPU에서 발생한 상하문 교환 횟수를 보여 줍니다.
"btime"은 시스템이 시작될 때부터 지금까지의 시간을 보여 줍니다. 단위는 초입니다.
"processes (total_forks) 가 시스템 시작 이후 생성된 작업의 개수입니다.
procs_running: 현재 대기열을 실행하는 작업의 수입니다.
procs_blocked: 현재 막힌 작업의 수입니다.
그러면 CPU 사용률은 다음과 같은 두 가지 방법을 사용할 수 있다.먼저 두 개의 샘플링 포인트를 추출한 다음 그 차액을 계산합니다.
cpu usage=(idle2-idle1)/(cpu2-cpu1)*100 cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100

다음은 bash와perl로 각각 만든 cpu 이용률로 계산합니다.
참고: 다음 코드는 다음과 같은 공식을 사용합니다.
 [code lang="code"]
total_0USER[0]+NICE[0]+SYSTEM[0]+IDLE[0]+IOWAIT[0]+IRQ[0]+SOFTIRQ[0] total_1=USER[1]+NICE[1]+SYSTEM[1]+IDLE[1]+IOWAIT[1]+IRQ[1]+SOFTIRQ[1] cpu usage=(IDLE[0]-IDLE[1]) / (total_0-total_1) * 100
[/code]
 bash  :
01.#!/bin/sh
02.##echo user nice system idle iowait irq softirq
03.CPULOG_1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
04.SYS_IDLE_1=$(echo $CPULOG_1 | awk '{print $4}')
05.Total_1=$(echo $CPULOG_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}')
06.  
07.sleep 5
08.  
09.CPULOG_2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
10.SYS_IDLE_2=$(echo $CPULOG_2 | awk '{print $4}')
11.Total_2=$(echo $CPULOG_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}') 
12.  
13.SYS_IDLE=`expr $SYS_IDLE_2 - $SYS_IDLE_1`
14.  
15.Total=`expr $Total_2 - $Total_1`
16.SYS_USAGE=`expr $SYS_IDLE/$Total*100 |bc -l`
17.  
18.SYS_Rate=`expr 100-$SYS_USAGE |bc -l`
19.  
20.Disp_SYS_Rate=`expr "scale=3; $SYS_Rate/1" |bc`
21.echo $Disp_SYS_Rate%
 perl  :
01.#!/usr/bin/perl
02.use warnings;
03.  
04.$SLEEPTIME=5;
05.  
06.if (-e "/tmp/stat") {
07.    unlink "/tmp/stat";
08.}
09.open (JIFF_TMP, ">>/tmp/stat") || die "Can't open /proc/stat file!
"; 10.open (JIFF, "/proc/stat") || die "Can't open /proc/stat file!
"; 11.@jiff_0=<JIFF>; 12.print JIFF_TMP $jiff_0[0] ; 13.close (JIFF); 14.   15.sleep $SLEEPTIME; 16.   17.open (JIFF, "/proc/stat") || die "Can't open /proc/stat file!
";  @jiff_1=<JIFF>; 18.print JIFF_TMP $jiff_1[0]; 19.close (JIFF); 20.close (JIFF_TMP); 21.   22.@USER=`awk '{print \$2}' "/tmp/stat"`; 23.@NICE=`awk '{print \$3}' "/tmp/stat"`; 24.@SYSTEM=`awk '{print \$4}' "/tmp/stat"`; 25.@IDLE=`awk '{print \$5}' "/tmp/stat"`; 26.@IOWAIT=`awk '{print \$6}' "/tmp/stat"`; 27.@IRQ=`awk '{print \$7}' "/tmp/stat"`; 28.@SOFTIRQ=`awk '{print \$8}' "/tmp/stat"`; 29.   30.$JIFF_0=$USER[0]+$NICE[0]+$SYSTEM[0]+$IDLE[0]+$IOWAIT[0]+$IRQ[0]+$SOFTIRQ[0]; 31.$JIFF_1=$USER[1]+$NICE[1]+$SYSTEM[1]+$IDLE[1]+$IOWAIT[1]+$IRQ[1]+$SOFTIRQ[1]; 32.$SYS_IDLE=($IDLE[0]-$IDLE[1]) / ($JIFF_0-$JIFF_1) * 100;  $SYS_USAGE=100 - $SYS_IDLE; 33.   34.printf ("The CPU usage is %1.2f%%
",$SYS_USAGE);

좋은 웹페이지 즐겨찾기