LINUX性能优化--cpu案例1

上面一篇总结了CPU的使用率,平均负载和上下文切换。
这一篇来一个实际的案例。
安装环境
两台ubuntu18.04虚拟机,配置为8核16G
其中一台安装好docker,执行命令
1 sudo docker build --tag perform_test:1.0 .
2 sudo docker run -itd --cpus=8 -p 4000:4000 perform_test:1.0
3 sudo docker ps -a 输出如下表示成功: 在这里插入图片描述
4 安装perf
用另外一台机器telnet命令: telnet <> 4000
连接成功表示已经成功启动了
在第二台部属jmeter来作测试工具:
1 安装java
sudo apt install openjdk-jdk13
2 命令行启动jmeter
1 进入apache-jmeter/bin
2 ./jemeter.sh -n -t <<上传jemter录制文件的目录>> -l ./log/log.jtl
发现jemter的吞吐量很低
只是一个echo不可能这么低的吞吐的哈。。。
登陆到服务器,按下htop查看
1 查看到cpu已经都打满了

2 查看一下是谁使用了这么多的cpu
pidstat 1 5 在这里插入图片描述

3 可以看到确实是自己的echo服务器使用了100%的cpu,
可以想到现在就是要解决cpu问题,那么可以采用perf分析第一时间分析进程的 CPU 问题
4 perf top命令,类似于 top,能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数,使用界面如下所示
在这里插入图片描述
第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
5 使用命令
perf top -g -p pid
在这里插入图片描述
使用方向键和确认建,找到现在使用cpu最高的是sqrt函数
6 使用
grep sqrt -r
在这里插入图片描述
可以看到现在是做了1000000000次的sqrt计算,肯定会打满cpu,导致吞吐量很低的。
删掉这一段代码,重新打包运行,
7 在运行一下jmeter发现现在的吞吐到了1000,echo服务器那台的cpu基本也没有怎么使用。
这一个案例主要总结了top,pidstat,perf的使用。当确认了cpu是主要问题的时候,可以先采用perf查看是哪个函数的问题,一步一步跟踪解决问题。
代码上传到https://github.com/jaimeyang/perform_test.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章