Linux CPU基本指标


CPU基本指标

平均负载

平均负载是指单位时间内,系统处于可运行状态(Running和Runnable)和不可中断状态(如进行I/O)的平均进程数,也就是平均活跃进程数

瓶颈地

  • CPU密集型进程导致的
  • I/O 繁忙

CPU上下文切换

CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

上下文切换类型:进程上下文切换、线程上下文切换以及中断上下文切换

进程上下文切换

Linux 为每个 CPU 都维护了一个就绪队列,将活跃进程(即正在运行和正在等待CPU的进程)按照优先级和等待 CPU 的时间排序,然后选择最需要 CPU 的进程,也就是优先级最高和等待CPU时间最长的进程来运行。

触发进程调度的一些情景

  • 进程执行完毕
  • 时间片切换
  • 系统资源不足
  • 进程自主挂起
  • 有更高优先级的进程运行时
  • 硬件中断

线程上下文切换

线程上下文切换的情况:

  • 前后两个线程属于不同进程。因为资源不共享,所以切换过程就跟进程上下文切换是一样
  • 前后两个线程属于同一个进程。因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据

中断上下文切换

中断上下文只包括内核态中断服务程序执行所必须的状态,包括CPU寄存器,内核堆栈,硬件终端参数
中断处理比进程进程拥有更高的优先级

软中断

中断处理分为上半部分和下半部分

  • 上半部分对应硬件中断,用来快速处理中断
  • 下半部分对应软中断,用来异步处理上半部分未完成的工作

linux软中断包括网络手法、定时、调度、RCU锁等类型。可有通过/proc/softirqs来查看

工具集

  • uptime:平均负载
  • top/htop:平均负载、运行队列、整体CPU使用率以及每个进程的状态和CPU使用率
  • atop:cpu、内存、磁盘、网络等资源的全面监控
  • vmstat: 系统整体的CPU使用率、上下文切换次数、中断次数、处于运行和不可中断状态的进程数量
  • mpstat:每个CPU的使用率和软中断次数
  • pidstat:查看进程的CPU、内存、I/O及上下文切换指标
  • /proc/softirqs:软中断类型和每个CPU上的累积中断次数
  • /proc/intirqs:硬中断类型和每个CPU上的累积中断次数
  • ps:每个进程的状态和CPU使用率
  • pstree:用树状形式显示所有进程之间的关系
  • dstat:系统整体的CPU使用率
  • sar:系统整体的CPU使用率,包括可配置的历史数据
  • strace:进程的系统调用
  • perf:CPU性能事件剖析。如调用链分析、CPU缓存、CPU调度等
  • execsnoop:监控短时进程

CPU check Flow

cpu_check_flow

CPU 优化

评估指标

  • 确定性能的量化指标
  • 测试优化前的性能指标
  • 测试优化后的性能指标

测试性能的注意

  1. 避免测试工具干扰应用程序的性能。
  2. 避免外部环境的变化影响性能指标的评估

多个性能问题同时存在

  1. 优先优化系统资源达到瓶颈的
  2. 优先优化那些由瓶颈导致的,性能指标变化幅度最大的问题

如何优化

应用程序优化

  • 应用程序优化:排除不必要的工作,保留核心逻辑,减少循环层次、减少递归和内存动态分配等
  • 编译器优化
  • 算法优化:使用复杂度更低的算法
  • 异步处理:将轮询替换为事件通知
  • 多线程代替多进程:减少上下文切换成本
  • 擅用缓存

    系统优化

  • CPU绑定:将进程绑定到一个或者多个CPU上,提高CPU缓存的命中率,减少跨CPU调度
  • CPU独占:和CPU绑定类似,将CPU分组,通过CPU亲和性机制为其分配进程
  • 优先级调整:降低非核心应用的优先级,增高核心应用的优先级。确保核心应用得到优先处理
  • 为进程设置资源限制:使用cgroups设置CPU的使用上限,防止某个应用问题,耗尽系统资源
  • NUMA(non-uniform memory access):让CPU尽可能只访问本地内存
  • 中断负载均衡:把中断处理过程自动负载到多个CPU上

避免过早优化

  • 优化会带来一定复杂性,降低可维护性
  • 需求并不是一成不变的

文章作者: 彭峰
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彭峰 !
  目录