学习和研究中前行,并在分享中提升自己

欢迎订阅阿里内推邮件



linux下cpu load和cpu使用率的关系

阅读次数: 342| 时间:2018年4月4日 21:21 | 标签:linux

linux下cpu load和cpu使用率的关系

cpu load是指系统上的负载,负载高并不代表着系统中cpu的使用率有多高。通常衡量一个系统负载高低主要是由系统中正在运行和在runqueue里面等待运行进程多少来决定的。引用一下网络上比较流行的一张图来解释一下load

需要说明的是上图表示的是单cpu情况下 load的一个表示,那么从图上可以看到,当load为1.00的时候刚好路被占满,大于1.00的时候,路上已经也有车容不下了。

那么在smp系统下只要系统的load不超过其cpu的个数,我们就可以认为cpu资源还是够用的,下面我们来举个例子,实际看一下cpu 使用率对load的影响。

  • cpu使用率较高但是load较低

开个4 vcpu的vm,使用python构造一个吃cpu的进程,先观察一下load值

20422 root      20   0  123264   4468   1960 R 100.0  0.1   2:25.06 python
====================================
   load average: 0.28, 0.56, 2.05

可以看到,虽然有个100% cpu 使用率的进程,那么对load值来说影响并不是很大(对于4 vcpus来说0.28的load已经相当小了),其实你用vmstat看一下,rq里面只有一下R的进程,所以load比较小

  • cpu使用率较低进程但是load却比较高

为了构造这种场景我们来写一个简单的程序

#include <stdio.h>                                                                 
#include <string.h>                                                                
#include <sys/types.h>                                                             
#include <sys/stat.h>                                                              
//O_DIRECT                                                                         
#define __USE_GNU 1                                                                
#include <fcntl.h>                                                                 
#include <stdint.h>                                                                
#define BUF_SIZE 1024 * 1024 *  20                                                 

int main(int argc, char * argv[])                                                  
{                                                                                  
    int fd;                                                                        
    int ret;                                                                       
    unsigned char *buf;                                                            
    ret = posix_memalign((void **)&buf, 512, BUF_SIZE);                            
    if (ret) {                                                                     
        perror("posix_memalign failed");                                           
        exit(1);                                                                   
    }                                                                              
    memset(buf, 'c', BUF_SIZE);                                                    

    fd = open("./direct_io.data", O_WRONLY | O_DIRECT | O_CREAT, 0755);            
    if (fd < 0){                                                                   
        perror("open ./direct_io.data failed");                                    
        exit(1);                                                                   
    }                                                                              

    do {                                                                           
        ret = write(fd, buf, BUF_SIZE);                                            
        if (ret < 0) {                                                             
            perror("write ./direct_io.data failed");                               
        }                                                                          
    } while (1);                                                                   

    free(buf);                                                                     
    close(fd);                                                                                                                                                                                              
}

上面的这段代码是一个写文件的操作,编译之后,我们多运行几个,5分钟过后我们来看一下整个系统的负载。相关,结果如下

top - 21:01:53 up 238 days,  6:29,  4 users,  load average: 2.48, 1.20, 0.55
Tasks: 142 total,   1 running, 141 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.5 sy,  0.0 ni, 74.3 id, 24.6 wa,  0.0 hi,  0.0 si,  0.1 st
KiB Mem :  3880664 total,  2169640 free,   723760 used,   987264 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2869856 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                
16305 rabbitmq  20   0 3915112  84488   2316 S   2.3  2.2   1778:02 beam.smp                                                                                                                               
 6359 root      20   0   24640  20848    352 D   1.0  0.5   0:00.81 a.out                                                                                                                                  
18998 root      20   0  431804  41432   5264 S   1.0  1.1 254:42.56 python                                                                                                                                 
 7424 root      20   0  128276   8220   3496 S   0.3  0.2 164:48.74 AliYunDun                                                                                                                              
23116 root      20   0  690240  78060   2460 S   0.3  2.0  57:20.18 python 

你会发现基本上没有使用太多cpu的进程,但是load却比较高。原因是什么呢?大家都知道io型的程序在等待io返回之前是会被置为D(不可中断的睡眠状态)状态的,这个状态不参与task调度故不用占用cpu资源,但是系统load却会把这种进程记录进去。所以,你会看到整个系统没有使用cpu资源多的进程但是load却比较高。

总结

  • 系统中cpu高的进程但是整个load不一定高,这个是因为系统中在运行的进程或者等待运行的进程并不多。
  • 系统中并无任何使用cpu高的进程,但是load可能会很高。这个可能的情况是系统中D状态的进程比较多导致。