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

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