• 性能分析_linux服务器CPU_CPU利用率


     

    CPU度量

    1.  指标范围

    1.1  User mode CPU utilization+ System mode CPU utilization

    合理值:60-85%,如果在一个多用户系统中us+sy时间超过85%,则进程可能要花时间在运行队列中等待,响应时间和业务吞吐量会受损害;us过大,说明有用户进程占用很多cpu时间,需要进一步的分析其它软硬件因素;sy过大,说明系统管理方面花了很多时间,说明该系统中某个子系统产生了瓶颈,需要进一步分析其它软硬件因素。

    1.2  Wa(wait)

    参考值:小于25%,超过25%的wa的值可以表示磁盘子系统可能没有被正确平衡,也可能是磁盘密集工作负载的结果,系统的磁盘或其它I/o可能有问题,可以通过iostat/SAR –C命令进一步分解分析

    1.3  Id(idle)

    参考值:大于40,如果r经常大于4,且id经常小于40,表示cpu的负荷很重

    1.4  r

    参考值:小于4,队列大于4时,表明系统的cpu或内存可能有问题,如果r经常大于4,且id经常少于40,表示cpu的负荷很重。当队列变长时,队列中进程在等待cpu调度执行时所花的时间会变长

    1.5  判断cpu瓶颈的方法

    很慢的响应时间(slow response time)

    Cpu的空闲时间为零(zero percent idle cpu)

    过高的用户占用cpu时间(high percent user cpu)

    过高的系统占用cpu时间(high percent system cpu)

    长时间的有很长的运行进程队列(large run queue size sustained over time)

    2.  如何查看cpu利用率

    2.1  使用top命令查看

    数据来自/proc/stat文件

     

    %us =(User time + Nice time)/CPU时间*100%

    %sy=(System time + Hardirq time +Softirq time)/ CPU时间*100%

    %id=(Idle time)/CPU时间*100%

    %ni=(Nice time)/CPU时间*100%

    %wa=(Waiting time)/CPU时间*100%

    %hi=(Hardirq time)/CPU时间*100%

    %si=(Softirq time)/CPU时间*100%

    %st=(Steal time)/CPU时间*100%

    备注: top 命令默认情况下,是每 3 秒刷新一次。也可以通过 top  -d <刷新时间间隔> 来指定刷新频率,如top -d 0.1 或top -d 0.01 等。top 执行时,也可以按“s ”键,修改时间间隔。 

    2.2  使用vmstat查看

     

    r表示运行队列的大小,b表示由于IO等待而block的线程数量,in表示中断的数量,cs表示上下文切换的数量。

    2.3  其它查看方式

    Iostat、sar  -q、sar –u等

    3.  CPU介绍

    3.1  内核中的时间

    HZ是系统时钟在一秒内固定发出时钟中断的次数。HZ在编译内核前是可以进行配置的,因此通过下述命令就可以查看当前系统的时钟中断频率:cat /boot/config-`uname -r` | grep CONFIG_HZ

    tick为系统时钟每“滴答“一次的时间,其值为(1/HZ)秒。也就是连续两次时钟中断之间的时间间隔。

    jiffies用来计算自系统启动以来tick的次数,也就是说系统时钟每产生一次时钟中断,该变量的值就增加一次。

    3.2  CPU时间组成

    CPU的工作时间由三部分组成:用户态时间、系统态时间和空闲态时间。具体的组成为:

    CPU时间包含User time、System time、Nice time、Idle time、Waiting time、Hardirq time、Softirq time、Steal time

    空闲态时间==idle time

    用户态时间==user time+ Nice time。

    内核态时间==system time+ Hardirq time+ Softirq time。

    user time。指CPU在用户态执行进程的时间。

    system time。指CPU在内核运行的时间。

    nice time。指系统花费在调整进程优先级上的时间。

    idle time。系统处于空闲期,等待进程运行。

    waiting time。指CPU花费在等待I/O操作上的总时间,与blocked相似。

    steal time。指当前CPU被强制(involuntary wait )等待另外虚拟的CPU处理完毕时花费的时间,此时 hypervisor 在为另一个虚拟处理器服务。 

    Softirq time 、Hardirq time。分别对应系统在处理软硬中断时候所花费的CPU时间。

    3.3  User mode CPU utilization

    %usr。显示了用户方式下所花费CPU时间的百分比,用户使用CPU的进程包括:cpu运行常规用户进程,cpu运行niced process,cpu运行实时进程。一个linux进程可以在用户方式下执行,也可以在系统(内核)方式下执行,当一个进程在内核代码中运行时,我们称其处于内核态;当一个进程正在执行用户自己的代码时,我们称其处于用户态,在用户方式下执行时,进程在它自己的应用程序代码中执行,不需要内核资源来进行计算、管理内存或设置变量

    3.4  System mode CPU utilization

    显示了系统方式下所花费cpu时间的百分比,包括内核进程(kprocs)和其他需要访问内核资源的进程所消耗的cpu资源,系统使用cpu的进程包括:用于系统调用,用于I/O管理(中断和驱动),用于内存管理(paging and swapping),用于进程管理(context switch and process start),如果一个进程需要内核资源,它必须执行一个系统调用,并由此切换到系统方式从而使该资源可用。

    3.5  %wa(wait)

    显示了暂挂本地磁盘I/O和NFS加载的磁盘的cpu空闲百分比,是由于进程等待I/O而使cpu处于空闲状态的比率,I/O主要包括:block I/O,raw I/O,VM-paging/swapins。如果在wait运行时至少有一个未完成的磁盘I/O,该事件就归为I/O等待时间,对磁盘的I/O请求会导致调用的进程阻塞(或睡眠),直到请求完成为止,一旦进程的I/O请求完成,该进程就放入运行队列中。如果I/O很快完成,该进程可以使用更多的cpu时间。

    3.6  %id(idle)

    除了上面的WIO以外的空闲情况,显示了没有本地磁盘I/O时cpu空闲或等待的时间百分比。如果没有线程可以执行(运行队列为空),系统分派一个叫做wait的线程,可称为idle kproc。如果ps报告显示这个线程的总计时间较高,这表明存在时间段,其中没有其它线程准备在cpu上运行或等待执行。系统因此大部分时间空闲或等待新任务。

    3.7  r(runq-sz)

    运行进程队列的长度。对于可运行状态的进程个数的大小,这些进程在内存中准备就绪

    4.  概念介绍

    4.1  用户模式+内核模式

    一般说来,一个进程在CPU上运行可以有两种运行模式,既可在用户模式下运行,又可在内核模式下运行(即进程分别工作在用户态和内核态,在内核态工作仍旧是这个进程,除非进行了进程的切换)。通常操作系统把虚拟地址空间划分为用户空间和内核空间,例如x86平台的Linux系统虚拟地址空间是0x00000000~0xffffffff,前3GB(0x00000000~0xbfffffff)是用户空间,后1GB(0xc0000000~0xffffffff)是内核空间。用户程序加载到用户空间,在用户模式下执行,不能访问内核中的数据,也不能跳转到内核代码中执行。这样可以保护内核,如果一个进程访问了非法地址,顶多这一个进程崩溃,而不会影响到内核和整个系统的稳定性。Cpu在产生中断或异常时不仅会跳转到中断或异常服务中去,还会自动切换模式,从用户模式切换到特权模式,因此从中断或异常服务器程序可以跳转到内核代码中执行。事实上,整个内核就是由各种中断和异常处理程序组成的。即,正常情况下处理器在用户模式执行用户程序,在中断或异常情况下处理器切换到特权模式执行内核程序,处理完中断或异常之后再返回用户模式继续执行用户程序,例如,用户进程A调用了内核系统调用来获取当前的时钟滴答数,在执行用户进程A中的系统调用指令时会保存当前用户进程的IP,CS等当前寄存器状态,然后再跳转到内核空间(即内核代码区域)去执行像应的系统调用函数,获取当前的时钟滴答数。执行完后再通过IRET指令返回到进程A中(就是将进入时保存的信息再复位到相应的寄存器中),再接着从CS:EIP地址开始执行A进程的指令

    进程在创建的时候除了创建进程的控制块之外,在内核里还创建了进程的内核栈,进程通过系统调用(例如fopen()或者open())进入内核后,此时处理器处于特权级最高的(0级)内核代码中执行,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,是指向在进程的上下文上的,

    内核模式的权限高于用户模式的权限。

    用户级。系统用户可以与操作系统进行交互操作,如运行应用和系统命令,用户级通过系统调用接口访问内核级;内核级。操作系统自动运行一些功能,它们主要对硬件进行操作

    4.2  进程调度

    任何进程要想占有CPU,从而真正处于执行状态,就必须经由进程调度。进程调度机制主要涉及到调度方式、调度时机和调度策略。

    1. 调度方式

    Linux内核的调度方式基本上采用“抢占式优先级”方式,即当进程在用户模式下运行时,不管是否自愿,在一定条件下(如时间片用完或等待I/O),核心就可以暂时剥夺其运行而调度其它进程进入运行。但是,在2.4及先前的内核中,一旦进程切换到内核模式下运行,就不受以上限制而一直运行下去,直至又回到用户模式之前才会发生进程调度,在2.6引入了内核抢占后,大多数内核模式代码也可以上下文切换,注意:内核代码服务于系统调用运行于所代表用户进程的进程上下文(参见4.1),而中断服务程序则运行于中断上下文。进程上下文和中断上下文互相不联系。运行于进程上下文的内核代码可被抢占,而运行于中断上下文的不可被抢占,一直运行到结束。因此在中断上下文中不能做以下的事情:睡眠或放弃处理器;请求一个mutex;耗时的任务;访问用户空间虚拟内存。

    Linux系统中的调度策略基本上继承了Unix的以优先级为基础的调度。就是说,核心为系统中每个进程计算出一个优先权,该优先权反映了一个进程获得CPU使用权的资格,即高优先权的进程优先得到运行。核心从进程就绪队列中挑选一个优先权最高的进程,为其分配一个CPU时间片,令其投入运行。在运行过程中,当前进程的优先权随时间递减,这样就实现了“负反馈”作用:经过一段时间之后,原来级别较低的进程就相对“提升”了级别,从而有机会得到运行。当所有进程的优先权都变为0时,就重新计算一次所有进程的优先权。

    2. 调度策略

    Linux系统针对不同类别的进程提供了不同的调度策略,即SCHED_FIFO、SCHED_RR及SCHED_OTHER;SCHED_BATCH 批处理和SCHED_IDLE  优先级最低的策略。

    SCHED_FIFO适合于实时进程,它们对时间性要求比较强,而每次运行所需的时间比较短,一旦这种进程被调度开始运行后,就要一直运行到自愿让出CPU,或者被优先权更高的进程抢占其执行权为止。

    SCHED_RR对应“时间片轮转法”,适合于每次运行需要较长时间的实时进程。一个运行进程分配一个时间片(如200毫秒),当时间片用完后,CPU被另外进程抢占,而该进程被送回相同优先级队列的末尾。SCHED_OTHER是传统的Unix调度策略,适合于交互式的分时进程。这类进程的优先权取决于两个因素,一个因素是进程剩余时间配额,如果进程用完了配给的时间,则相应优先权为0;另一个是进程的优先数nice,这是从Unix系统沿袭下来的方法,优先数越小,其优先级越高。

    nice的取值范围是19-20。用户可以利用nice命令设定进程的nice值。但一般用户只能设定正值,从而主动降低其优先级;只有特权用户才能把nice的值置为负数。进程的优先权就是以上二者之和。核心动态调整用户态进程的优先级。这样,一个进程从创建到完成任务后终止,需要经历多次反馈循环。当进程再次被调度运行时,它就从上次断点处开始继续执行。

    时间配额及nice值与实时进程的优先权无关。实时进程的优先权高于其它类型进程的优先权,对于实时进程,其优先权的值是(1000+设定的正值),至少是1000。如果系统中有实时进程处于就绪状态,则非实时进程就不能被调度运行,直至所有实时进程都完成了,非实时进程才有机会占用CPU。

    后台命令(在命令末尾有&符号,如gcc f1.c& )对应后台进程(又称后台作业),后台进程的优先级低于任何交互(前台)进程的优先级。所以,只有当系统中当前不存在可运行的交互进程时,才调度后台进程运行。后台进程往往按批处理方式调度运行。

    3. 调度时机

    核心进行进程调度的时机有以下几种情况:

    (1)当前进程调用系统调用nanosleep( )或pause( )使自己进入睡眠状态,主动让出一段时间的CPU使用权;

    (2)进程终止,永久地放弃对CPU的使用;

    (3)在时钟中断处理程序执行过程中,发现当前进程连续运行的时间过长;

    (4)当唤醒一个睡眠进程时,发现被唤醒的进程比当前进程更有资格运行;

    (5)一个进程通过执行系统调用来改变调度策略或降低自身的优先权(如nice命令),从而引起立即调度。

    4. 调度算法

    进程调度的算法应该比较简单,以便减少频繁调度时的系统开销。Linux执行进程调度时,首先查找所有在就绪队列中的进程,从中选出优先级最高且在内存的一个进程。如果队列中有实时进程,那么实时进程将优先运行。如果最需要运行的进程不是当前进程,那么当前进程就被挂起,并且保存它的现场所涉及的一切机器状态,包括程序计数器和CPU寄存器等,然后为选中的进程恢复运行现场。

    4.3  用户级线程与内核级线程

    在许多类Unix系统中,如Linux、FreeBSD、Solaris等,进程一直都是操作系统内核调用的最小单位,程序开发也都采用多进程模型。后来引入了线程概念,有以下两种概念的线程:

    用户级线程(User-Level Thread,ULT)。由应用进程利用线程库创建和管理,不在内核中实现线程,只在用户态中模拟出多线程,不依赖于操作系统核心,操作系统内核完全不知道多线程的存在。

    内核线线程(Kernel-Level Thread,KLT),又称为内核支持的线程或轻量级进程。是在核心空间实现的,内核为每个线程在核心空间中设置了一个线程控制块,用来登记该线程的线程标识符、寄存器值、状态、优先级等信息,所有对线程的操作,如创建、撤销和切换都是通过系统功能调用由内核中的相应处理程序完成,内核维护进程及线程的上下文切换以及线程切换,类unix系统中一般通过修改进程的实现方式来实现,可以使用不完全的进程创建方式创建共享数据空间的进程,在 Linux下这种系统调用为clone(),而在FreeBSD下它为rfork()。

    5.  常见误区

    5.1  Cpu利用率很高就是cpu资源不够

    出现cpu计数器不在范围时,不一定是由于cpu资源不够,因为其他资源的也会引起,例如内存不够时,cpu会忙内存管理的事,表面上可能是cpu的利用为100%

    6.  参考资料

    http://blogread.cn/it/article/6522?f=hot1

    http://blog.csdn.net/ouyangzhengxuan/article/details/7303562

    http://bbs.csdn.net/topics/360197105

    http://blog.sina.com.cn/s/blog_43adf9fb0100a1t7.html

    http://blog.sina.com.cn/s/blog_5623cddb0100d15g.html

    http://blog.csdn.net/yanglovefeng/article/details/7887939

    http://blog.163.com/erica19881224@126/blog/static/1122326372009116105156793/

    http://oyqiaojin.blog.163.com/blog/static/5945256520132713448262/

  • 相关阅读:
    poj3669 广搜
    检索所有课程都选修的的学生的学号与姓名
    UVA10160 Servicing Stations
    uva11205 The broken pedometer 子集生成
    poj1101 the game 广搜
    poj3009 Curling 2.0 深搜
    poj 1564 Sum It Up 搜索
    HDU 2268 How To Use The Car (数学题)
    codeforces 467C George and Job(简单dp,看了题解抄一遍)
    HDU 2267 How Many People Can Survive(广搜,简单)
  • 原文地址:https://www.cnblogs.com/hfclytze/p/4142102.html
Copyright © 2020-2023  润新知