linux性能优化-cpu

什么是”平均负载”

单位时间内, 系统处于可运行状态和不可终端状态的评价进程数,也就是平均活跃进程数,(和cpu并没有直接关系)

  • 可运行状态: 正在使用cpu或者等待cpu的进程,r状态
  • 不可中断状态: 处于内核态流程装的状态, 并且不可中断,比如常见的硬件等I/O响应,D状态

也就是系统一段时间内运行的进程的数量. 负载的压力程度跟cpu的逻辑个数成正比.

负载多少时比较合理

平均负载最理想的情况是等于cpu的个数,所以提前要知道有多少个cpu
cpu文件: /proc/cpuinfo
grep 'model name' /proc/cpuinfo | wc -l

常用工具

top / uptime 1分钟 5分钟 15分钟的平均负载
iostat / mpstat / pidstat

平均负载与cpu使用率

平均负载包含运行和中断状态, 所以包含了 正在使用cpu的进程,等待cpu和等待io的进程
而cpu使用率, 是单位时间内,cpu繁忙情况的统计,跟平均负载并不完全对应例如:

  • cpu密集型 大量使用cpu 导致平均负载升高
  • io密集型 等待io导致平均负载升高, 但是cpu使用率不一定会升高
  • 大量等待cpu的进程调度也会导致平均负载升高,此时cpu使用率也会比较高(上下文切换)

什么是上下文切换

linux 是一个多任务操作系统, 为了保持多任务运行 所以 要将cpu轮流分配给程序运行,造成了多任务同时运行的错觉.

知识点: cpu寄存器 , 程序计数器

cpu寄存器 cpu内置的内存, 程序计数器 用来存储cpu正在执行指令的位置,或者下一条指令的位置, 他们都是cpu在允许程序前必须依赖的环境, 也就是上下文切换

上下文切换包含: 进程上下文切换 线程上下文切换 中断上下文切换
进程上下文切换: 用户态–> 内核态 —> 用户态 期间通过系统调用完成, 需要 open() —> read() —> write() —> close() , 那么上下文就是 保存用户态,切换内核态,恢复用户态, 一次系统调用 发生两次cpu上下文切换.
进程是由内核来管理和调度的,进程的切换只能发生在内核态, 所以进程的切换不仅包含了 虚拟内存,栈,全局变量,用户空间等资源,还包括了 内核堆栈,寄存器等内核空间的状态
线程上下文切换: 线程共享进程的资源数据, 所以线程切换只需要保存自己的私有数据即可, 所以多线程可以节约上下文切换中消耗的资源

上下文切换

cpu上下文切换常用工具:

  • vmstat 5 #每五秒输出一组数据
  • pidstat -w 5 # 每5秒输出一组数据 -t 显示线程
    • cswch/s : 自愿上下文切换 : 指进程无法获取到所需资源,导致的上下文切换, 比如 io 内存等系统资源不足时 就会发生自愿上下文切换
    • nvcswch/s : 非自愿上下文切换: 由于时间片已到等待时间,被系统强行调度,而发生的上下文切换

cpu使用率

linux 作为一个多任务操作系统, 将每个cpu的时间划分为很短的时间片,再通过调度器分配给各个任务使用,因此造成多个任务同时执行的假象
为了维护cpu时间, linux 通过事先定义的节拍率 (内核中表示为HZ),触发时间中断,并使用全局变量jiffes 记录开机以来的节拍数 每发生一次时间中断,jiffies就加一

不同的系统可能设置不同的数值, 可以设置为 100 250 1000 等, 可以通过 /boot/config 内核选项来查看

1
2
$ grep 'CONFIG_HZ=' /boot/config-$(uname -r)
CONFIG_HZ=250

cpu使用率过高怎么处理

dstat 1 10
perf top
perf recode
perf report

docker里面无法显示进程名,容器外执行perf recode之后 复制data文件到容器内部执行 perf report

cpu 优化思路

  • 怎么评估性能优化的效果
    • 性能指标量化
    • 优化前 vs 优化后 性能指标的对比
  • 多个性能问题时,怎么优化
    • 并不是所有的性能问题都必须优化, 二八原则, 可能80%的问题是由于20%的问题导致,优化前先思考清楚 分析问题,怎么优化才能收益最大化

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!