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 优化
评估指标
- 确定性能的量化指标
- 测试优化前的性能指标
- 测试优化后的性能指标
测试性能的注意
- 避免测试工具干扰应用程序的性能。
- 避免外部环境的变化影响性能指标的评估
多个性能问题同时存在
- 优先优化系统资源达到瓶颈的
- 优先优化那些由瓶颈导致的,性能指标变化幅度最大的问题
如何优化
应用程序优化
- 应用程序优化:排除不必要的工作,保留核心逻辑,减少循环层次、减少递归和内存动态分配等
- 编译器优化
- 算法优化:使用复杂度更低的算法
- 异步处理:将轮询替换为事件通知
- 多线程代替多进程:减少上下文切换成本
- 擅用缓存
系统优化
- CPU绑定:将进程绑定到一个或者多个CPU上,提高CPU缓存的命中率,减少跨CPU调度
- CPU独占:和CPU绑定类似,将CPU分组,通过CPU亲和性机制为其分配进程
- 优先级调整:降低非核心应用的优先级,增高核心应用的优先级。确保核心应用得到优先处理
- 为进程设置资源限制:使用cgroups设置CPU的使用上限,防止某个应用问题,耗尽系统资源
- NUMA(non-uniform memory access):让CPU尽可能只访问本地内存
- 中断负载均衡:把中断处理过程自动负载到多个CPU上
避免过早优化
- 优化会带来一定复杂性,降低可维护性
- 需求并不是一成不变的