相关概念
在Linux/Unix下,CPU利用率分为用户态、系统态和空闲态,分别表示CPU处于用户态执的时间,系统内核执行的时间,和空闲系统进程执行的时间。
下面是几个与CPU占用率相关的概念。
CPU利用率:CPU的使用情况。
用户时间(User time) :表示CPU执行用户进程的时间,包括nices时间。通常期望用户空间CPU越高越好。
系统时间(System time) :表示CPU在内核运行时间,包括IRQ和softirq时间。系统CPU占用率高,表明系统某部分存在瓶颈。通常值越低越好。
等待时间(Waiting time) :CPU在等待I/O操作完成所花费的时间。系统不应该花费大量时间来等待I/O操作,否则就说明I/O存在瓶颈。
空闲时间(Idle time) :系统处于空闲期,等待进程运行。
Nice时间(Nice time) :系统调整进程优先级所花费的时间。
硬中断处理时间(Hard Irq time) :系统处理硬中断所花费的时间。
软中断处理时间(SoftIrq time) :系统处理软中断中断所花费的时间。
丢失时间(Steal time) :被强制等待(involuntary wait)虚拟CPU的时间,此时hypervisor在为另一个虚拟处理器服务。
top命令看到的CPU占用率信息及各项值含义。
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 99.2%id, 0.5%wa, 0.0%hi, 0.0%si, 0.0%st
us: User time,用户态使用的cpu时间比。CPU一共花了多少比例的时间运行在用户态空间或者说是用户进程(running user space processes)。典型的用户态空间程序有:Shell、数据库、web服务器。
sy: System time,系统态使用的cpu时间比。System的含义与User相似。System表示:CPU花了多少比例的时间在内核空间运行。分配内存、IO操作、创建子进程……都是内核操作。这也表明,当IO操作频繁时,System参数会很高。
ni:
Nice
time,用做nice加权的进程分配的用户态cpu时间比。用户空间进程的CPU的调度优先级,范围为[-20,19]。每个linux进程都有个优先级,优先级高的进程有优先执行的权利,这个叫做pri。进程除了优先级外,还有个优先级的修正值。即比如你原先的优先级是20,然后修正值为-2,那么你最后的进程优先级为18。这个修正值就叫做进程的nice值。
id: Idle time,空闲的cpu时间比。一般而言,idel + user + nice 约等于100%。
wa:
Waiting
time,cpu等待磁盘写入完成时间。在计算机中,读写磁盘的操作远比CPU运行的速度要慢,CPU负载处理数据,而数据一般在磁盘上需要读到内存中才能处理。当CPU发起读写操作后,需要等着磁盘驱动器将数据读入内存,从而导致CPU
在等待的这一段时间内无事可做。CPU处于这种等待状态的时间由Wait参数来衡量。所以如果一台机器看到wa特别高,那么一般说明是磁盘IO出现问题。
hi: Hard Irq time,硬中断消耗时间
si: SoftIrq time,软中断消耗时间
如果程序都没什么问题,那么是没有hi和si的,但是实际上有个硬中断和软中断的概念。比如硬中断,cpu在执行程序的时候,突然外设硬件(比如硬盘出现问题了)机器需要立刻通知cpu进行现场保存工作。这个时候会cpu会出现上下文切换。就是cpu会有一部分时间会被硬中断占用了,这个时间就是hi。相类似,si是软中断的cpu占用时间,软中断是由软件的指令方式触发的。
st:
Steal
time,虚拟机偷取时间。对虚拟机来说的,一台物理是可以虚拟化出几台虚拟机的。在其中一台虚拟机上用top查看发现st不为0,就说明本来有这么多个cpu时间是安排给这个虚拟机的,但是由于某种虚拟技术,把这个cpu时间分配给了其他的虚拟机了。这就叫做偷取。
CPU占用率计算:
Linux CPU占用率计算,都是根据/proc/stat文件内容计算而来。
# more /proc/stat cpu 23977676 8265 27737139 5387873754 2095720 404 650273 0 0 cpu0 12075284 4247 13885851 2693786340 1054213 7 312015 0 0 cpu1 11902391 4018 13851287 2694087414 1041507 396 338257 0 0 intr 7878366837 118 6 0 0 0 0 0 0 0 0 0 31 104 0 0 69 0 0 0 0 0 0 0 0 0 24 0 29360958 0 23446119 0 798059818 13974 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ctxt 51508933575 btime 1501052873 processes 17604072 procs_running 1 procs_blocked 0 softirq 6714836597 0 2060074967 76941 1854616421 18 0 2 584892288 14211110 2200964850
CPU信息,cpu为总的信息,cpu0 ... cpun为各个具体CPU信息
cpu 23977676 8265 27737139 5387873754 2095720 404 650273 0 0
共有9个值(单位:ticks),分别为:
ticks就是系统时钟中断的时间间隔,该值与内核中HZ值有关,即ticks = 1/HZ。
HZ的值,就是每秒的时钟中断数量。可以观察/proc/interrupts中时钟中断值变化,来计算HZ的值。当HZ的值为1000时,ticks的单位即为1/1000秒,即1ms。
User time:23977676 Nice time:8265 System time:27737139 Idle time:5387873754
Waiting time:2095720 HardIrq time:404 SoftIRQ time:650273 Steal time:0 guest time:0
CPU占用率计算公式
CPU时间=user+system+nice+idle+iowait+irq+softirq+Stl +guest
%us=(User time + Nice time)/CPU时间*100%
%sy=(System time + Hard Irq time +SoftIRQ time)/CPU时间*100%
%id=(Idle time)/CPU时间*100%
%ni=(Nice time)/CPU时间*100% %wa=(Waiting time)/CPU时间*100%
%hi=(Hard Irq time)/CPU时间*100%
%si=(SoftIRQ time)/CPU时间*100%
%st=(Steal time)/CPU时间*100%
CPU利用率总节:
(1)Linux CPU占用率是根据/proc/stat文件中的数据计算而来;
(2)/proc/stat中的数据精度为ticks,即1/HZ秒;
(3)内核每个ticks会更新一次CPU使用信息;
(4)CPU占用率的精度为1/HZ秒。