性能分析Linux服务器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等待⽽的线程数量,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操作上的总时间,与ed相似。
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运⾏实时进程。⼀个进程可以在⽤户⽅式下执⾏,也可以在系统(内核)⽅式下执⾏,当⼀个进程在内核代码中运⾏时,我们称其处于内核态;当⼀个进程正在执⾏⽤户⾃⼰的代码时,我们称其处于⽤户态,在⽤户⽅式下执⾏时,进程在它⾃⼰的应⽤代码中执⾏,不需要内核资源来进⾏计算、管理内存或设置变量
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主要包括: 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),核⼼就可以暂时剥夺其运⾏⽽调度其它进程进⼊运⾏。但是,⼀旦进程切换到内核模式下运⾏,就不受以上限制⽽⼀直运⾏下去,直⾄⼜回到⽤户模式之前才会发⽣进程调度。
Linux系统中的调度策略基本上继承了Unix的以优先级为基础的调度。就是说,核⼼为系统中每个进程计算出⼀个优先权,该优先权反映了⼀个进程获得CPU使⽤权的资格,即⾼优先权的进程优先得到运⾏。核⼼从进程就绪队列中挑选⼀个优先权最⾼的进程,为其分配⼀个CPU时间⽚,令其投⼊运⾏。在运⾏过程中,当前进程的优先权随时间递减,这样就实现了“负反馈”作⽤:经过⼀段时间之后,原来级别较低的进程就相对“提升”了级别,从⽽有机会得到运⾏。当所有进程的优先权都变为0时,就重新计算⼀次所有进程的优先权。
2.调度策略
Linux系统针对不同类别的进程提供了三种不同的调度策略,即SCHED_FIFO、SCHED_RR及SCHED_OTHER。
SCHED_FIFO适合于实时进程,它们对时间性要求⽐较强,⽽每次运⾏所需的时间⽐较短,⼀旦这种进程被调度开始运⾏后,就要⼀直运⾏到⾃愿让出CPU,或者被优先权更⾼的进程抢占其执⾏权为⽌。
SCHED_RR对应“时间⽚轮转法”,适合于每次运⾏需要较长时间的实时进程。⼀个运⾏进程分配⼀个时间⽚(如200毫秒),当时间⽚⽤完后,CPU被另外进程抢占,⽽该进程被送回相同优先级队列的末尾。SCHED_OTHER是传统的Unix调度策略,适合于交互式的分时进程。这类进程的优先权取决于两
个因素,⼀个因素是进程剩余时间配额,如果进程⽤完了配给的时间,则相应优先权为0;另⼀个是进程的优先数nice,这是从Unix系统沿袭下来的⽅法,优先数越⼩,其优先级越⾼。
nice的取值范围是19-20。⽤户可以利⽤nice命令设定进程的nice值。但⼀般⽤户只能设定正值,从⽽主动降低其优先级;只有特权⽤户才
能把nice的值置为负数。进程的优先权就是以上⼆者之和。核⼼动态调整⽤户态进程的优先级。这样,⼀个进程从创建到完成任务后终⽌,需要经历多次反馈循环。当进程再次被调度运⾏时,它就从上次断点处开始继续执⾏。对于实时进程,其优先权的值是(1000+设定的正值),因此,⾄少是1000。所以,实时进程的优先权⾼于其它类型进程的优先权。另外,时间配额及nice值与实时进程的优先权⽆关。如果系统中有实时进程处于就绪状态,则⾮实时进程就不能被调度运⾏,直⾄所有实时进程都完成了,⾮实时进程才有机会占⽤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),⼜称为内核⽀持的线程或轻量级进程。是在核⼼空间实现的,内核为每个线程在核⼼空间中设置了⼀个线程控制块,⽤来登记该线程的线程标识符、值、状态、优先级等信息,所有对线程的操作,如创建、撤销和切换都是通过系统功能调⽤由内核中的相应处理完成,内核维护进程及线程的上下⽂切换以及线程切换,类系统中⼀般通过修改进程的实现⽅式来实现,可以使⽤不完全的进程创建⽅式创建共享数据空间的进程,在 Linux下这种系统调⽤为clone(),⽽在FreeBSD下它为rfork()。
5.  常见误区
5.1  Cpu利⽤率很⾼就是cpu资源不够
出现cpu计数器不在范围时,不⼀定是由于cpu资源不够,因为其他资源的也会引起,例如内存不够时,
cpu会忙内存管理的事,表⾯上可能是cpu的利⽤为100%
免费永久的linux服务器

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。