CPU监控分析

相关工具

名称 初始安装 说明
uptime 显示系统运行时间和cpu负载情况
top 可以实时动态地查看系统的整体运行情况
htop × top高级版
mpstat × 多核cpu性能分析工具,实时查看每个cpu的性能指标,以及所有cpu的平均指标
vmstat 查看系统的整体使用情况
iostat × 查看cpu和磁盘io使用情况
pidstat × 进程性能分析工具,实时查看cpu、内存、I/O以及上下文切换等性能指标
strace 程序调试工具,用来监察一个应用程序所使用的系统调用
perf × 内置于Linux 内核源码树中的性能剖析(profiling)工具

平均负载

  • 获取cpu平均负载的命令uptime或top,输出格式为:load average: 0.00, 0.11, 0.13,代表了1分钟,5分钟,15分钟内的平均负载(Load Average);

image.png

  • 平均负载:单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和cpu使用率没有直接的关系;
  • 可运行状态的进程:正在使用cpu或者正在等待cpu的进程,也就是ps命令中处于R状态(Running或Runnable)的进程;
  • 不可中断状态的进程:正处于内核态的关键流程中的进程,并且这些进程不可打断,比如常见的等待硬件设备I/O响应,也就是ps命令中处于D状态(Uninterruptible Sleep或Disk Sleep)的进程;
  • 平均负载最理想的情况是等于cpu个数,如果超过cpu个数,则系统出现了过载。

CPU使用率

  • 获取cpu使用率的命令有:top、vmstat、mpstat、iostat;
  • 参数含义:
    • usr(us): 表示用户空间程序的cpu使用率(没有通过nice调度);
    • sys(sy): 表示系统空间的cpu使用率,主要是内核程序;
    • nice(ni): 表示用户空间且通过nice调度过的程序的cpu使用率;
    • idle(id): CPU空闲时间占比;
    • iowait(wa): CPU等待IO占比;
    • irq(hi): CPU处理硬中断占比;
    • soft(si): CPU处理软中断占比;
    • steal(st):虚拟CPU无意识等待系统程序处理另外的虚拟处理器所花费时间的百分比。

image.png
image.png

  • cpu使用率:单位时间内cpu繁忙情况的统计和平均负载并不一定完全对应
    • cpu密集型进程:使用大量cpu会导致平均负载升高,此时cpu使用率也在升高;
    • I/O密集型进程:大量I/O操作的进程,等待I/O会导致平均负载升高,但cpu使用率不一定很高;
    • 大量等待cpu的进程调度也会导致平均负载升高,此时cpu使用率也会比较高。

上下文切换

  • Linux 是一个多任务操作系统,它支持远大于CPU数量的任务同时运行,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将CPU轮流分配给它们,造成多任务同时运行的错觉;
  • 每个任务运行前,CPU都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU寄存器和程序计数器(Program Counter,PC);
    • CPU寄存器,是 CPU 内置的容量小、但速度极快的内存;
    • 程序计数器,则是用来存储CPU正在执行的指令位置、或者即将执行的下一条指令位置。它们都是CPU在运行任何任务前,必须的依赖环境,因此也被叫做CPU上下文。
  • CPU上下文切换,就是先把前一个任务的CPU上下文(也就是CPU寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行;
  • CPU 的上下文切换就可以分为几个不同的场景,也就是进程上下文切换、线程上下文切换以及中断上下文切换;
  • 获取上下文切换的工具:vmstat,pidstat
    • vmstat查看系统总体上下文切换
      • r(Running or Runnable):就绪队列的长度,即,正在运行和等待 CPU 的进程数;
      • b(Blocked):处于不可中断睡眠状态的进程数;
      • cs(context switch):每秒上下文切换次数;
      • in(interrupt):每秒中断次数。
    • image.png
    • pidstat查看进程或线程上下文切换
      • cswch/s:每秒自愿上下文切换次数;指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
      • nvcswch/s:每秒非自愿上下文切换次数。是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换(系统的就绪队列过长,也就是正在运行和等待 CPU 的进程数过多,导致大量上下文切换;而上下文切换又会导致系统 CPU 的占用率升高)。
    • 进程上下文切换

image.png

  • 线程上下文切换

image.png

  • 上下文切换次数多少合理?
    • 每秒上下文切换次数多少才算正常,其实取决于系统本身的CPU性能。如果系统的上下文切换次数比较稳定,那么从数百到一万以内,都应该算是正常。但当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,很可能已经出现了性能问题。实际场景有如下几个:
      • 自愿上下文切换变多,说明进程都在等待资源,可能是发生了 I/O 等其他问题;
      • 非自愿上下文切换变多,说明进程都在被强制调度(都在争抢 CPU),说明CPU成了瓶颈;
      • 中断次数变多,说明CPU被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。

典型用例

  • 负载高+iowait高:通过iostat同时查看cpu和io的情况,一般可能为磁盘性能或者io队列太多导致
  • 负载高+iowait低+user高:通过pidstat查看负载高的进程,然后通过perf分析进程
  • 负载高+iowait低+user低:通过vmstat和pidstat查看cpu上下文切换
posted @ 2022-03-03 08:16  longtds  阅读(146)  评论(0编辑  收藏  举报