linux 性能优化之CPU性能
一、理解CPU信息:
物理 cpu 数(physical cpu):指主板上实际插入的 cpu 硬件个数(socket)。
#查看物理 cpu 数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
核心(core):一开始,每个物理 cpu 上只有一个核心(a single core),对操作系统而言,也就是同一时刻只能
运行一个进程/线程。 为了提高性能,cpu 厂商开始在单个物理 cpu 上增加核心(实实在在的硬件存在),也就出
现了双核心 cpu(dual-core cpu)以及多核心 cpu(multiple cores),这样一个双核心 cpu 就是同一时刻能够
运行两个进程/线程的。
#每个物理 cpu 中 核心数(core 数):
cat /proc/cpuinfo | grep "cpu cores" | uniq
逻辑 processer: logical processor:是为了提高单个 core 同一时刻能够执行的多线程数的技术。
AMD的SMT,Intel 的HT技术。
总的逻辑 cpu 数 = 物理 cpu 数 * 每颗物理 cpu 的核心数 * 每个核心的超线程数
#总的逻辑 cpu 数(processor 数):
cat /proc/cpuinfo| grep "processor"| wc -l
#查看 cpu 型号:
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
二、什么是平均负载?
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。
可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态
(Running 或 Runnable)的进程。
不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件
设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。
不可中断状态实际上是系统对进程和硬件设备的一种保护机制。
当平均负载高于逻辑 CPU 数量 80% 的时候,你就应该分析排查负载高的问题了。一旦负载过高,就可能导致进程
响应变慢,进而影响服务的正常功能。
平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。但只看平均负载本身,我们并不能直
接发现,到底是哪里出现了瓶颈。所以,在理解平均负载时,也要注意:平均负载高有可能是 CPU 密集型进程导
致的;平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了;当发现负载高的时候,你可以使用
mpstat、pidstat 等工具,辅助分析负载的来源。
分析负载的案例
- 安装 stress 和 sysstat
apt install stress sysstat
CPU 密集型
- stress 施加压力
stress --cpu 1 --timeout 600
- 观察平均负载变化
watch -d uptime
- 观察所有CPU的使用情况
mpstat -P ALL 5
- 按线程观察CPU使用情况
pidstat -u 5 1
io 密集型
- 施加io压力
stress -i 1 --timeout 600
- 观察CPU情况,系统 CPU 使用率升高到了 23.87,而 iowait 高达 67.53%。这说明,平均负载的升高是由于 iowait 的升高。
大量进程场景
- 施加多进程压力,
stress -c 8 --timeout 600
pidstat -u 5 1
会发现每个进程等待CPU的时间为 75%。
CPU 上下文切换
- 每个任务运行前,需要系统事先帮它设置好 CPU 寄存器和程序计数器。
- CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。
- 根据任务的不同,CPU 的上下文切换就可以分为几个不同的场景,也就是进程上下文切换、线程上下文切换以及中断上下文切换