# Linux에서 CPU 사용률을 정확하게 백분율로 계산합니까?

안녕하세요, 저는 주제에 대해서도 연구 중이었고이 스레드가 실제로 도움이된다는 것을 알았습니다. Vangelis Tasoulas 수식을 사용하여이를위한 작은 파이썬 스크립트를 작성했습니다. 첨부 된 내 파이썬 코드 문제입니다. cpu_id 당 cpu 사용량을 매 초마다로드합니다. 어쩌면 그것도 다른 사람들에게 도움이 될 것입니다. 또한 의견 / 제안을 환영합니다 :-)

``````#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
Created on 04.12.2014

@author: plagtag
'''
from time import sleep
import sys

'''
classdocs
'''

def __init__(self, percentage=True, sleeptime = 1):
'''
@date: 04.12.2014
@author: plagtag
@info:
@param:
'''
self.percentage = percentage
self.cpustat = '/proc/stat'
self.sep = ' '
self.sleeptime = sleeptime

def getcputime(self):
'''
http://stackoverflow.com/questions/23367857/accurate-calculation-of-cpu-usage-given-in-percentage-in-linux
read in cpu information from file
The meanings of the columns are as follows, from left to right:
0cpuid: number of cpu
1user: normal processes executing in user mode
2nice: niced processes executing in user mode
3system: processes executing in kernel mode
4idle: twiddling thumbs
5iowait: waiting for I/O to complete
6irq: servicing interrupts
7softirq: servicing softirqs

#the formulas from htop
user    nice   system  idle      iowait irq   softirq  steal  guest  guest_nice
cpu  74608   2520   24433   1117073   6176   4054  0        0      0      0

Idle=idle+iowait
NonIdle=user+nice+system+irq+softirq+steal
Total=Idle+NonIdle # first line of file for all cpus

CPU_Percentage=((Total-PrevTotal)-(Idle-PrevIdle))/(Total-PrevTotal)
'''
cpu_infos = {} #collect here the information
with open(self.cpustat,'r') as f_stat:
lines = [line.split(self.sep) for content in f_stat.readlines() for line in content.split('\n') if line.startswith('cpu')]

#compute for every cpu
for cpu_line in lines:
if '' in cpu_line: cpu_line.remove('')#remove empty elements
cpu_line = [cpu_line[0]]+[float(i) for i in cpu_line[1:]]#type casting
cpu_id,user,nice,system,idle,iowait,irq,softrig,steal,guest,guest_nice = cpu_line

Idle=idle+iowait
NonIdle=user+nice+system+irq+softrig+steal

Total=Idle+NonIdle
#update dictionionary
cpu_infos.update({cpu_id:{'total':Total,'idle':Idle}})
return cpu_infos

'''
CPU_Percentage=((Total-PrevTotal)-(Idle-PrevIdle))/(Total-PrevTotal)

'''
start = self.getcputime()
#wait a second
sleep(self.sleeptime)
stop = self.getcputime()

for cpu in start:
Total = stop[cpu]['total']
PrevTotal = start[cpu]['total']

Idle = stop[cpu]['idle']
PrevIdle = start[cpu]['idle']
CPU_Percentage=((Total-PrevTotal)-(Idle-PrevIdle))/(Total-PrevTotal)*100

if __name__=='__main__':
while True:
try:
print data
except KeyboardInterrupt:

sys.exit("Finished")
``````
Question

그것은 여러 번 묻는 질문입니다. 그러나 찾을 수있는 답변은 없습니다.

많은 사람들이 최고 명령을 사용하도록 권장하지만, 한 번 최상위로 실행하면 (예 : 1 초마다 CPU 사용량을 수집하는 스크립트가 있으므로) 항상 동일한 CPU 사용 결과를 제공합니다 ( 예 1 , 예 2 ).

CPU 사용량을 계산하는 더 정확한 방법은 `/proc/stat` 에서 값을 읽는 것이지만 대부분의 응답은 `/proc/stat` 의 처음 4 개 필드 만 사용하여 계산합니다 ( 여기서는 한 예).

`/proc/stat/` 는 리눅스 커널 2.6.33에서 CPU 코어 당 10 개의 필드를 가지고 있습니다!

나는 또한이 문제를 지적하는 / proc / stat 질문을 사용하여 Linux에서 CPU 사용률을 정확하게 계산 했습니다. 대부분의 다른 질문은 여러 필드 중 4 가지만 고려하지만 여기에 주어진 대답은 "I 생각 "(확실하지 않음)을 제외하고 처음 7 개 필드 ( `/proc/stat/` 에서 10 개 중)에 대해서만 우려합니다.

perl 스크립트는 모든 필드를 사용하여 CPU 사용량을 계산하는데, 나중에 다시 조사한 후에 올바른 것으로 생각하지 않습니다.

여기 에서 커널 코드를 살펴본 후 `guest_nice``guest fields` 는 항상 `nice``user` 와 함께 증가합니다 (따라서 CPU 사용 계산에 포함되지 않아야합니다. 이미 `user` 입력란)

``````/*
* Account guest cpu time to a process.
* @p: the process that the cpu time gets accounted to
* @cputime: the cpu time spent in virtual machine since the last update
* @cputime_scaled: cputime scaled by cpu frequency
*/
static void account_guest_time(struct task_struct *p, cputime_t cputime,
cputime_t cputime_scaled)
{
u64 *cpustat = kcpustat_this_cpu->cpustat;

/* Add guest time to process. */
p->utime += cputime;
p->utimescaled += cputime_scaled;
account_group_user_time(p, cputime);
p->gtime += cputime;

/* Add guest time to cpustat. */
cpustat[CPUTIME_NICE] += (__force u64) cputime;
cpustat[CPUTIME_GUEST_NICE] += (__force u64) cputime;
} else {
cpustat[CPUTIME_USER] += (__force u64) cputime;
cpustat[CPUTIME_GUEST] += (__force u64) cputime;
}
}
``````

요약하면, Linux에서 CPU 사용량을 계산하는 정확한 방법은 무엇이며 계산 및 방법 (유휴 시간과 비 유휴 시간으로 계산되는 필드는 어떤 필드를 고려해야합니까?)