cpu基础
# 平均负载
# 查看cpu核心数
grep 'model name' /proc/cpuinfo | wc -l #查看cpu核心数
uptime # 过去1,5,15分钟的平均负载,有了 CPU 个数,当平均负载比 CPU 个数还大的时候,系统已经出现了过载。
top
2
3
平均负载其实就是平均活跃进程数。平均活跃进程数,直观上的理解就是单位时间内的活跃进程数,但它实际上是活跃进程数的指数衰减平均值。
有了 CPU 个数,当平均负载比 CPU 个数还大的时候,系统已经出现了过载。
假设我们在一个单 CPU 系统上看到平均负载为 1.73,0.60,7.98,那么说明:
- 在过去 1 分钟内,系统有 73% 的超载
- 而在 15 分钟内,有 698% 的超载
- 从整体趋势来看,系统的负载在降低。
当平均负载高于 CPU 数量 70% 的时候,你就应该分析排查负载高的问题了。 即 CPU 个数+0.7
# cpu使用率
平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数,包括了:
- 正在使用 CPU 的进程
- 等待 CPU 和等待 I/O 的进程
平均负载跟CPU 使用率没有直接的对应关系:
- 比如:CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
- I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
- 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。
# CPU分析工具
预先安装:
stress Linux 系统压力测试工具
sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能,包含了mpstat,pidstat
iostat
mpstat 多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。
pidstat 常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。
# 压测场景模拟
# CPU 密集型进程
stress --cpu 1 --timeout 600 # 模拟一个cpu持续600秒使用率100%
watch -d uptime # 在第二个终端执行,-d 参数表示高亮显示变化的区域
mpstat -P ALL 5 # 在第三个终端执行,-P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据
pidstat -u 5 1 # 查看到底是哪个进程导致了 CPU 使用率为 100%
2
3
4
5
从终端二中可以看到,1 分钟的平均负载会慢慢增加到 1.00,而从终端三中还可以看到,正好有一个 CPU 的使用率为 100%,但它的 iowait 只有 0。这说明,平均负载的升高正是由于 CPU 使用率为 100% 。
# I/O 密集型进程
stress -i 1 --timeout 600 # 模拟io压力持续600秒
watch -d uptime # 在第二个终端执行,-d 参数表示高亮显示变化的区域
mpstat -P ALL 5 # 在第三个终端执行,-P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据
pidstat -u 5 1 # 查看到底是哪个进程导致 iowait 这么高
2
3
4
5
从这里可以看到,1 分钟的平均负载会慢慢增加到 1.06,其中一个 CPU 的系统 CPU 使用率升高到了 23.87,而 iowait 高达 67.53%。这说明,平均负载的升高是由于 iowait 的升高。
# 大量进程的场景
stress -c 8 --timeout 600 # 模拟8个进程持续600秒
watch -d uptime # 在第二个终端执行,-d 参数表示高亮显示变化的区域
mpstat -P ALL 5 # 在第三个终端执行,-P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据
pidstat -u 5 1 # 查看到底是哪个进程导致 iowait 这么高
2
3
4
5
可以看出,8 个进程在争抢 2 个 CPU,每个进程等待 CPU 的时间(也就是代码块中的 %wait 列)高达 75%。这些超出 CPU 计算能力的进程,最终导致 CPU 过载。
# CPU上下文
下面两个都是 CPU 在运行任何任务前,必须的依赖环境,因此也被叫做 CPU 上下文。
- CPU 寄存器:是 CPU 内置的容量小、但速度极快的内存。
- 程序计数器:则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。
# 上下文切换
- ,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来
- 然后加载新任务的上下文到这些寄存器和程序计数器
- 最后再跳转到程序计数器所指的新位置,运行新任务