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



0 Answers

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

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

'''
Created on 04.12.2014

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

class GetCpuLoad(object):
    '''
    classdocs
    '''


    def __init__(self, percentage=True, sleeptime = 1):
        '''
        @parent class: GetCpuLoad
        @date: 04.12.2014
        @author: plagtag
        @info: 
        @param:
        @return: CPU load in percentage
        '''
        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

    def getcpuload(self):
        '''
        CPU_Percentage=((Total-PrevTotal)-(Idle-PrevIdle))/(Total-PrevTotal)

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

        cpu_load = {}

        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
            cpu_load.update({cpu: CPU_Percentage})
        return cpu_load


if __name__=='__main__':
    x = GetCpuLoad()
    while True:
        try:
            data = x.getcpuload()
            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_niceguest fields 는 항상 niceuser 와 함께 증가합니다 (따라서 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. */
    if (task_nice(p) > 0) {
        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 사용량을 계산하는 정확한 방법은 무엇이며 계산 및 방법 (유휴 시간과 비 유휴 시간으로 계산되는 필드는 어떤 필드를 고려해야합니까?)



Related