zoukankan      html  css  js  c++  java
  • Linux CPU使用率含义及原理

    相关概念

    在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秒。

     

     

     

  • 相关阅读:
    SpringBoot中添加事务
    隐藏样式
    Mybatis配置解析
    题目1064:反序数------玩转小聪明
    题目1063:整数和
    题目1062:分段函数23333333333333
    题目1060:完数VS盈数------这题做得我想骂人
    题目1059:abc----------就喜欢这样的题
    题目1050:完数-----------runtime error的问题
    题目1049:字符串去特定字符
  • 原文地址:https://www.cnblogs.com/aresxin/p/9152127.html
Copyright © 2011-2022 走看看