Linux CPU 性能指标分析

简介

在服务端测试,以及生产环境中,通过需要观察CPU的使用情况,以此作为衡量系统性能的重要指标。对于Linux CPU主要的指标有,利用率,运行队列,负载,上下文切换等,对一个合格的程序员来说了解这些指标是必要的。

CPU使用率

Linux CPU使用率主要是由以下几个维度统计:

  • %usr: 普通进行在用户模式下的执行时间
  • %sys: 进程在内核模式下的执行时间
  • %nice: 被提高优先级的进程在用户模式下的执行时间
  • %idle: 空闲时间
  • %iowait: 等待IO完成的时间
  • %irp: 处理应中断请求花费的时间
  • %soft: 处理软中断请求话费的时间
  • %seal: 是衡量虚拟机CPU的指标,是指分配给本虚拟机的时间片被同一宿主机别的虚拟机占用,一般%steal值较高时,说明宿主机的资源使用已经达到瓶颈

一般情况下,CPU大部分的时间片都是消耗在用户态和内核态上,sys和usr的比例是互相影响的,%sys比例高意味着被测服务频繁的进行用户态和内核态的切换,会带来一定的CPU开销,这样分配给处理业务的时间片就会变少,造成系统性能下降。对于IO密集型的系统,无论是网络IO还是磁盘IO,一般都会产生大量的中断,从而导致%sys相对升高,其中磁盘IO密集型系统,对于磁盘的读写需要占用大量的CPU,会导致%iowait的值一定比例的升高,所以当出现%iowait较高时,需要排查是否存在大量的不合理的日志操作,或者频繁的数据载入等情况。

CPU利用率的详细信息可以用top、vmstat来查看:

  • top
    在这里插入图片描述
  • vmstat
    在这里插入图片描述
  • mpstat:
    在这里插入图片描述
运行队列

当Linux内核要寻找一个新的进程在CPU上运行时,必须只考虑处于可运行状态的进程,(即在TASK_RUNNING状态的进程),因为扫描整个进程链表是相当低效的,所以引入了可运行状态进程的双向循环链表,也叫运行队列(runqueue)。每个CPU或者说每个核都会维持一个运行队列,队列中存放running和runnable两种状态的进程,CPU会不断调度队列中的进程运行,因此队列中的进程数越多,每个进程分配到的时间片就越少,程序的时间也就越长,同时CPU会不断的处于运行状态,性能开销较大。可以通过观察一定时间内运行队列中的进程数来判断CPU是否达到了瓶颈,这就有了负载的概念。

负载

CPU的负载(Load),是指在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU运行队列长度的统计信息。平均负载(Load Average)是指上一段时间内同时处于运行队列的平均进程数,Load Average是反应系统压力的重要指标,Load Average越高说明对于CPU资源的竞争越激烈,CPU资源越短缺。对于资源的申请和维护其实也是需要很大的成本,所以在这种高Average Load的情况下CPU资源的长期“热竞争”也是对硬件的一种损害。
举个例子,把CPU处理进程看作是超市的收银员:

  • 加入有10个收银窗口,而需要结账的顾客只有1个,则这个顾客可以在任意收银台进行结账,而其余9个收银员可以空闲着刷手机,这时的平均负载为0.1,超市的收银操作毫无压力。
  • 如果有10个顾客来结账,每个收银台一个,也都可以迅速完成收银操作,这时的所有收银窗口都在工作,平均负载是1。
  • 如果有20个顾客来结账,这时就会出现排队现象,收银员不停的进行工作,直接排队的人都完成结账操作,这时的平均负载是2,所有的收银台都在运作,而且还出现了排队的情况。

如果是100,200人或者更多的人来结账,这时的收银员就需要不停的工作,为了不把收银员累坏了,就需要增加收银台,也就是扩容。而实际上CPU处理进程的方式并不像收银员一样,处理完一个人进行下一个人,CPU处理每个进程都是有固定的时间片,如果在时间片内这个任务没有被处理完,就要挂起这个任务处理下一个,这时就会产生中断,高负载的情况下会不断产生进程间的调用,从而产生大量中断,造成系统的开销,所以在做系统测试时,要重点关注负载情况,来判断CPU是否达到了瓶颈,依据经验分析,单核CPU负载<2时,系统性能是良好的,单核CPU负载>5时,表明这台机器严重的性能不足。

负载可以通过top,uptime,cat /proc/loadavg等命令查看1分钟,5分钟,15分钟的负载值:

  • top
    在这里插入图片描述
  • uptime
    在这里插入图片描述
  • cat /proc/loadavg
    在这里插入图片描述
上下文切换

一个标准的Linux内核可以支持50~50000个进程运行,对于普通CPU,内核会调度和执行这些进程。每个进程都会分配到CPU的时间片来运行,当一个进程用完时间片或者被更高优先级的进程占用后,它会备份到CPU的运行队列中,同时在其他CPU上运行。这个进程切换的过程被称作上下文切换。Linux具有两个不同级别的运行模式,内核态和用户态,其中内核态的运行级别要高于用户态,这个级别可以进行任何操作,一般内核运行于内核态,而应用程序运行在用户态。当发生上下文切换时,通过系统调用,处于用户态的应用程序就会进入内核空间,待调用完成之后重新返回值用户态运行,因此上下文切换存在系统开销,会一定程度上增加%sys的值。

当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被成为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便于再次执行该进程时,能够回到切换时的状态执行下去。在Linux中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务进程。但同时会保留所有需要用到的资源,以便于中断服务结束时能回复被中断进程的执行。

引起上下文切换的原因有哪些?对于抢占式操作系统而言,大体有几种:

  1. 当前任务的时间片用完之后,系统CPU正常调度下一个任务
  2. 当前任务碰到IO阻塞,调度线程将挂起此任务,继续下一个任务
  3. 多个任务抢占锁资源,当前任务没有抢到,被调度器挂起,继续下一个任务
  4. 用户代码挂起当前任务,让出CPU时间
  5. 硬件中断

vmstat中的cs为中断数量
在这里插入图片描述

中断

中断是指CPU执行程序时,由于发生了某种随机的时件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(成为中断服务程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行。引入中断的原因有以下几点:

  1. 提高数据传输率
  2. 避免了CPU不断检测外设状态的过程,提高了CPU利用率
  3. 实现对特殊事件的实时响应。如多任务操作系统中缺页中断、设备中断、各类异常、实时钟等。

中断根据中断源的不同可以分为硬中断和软中断:

  • 硬中断:硬中断又称外部中断,是由硬件产生,如键盘,鼠标,打印机等。每个设备或设备集都有自己的中断请求(IRQ),基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上,处理中断的驱动是需要在CPU上运行的,因此中断产生时,CPU会中断当前正在运行的任务来处理中断,在多核的操作系统中,中断通常只中断一颗CPU(核)。
  • 软中断:软中断又称为内部中断,由软件系统本身发给操作系统内核的中断信号。通常是由硬中断处理程序或进程调度程序对操作系统内核的中断,也就是我们常说的系统调用(Sysmtem Call)。一般情况下软中断是处理I/O请求时发生订单,这些请求会调用内核中的处理I/O的程序,对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择领一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同。在I/O密集型系统中可能会出现大量的中断请求,中断产生中断上下文,造成CPU开销。

可以通过top,vmstat等查看CPU的相关命令监控中断情况

  • vmstat中的in为中断数量
    在这里插入图片描述
  • mpstat中的%irq%soft分别为硬中断和软中断所占CPU时间片比例
    在这里插入图片描述
负载与CPU利用率的关系

负载和CPU利用率是衡量CPU性能的指标,那么CPU利用率高的化负载一定高吗?要回答这个问题首先要理解CPU资源在什么情况下被消耗,CPU利用率起始是指为了处理进程抢占CPU时间片的比例,也就是只有处于运行状态的进程才会获得时间片,从而造成CPU利用率的上升,而所需CPU时间片的多少取决于进程中需要CPU运算逻辑的复杂程序。而负载是指运行队列中等待和运行的进程数的综合,在负载很高时,可能是处于等待运行的进程数较多,这些进程并不会占用过多的时间片,队列中进程消耗的CPU资源也有可能集中在几个对CPU依赖过高的进程上。所以CPU利用率和负载并没有硬性的比例关联关系,衡量CPU性能时要同事关注两个性能指标关系,综合考虑。

遇到CPU利用率过高时该如何排查

遇到CPU使用率过高时,首先确认CPU是消耗在哪一款,如果是内核态占用CU较高:

  1. %iowait高,这时要重点关注磁盘IO的相关操作,是否存在不合理的写日志操作,数据库操作等。
  2. %soft或%cs高,观察CPU负载是否较高、网卡流量是否较大,代码是否在多线程操作上存在不合适的中断操作等。
  3. %steal高,这种情况一般发生在虚拟机上,这时要查看宿主机是否资源超限
性能指标总结
  1. 对于一个CPU来说,运行队列不要超过2,例如双核CPU不要超过4
  2. 如果CPU在满负荷运行,应该负荷下列分布:
  • User TIme:65%~70%,如果高于此数值考虑对应用程序进程优化
  • System Time: 30%~35%,高于此数值时,观察是否有过多的中断或上下文切
  • Idle: 0%~5%
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值