哔前哔言
- 始终践行费曼学习法
- 理解系统知识原理
- 掌握性能分析工具
- 多实践,多思考,多提问
- 仅记录个人的学习记录,欢迎指点纠正
1、什么是CPU使用率
1.1、CPU
CPU使用率:单位时间内CPU使用情况的统计,值以%表示
节拍率:每秒钟的时间中断次数。内核节拍率(HZ,可配置),用户空间节拍率(USER_HZ ,固定不可变)
- Linux使用CPU
Linux 多任务操作系统,将每个CPU时间划分成很短的时间片,再通过调度器轮流分配给各个任务使用 - 维护CPU时间
先定义节拍率,触发时间中断,并使用全局变量Jiffies记录开机以来的节拍数,发生一次中断,Jiffies加1
公式:
- CPU使用率,就是除了空闲时间外的其他时间占总CPU时间的百分比
- 性能工具计算CPU使用率,取间隔一段时间的2次值,计算平均CPU使用率
【注,不同工具的时间间隔可能会不一致,需设置成一致】
1.2、系统CPU和任务统计信息
查询/proc/stat
- 第一行表示所有CPU的累加
- 其他列表示不同场景下CPU的累加节拍数,单位:
USER_HZ
即10ms
2、怎么查看CPU使用率
2.1、top命令
- 显示了系统总体的CPU和内存使用情况,以及各个进程的资源使用情况
- CPU使用率相关指标:
user【us】:用户态的CPU时间,包括guest时间
nice【ni】:低优先级用户态CPU时间,nice可取值范围-20到19,数值越大,优先级反而越低
system【sys】:内核态CPU时间
idle【id】:空闲时间。不包括等待I/O时间
iowait【wa】:等待I/O的CPU时间
irq【hi】:处理硬中断CPU时间
softirq【si】:处理硬中断的CPU时间
steal 【st】:处于虚拟机中,被其他虚拟机占用CPU时间
guest【guest】:运行虚拟机CPU时间
guest nice【gnice】:低优先级运行虚拟机时间
2.2、pidstat命令
- 每个进程CPU使用的详细情况
- 需要关注的内容
%usr:用户态CPU使用率
%system :内核态CPU使用率
%guest:运行虚拟机CPU使用率
%wait:等待CPU使用率
%CPU:总CPU使用率
Average:平均值
没有看到%wait,显示区域太小,在文件最下面
3、CPU使用率过高怎么办?
3.1、perf工具
可分析系统的各种事件和内核性能,还可以分析指定应用程序的性能问题
3.1.1、perf top 采样
需要关注的内容
-
Samples
:采样数 -
event
:事件类型 -
Event count
:事件总数量 -
Overhead
:指该符号的性能事件在所有采用中的比例 -
Shared
:指该函数或指令所在的动态共享对象,如:内核、进程名、动态链接库名等 -
Object
:动态共享对象的类型-
[.]
表示用户空间的可执行程序、或者动态链接库 -
[k]
表示内核空间
-
-
Symbol
:表示符号名,即函数名,当函数未命名时用16进制地址表示
3.1.2、perf record
离线保存系统的性能信息,按Ctrl+C终止采样
3.1.3、perf report
解析perf record
保存的采样信息
4、案例实践
4.1、环境准备
- 机器配置:2CPU,8GB内存
- 预先安装docker,sysstat,perf,ab等工具
4.2、操作分析
在第一台虚拟机上执行下面的命令来运行Nginx和PHP的服务
# docker run --name nginx -p 10000:80 -itd feisky/nginx
# docker run --name phpfpm -itd --network container:nginx feisky/php-fpm
第二个终端使用curl访问http://[VM1的IP]:10000,确认Nginx已经正常启动。你应该可以看到It works!的响应。
测试虚拟机的ip地址192.168.153.132
接着,我们来测试一下,这个Nginx服务的性能。在第二个终端运行下面的ab命令
# 并发10个请求测试Nginx性能,总共测试100个请求
ab -c 10 -n 100 http://192.168.153.132:10000/
在第二个终端,将测试的请求总数增加到 10000
# 并发10个请求测试Nginx性能,总共测试10000个请求
ab -c 10 -n 10000 http://192.168.153.132:10000/
这里可以看到,系统中有几个 php-fpm 进程的 CPU 使用率加起来接近 200%;而每个 CPU 的用户使用率(us)也已经超过了 98%,接近饱和。
这样,我们就可以确认,正是用户空间的 php-fpm 进程,导致 CPU 使用率骤升。
接下来,我们使用perf分析是哪个函数导致
# -g开启调用关系分析,-p指定php-fpm的进程号45943
$ perf top -g -p 45943
拷贝出 Nginx 应用的源码,看看是不是调用了这两个函数
# 停止原来的应用
$ docker rm -f nginx phpfpm
# 运行优化后的应用
$ docker run --name nginx -p 10000:80 -itd feisky/nginx:cpu-fix
$ docker run --name phpfpm -itd --network container:nginx feisky/php-fpm:cpu-fix
附录
1、工具
- 安装docker时,启动docker service一直失败。
使用dockerd命令,可查看具体错误原因
- perf安装:sudo yum install perf
- ab(apache bench) HTTP服务性能测试工具
2、引用
- 《极客时间》Linux性能优化实践
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。