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/

性能分析_linux服务器CPU_CPU利用率的更多相关文章

  1. 性能分析_linux服务器CPU_中断

    中断 1.  指标范围 1.1  Interrupt rate 应该与cpu利用率结合分析,如果cpu利用率在合理范围内,大量的中断也是可以接受的.一个巨大的中断值,同时伴随着缓慢的系统性能表现,指示 ...

  2. 性能分析Linux服务器CPU利用率

    CPU度量 1.  指标范围 1.1  User mode CPU utilization+ System mode CPU utilization 合理值:60-85%,如果在一个多用户系统中us+ ...

  3. 性能分析_linux服务器CPU_Load Average

    CPU度量Load Average 1.  概念介绍 1.1  Linux系统进程状态 在linux中,process有以下状态: runnable (就绪状态):blocked waiting fo ...

  4. 性能分析Linux服务器CPU利用率(转)

    1.  指标范围 1.1  User mode CPU utilization+ System mode CPU utilization 合理值:60-85%,如果在一个多用户系统中us+sy时间超过 ...

  5. 性能分析 | Java服务器内存过高&CPU过高问题排查

    一.内存过高 1.内存过高一般有两种情况:内存溢出和内存泄漏 (1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报错 (2)内存泄漏:不再使用的对象一直占据着内存不释 ...

  6. 1.linux服务器的性能分析与优化

    [教程主题]:1.linux服务器的性能分析与优化 [课程录制]: 创E [主要内容] [1]影响Linux服务器性能的因素 操作系统级 CPU 目前大部分CPU在同一时间只能运行一个线程,超线程的处 ...

  7. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  8. Linux服务器性能分析与调优

    一 linux服务器性能查看 1.1 cpu性能查看 1.查看物理cpu个数: cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc ...

  9. linux服务器的性能分析与优化(十三)

    [教程主题]:1.linux服务器的性能分析与优化 [主要内容] [1]影响Linux服务器性能的因素 操作系统级 Ø CPU 目前大部分CPU在同一时间只能运行一个线程,超线程的处理器可以在同一时间 ...

随机推荐

  1. Android开发——代码中实现WAP方式联网

    ,移动和联通的WAP代理服务器都是10.0.0.172,电信的WAP代理服务器是10.0.0.200. 在Android系统中,对于获取手机的APN设置,需要通过ContentProvider来进行数 ...

  2. 【BZOJ3555】企鹅QQ

    蛤希. 用map会T. 只需要枚举删掉哪个字符,然后算出每个的hash值,sort一遍就行了. 用map会T!!! // It is made by XZZ #include<cstdio> ...

  3. AFO预定

    妈耶 数论题都不会 推不出式子 题解都看不懂 还是思维jiang化了 布星了 吃枣药丸 祝yyb进队 祝zsy进队 祝鸡贼进队

  4. JDBC连接数据库及其执行操作

    作者:Alvin 功能:数据库连接与实现增删改查 时间:2019年3月4日08点33分 参考文章:https://www.2cto.com/database/201805/743741.html 一. ...

  5. 北美KubeCon新风,正把K8S魔力带向边缘计算

    作者:DJ 审校:Kevin·Wang 1. 容器生态圈新的创新方向 2018年容器技术圈的年终盛典北美KubeCon终于在西雅图落下了帷幕.这次北美KubeCon总共吸引了8000多观众参会,创下历 ...

  6. windows下安装Mongodb_4.0.6最新版及常用命令

    今天下载了最新版Mongodb进行安装,发现相比较于以前,方便了很多,直接下载: 一.下载地址:https://www.mongodb.com/download-center/enterprise 二 ...

  7. 零基础学python之入门和列表数据(附详细的代码解释和执行结果截图)

    Python学习笔记 1 快速入门 下载安装好Python之后,在开始找到 双击打开一个窗口,这是一个shell界面编辑窗口,点击左上角的file——new file新建一个窗口,这里可以输入完整的代 ...

  8. SQL Server上DBLINK的创建,其实很简单!(上)

    今天给大家来分享一下跨服务器操作数据库,还是以SQL Server的管理工具(SSMS)为平台进行操作. 什么是跨服务器操作? 跨服务器操作就是可以在本地连接到远程服务器上的数据库,可以在对方的数据库 ...

  9. Mysql数据库的隔离级别

    Mysql数据库的隔离级别有四种 1.read umcommitted   读未提交(当前事务可以读取其他事务没提交的数据,会读取到脏数据) 2.read committed 读已提交(当前事务不能读 ...

  10. Gdiplus的使用

    使用步骤: 1.包括相应的头文件及引入相应的lib #include <GdiPlus.h> #pragma comment(lib, "gdiplus.lib") u ...