Accurate calculation of CPU usage given in percentage in Linux?

后端 未结 5 1842
挽巷
挽巷 2020-11-29 16:23

It\'s a question which has been asked many times, however there is no well supported answer I could find.

Many people suggest the use of top command, but if you run

5条回答
  •  暖寄归人
    2020-11-29 16:57

    Hey i was also researching for the topic and found this thread really helpful. I used Vangelis Tasoulas formula to write a small python script for this. Attached is my Python code for the issue. It loads the cpu usage per cpu_id every second. Maybe its helps others as well. Also comments/suggestions are welcome :-)

    #!/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")                
    

提交回复
热议问题