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);
- 平均负载:单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和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无意识等待系统程序处理另外的虚拟处理器所花费时间的百分比。
- 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):每秒中断次数。
- pidstat查看进程或线程上下文切换
- cswch/s:每秒自愿上下文切换次数;指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
- nvcswch/s:每秒非自愿上下文切换次数。是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换(系统的就绪队列过长,也就是正在运行和等待 CPU 的进程数过多,导致大量上下文切换;而上下文切换又会导致系统 CPU 的占用率升高)。
- 进程上下文切换
- vmstat查看系统总体上下文切换
- 线程上下文切换
- 上下文切换次数多少合理?
- 每秒上下文切换次数多少才算正常,其实取决于系统本身的CPU性能。如果系统的上下文切换次数比较稳定,那么从数百到一万以内,都应该算是正常。但当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,很可能已经出现了性能问题。实际场景有如下几个:
- 自愿上下文切换变多,说明进程都在等待资源,可能是发生了 I/O 等其他问题;
- 非自愿上下文切换变多,说明进程都在被强制调度(都在争抢 CPU),说明CPU成了瓶颈;
- 中断次数变多,说明CPU被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。
- 每秒上下文切换次数多少才算正常,其实取决于系统本身的CPU性能。如果系统的上下文切换次数比较稳定,那么从数百到一万以内,都应该算是正常。但当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,很可能已经出现了性能问题。实际场景有如下几个:
典型用例
- 负载高+iowait高:通过iostat同时查看cpu和io的情况,一般可能为磁盘性能或者io队列太多导致
- 负载高+iowait低+user高:通过pidstat查看负载高的进程,然后通过perf分析进程
- 负载高+iowait低+user低:通过vmstat和pidstat查看cpu上下文切换