1 性能优化-基础
1.1 平均负载概念
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。
它和cpu使用率没有直接关系。
1.2 平均负载实战
- mpstat: 常用多核cpu性能分析工具,用来实时查看cpu性能指标以及cpu的平均指标;
- pidstat:常用进程性能分析工具,用来查看进程的cpu、内存、io以及上下文切换等指标;
1.2.1 cpu密集型进程
#### stress模拟cpu 100%场景
stress --cpu 1 --timeout 600
#### 观测
watch -d uptime
## -P ALL表示监控所有cpu,后面数字5表示间隔5s采集一组数据
mpstat -P ALL 5
## 间隔5s输出一组数据
pidstat -u 5 1
1.2.2 io密集群
#### stress模拟io压力
stress -i 1 --timeout 600
#### 观测
watch -d uptime
## -P ALL表示监控所有cpu,后面数字5表示间隔5s采集一组数据
mpstat -P ALL 5
## 间隔5s输出一组数据
pidstat -u 5 1
1.2.3 大量进程场景
#### stress模拟8个进程
stress -c 8 --timeout 600
#### 观测
watch -d uptime
## -P ALL表示监控所有cpu,后面数字5表示间隔5s采集一组数据
mpstat -P ALL 5
## 间隔5s输出一组数据
pidstat -u 5 1
2 cpu上下文切换
2.1 工作原理
根据任务的不同,cpu的上下文切换可以分为不同的场景:
- 进程上下文切换
- 线程上下文切换
- 中断上下文切换
线程是调度的基本单位,而进程是资源拥有的基本单位;
过多的上下文切换会把cpu的时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程的真正运行时间导致系统的整体性能大幅下降;
2.2 上下文切换定位
2.2.1 vmstat
vmstat是一个常用系统性能分析工具,只要用于分析系统的内存使用情况,也常用来分析cpu上下文切换和中断的次数;如下所示是重点的四列关注内容
- cs(context switch):每秒上下文切换次数。
- in(interrupt)每秒中断的次数。
- r(running or runnable)是就绪队列的长度,也就是正在运行和等待cpu的进程数;
- b(blocked)处于不可中断睡眠状态的进程数。
vmstat只给出系统总体的上下文切换情况,想要查看进程的详细情况需要结合pidstat进行查看。
2.2.2 pidstat
- cswch:自愿上下文切换,是指进程无法获取所需自愿,导致的上下文切换。
- Nvcswch:非自愿上下文切换,指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。
fwd@fwd:~$ pidstat -w 5
Linux 5.3.0-55-generic (fwd) 2020年06月29日 _x86_64_ (4 CPU)
16时32分01秒 UID PID cswch/s nvcswch/s Command
16时32分06秒 0 1 0.20 0.00 systemd
16时32分06秒 0 11 20.52 0.00 rcu_sched
16时32分06秒 0 12 0.20 0.00 migration/0
16时32分06秒 0 17 0.40 0.00 migration/1
16时32分06秒 0 23 0.40 0.00 migration/2
16时32分06秒 0 29 0.40 0.00 migration/3
16时32分06秒 0 42 0.20 0.00 khugepaged
16时32分06秒 0 276 0.40 0.00 kworker/3:1H-kblockd
16时32分06秒 0 277 0.20 0.00 kworker/1:1H-kblockd
2.3 使用sysbench模拟器线程调度切换问题
sysbench是一个多线程的基准测试工具,一般用来评估不同系统参数下的数据库负载情况。
本次案例中,把它当做一个异常进程来看,作用是模拟上下文切换过多的问题。
安装工具如下所示:
sudo apt install sysbench sysstat
相关参考指令如下所示:
#### 间隔1s输出一组数据
vmstat 1 1
#### 以10个线程运行5分钟的基准测试,模拟多线程切换问题
sysbench --threads=10 --max-time=300 threads run
#### -wt输出线程的上下文切换指标
pidstat -wt 1
pidstat只是一个进程的性能分析工具,并不提供任何关于中断的详细信息,怎样才能知道中断发生的类型呢?
通过/proc/interrupts这个只读文件中读取。
/proc实际上是linux的一个虚拟文件系统,用于内核空间与用户空间之间的通信。
/proc/interrupts就是这种通信机制的一部分,提供了一个只读的中断使用情况。
使用如下命令进行观测:
watch -d cat /proc/interrupts
通过观察可以发现重调度中断RES变化速度最快,这个中断类型表示,唤醒空闲状态的cpu来调度新的任务运行。这是多处理系统SMP中,调度器用来分散任务到不同cpu的机制,通常也被成为处理器中断(Inter-processor Interrups,IPI)
这里的中断升高还是因为过多任务的调度问题,和前面提到的上下文切换次数的分析一致。
2.4 上下文切换分析
上下文切换次数根据系统本身的cpu性能决定。如果系统的上下文切换次数较为稳定,那么从数百到一万以内,都应该算是正常的。但当上下文切换次数超过一万次,或者切换次数发生数量级的增长,就可能出现了性能问题。
- 自愿上下文切换变多了,说明进程都在等待资源,可能发生了io等其他问题;
- 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢cpu,说明cpu确实成为瓶颈了。
3 cpu 100%处理
3.1 cpu使用率
cpu使用率是单位时间内cpu使用情况的统计,以百分比的方式展示。
为了维护cpu时间,linux通过事先定义的节拍率(内核中表示HZ),触发时间中断,并使用全局变量jiffies记录卡机以来的节拍数。没发生一次中断,Jiffies的值就+1.
fwd@fwd:~$ uname -r
5.3.0-55-generic
fwd@fwd:~$ grep 'CONFIG_HZ=' /boot/config-$(uname -r)
CONFIG_HZ=250
linux通过/proc虚拟文件系统,想用户空间提供了系统内部状态的信息,而/proc/stat提供的就是系统的cpu和任务统计信息。比方说,如果你只关注cpu的话,可以执行下面的命令:
3.2 perf明确cpu占用过高函数
安装过程:
ubuntu的两种安装方式链接
#### ubuntu安装
sudo apt install linux-source
##到指定目录执行如下图所示命令 make; make install
#### centos安装
yum install perf
常用操作函数:
#### 简单查看
perf top
#### 指定具体进程 -g开启调用关系分析 -p指定进程号
perf top -g -p 7420
#### 录制数据
perf record
#### 播放录制
perf report