自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

新聞 開(kāi)發(fā)工具
在我們開(kāi)發(fā)過(guò)程中,無(wú)法避免的會(huì)出現(xiàn)所謂的垃圾代碼,導(dǎo)致服務(wù)器的CPU一直處于100%。但我們應(yīng)用已經(jīng)上線,導(dǎo)致服務(wù)器CPU居高,但又不知道哪邊出現(xiàn)的問(wèn)題,我們應(yīng)該怎么去找出哪邊的代碼出現(xiàn)問(wèn)題呢?今天老顧就介紹幾種工具去快速定位。

[[319506]]

前言

在我們開(kāi)發(fā)過(guò)程中,無(wú)法避免的會(huì)出現(xiàn)所謂的垃圾代碼,導(dǎo)致服務(wù)器的CPU一直處于100%。但我們應(yīng)用已經(jīng)上線,導(dǎo)致服務(wù)器CPU居高,但又不知道哪邊出現(xiàn)的問(wèn)題,我們應(yīng)該怎么去找出哪邊的代碼出現(xiàn)問(wèn)題呢?今天老顧就介紹幾種工具去快速定位。

演示代碼

我們先來(lái)編寫(xiě)一下代碼,新建springboot的maven項(xiàng)目,創(chuàng)建web服務(wù),引入SpringBoot內(nèi)置web容器,pom.xml關(guān)鍵引用jar包如下:

  1. <pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; word-wrap: break-word !important; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.544px; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background: rgb(27, 25, 24); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;"
  2.  
  3. 1.  `<dependency>` 
  4.  
  5. 2.  `<groupId>org.springframework.boot</groupId>` 
  6.  
  7. 3.  `<artifactId>spring-boot-starter-web</artifactId>` 
  8.  
  9. 4.  `</dependency>` 
  10.  
  11. </pre> 

創(chuàng)建service:TestWhile

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

創(chuàng)建Controller:TestWhile

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

配置文件application.properties

  1. <pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; word-wrap: break-word !important; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.544px; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background: rgb(27, 25, 24); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;"
  2.  
  3. 1.  `server.port=80
  4.  
  5. 2.  `server.servlet.context-path=/api` 
  6.  
  7. </pre> 

打包項(xiàng)目,上傳測(cè)試服務(wù)器

  1. <pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; word-wrap: break-word !important; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.544px; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background: rgb(27, 25, 24); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;"
  2.  
  3. 1.  `java -jar demo-0.0.1-SNAPSHOT.jar &` 
  4.  
  5. </pre> 

打開(kāi)瀏覽器,訪問(wèn)死循環(huán)方法

打開(kāi)瀏覽器,地址欄輸入http://xxxx/api/user/testWhile?size=2 返回“Hello 程序執(zhí)行完畢”,說(shuō)明調(diào)用成功。(開(kāi)啟了2個(gè)死循環(huán))

到此問(wèn)題代碼,已經(jīng)在服務(wù)器上面跑了。我們發(fā)現(xiàn)服務(wù)器報(bào)警,于是去線上排查。

原生方法

此方法無(wú)需額外安裝工具,在沒(méi)法連接互聯(lián)網(wǎng)的情況下使用此方法排查效果較好。

top、printf都是Linux原生命令,jstack、jstat是jdk自帶命令工具。

很多功能強(qiáng)大的Linux和java診斷工具也是以top、jstack、jstat為基礎(chǔ)命令做的封裝。

注意:jstack、jstat等命令需要jdk完整安裝,linux自帶的openJdk一般無(wú)此工具,可以在java的bin目錄下查看是否有這些命令。

找到最耗CPU的進(jìn)程

命令:top –c,顯示進(jìn)程運(yùn)行信息列表

實(shí)例:top -c。

交互1:按1,數(shù)字1,顯示多核CPU信息。交互2:鍵入P (大寫(xiě)p),進(jìn)程按照CPU使用率排序

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題
干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

我們看出了雙核CPU使用率已經(jīng)達(dá)到100%。

而第一個(gè)進(jìn)程PID是373的就是我們要找的罪魁禍?zhǔn)琢耍豢梢钥吹竭M(jìn)程最后一列,COMMAND注釋的進(jìn)程名:“java -jar demo-0.0.1-SNAPSHOT.jar”。

找到最耗CPU的線程

命令:top -H -p 【PID】,顯示一個(gè)進(jìn)程的線程運(yùn)行信息列表

實(shí)例:top -Hp 373 ,如下圖所示,可以看到多個(gè)高耗CPU使用率的線程

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

轉(zhuǎn)換線程PID為16進(jìn)制

命令:printf “%x\n” 【線程pid】,轉(zhuǎn)換多個(gè)線程數(shù)字為十六進(jìn)制,第4步使用時(shí)前面加0x。

實(shí)例:printf '%x\n' 406 405 375 376,得到結(jié)果196、195、177、178;如下圖所示:

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

查看堆棧,定位線程

命令:jstack 【進(jìn)程PID】| grep 【線程轉(zhuǎn)換后十六進(jìn)制】-A10 , 使用jstack獲取進(jìn)程PID堆棧,利用grep定位線程id,打印后續(xù)10行信息。

實(shí)例:jstack 373 | grep '0x196' -A10,如下圖所示:

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

我們通過(guò)查看堆棧信息,發(fā)現(xiàn)了問(wèn)題是TestWhile.whileTrue引起的;

而且發(fā)現(xiàn)有2個(gè)GC線程,看上圖中的“GC task thread#0 (ParallelGC)”,代表垃圾回收線程,該線程會(huì)負(fù)責(zé)進(jìn)行垃圾回收

存儲(chǔ)堆棧,批量查看

查看堆棧信息,我們也可以換個(gè)方法查看,可以先將jstack堆棧信息存儲(chǔ)起來(lái)。

命令:jstack 【進(jìn)程PID】> 【文件】

實(shí)例:jstack 373 > demo.dump,存儲(chǔ)373進(jìn)程的堆棧信息。

再使用cat + grep查找看看后面幾個(gè)高CPU線程的堆棧信息。

實(shí)例:cat -n demo.dump | grep -A10 '0x196',如下圖所示:

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

可以看到線程0x196【線程196】產(chǎn)生堆棧信息,直指方法whileTrue。

GC查看

我們看到上圖中有4個(gè)線程中的2個(gè)線程沒(méi)有看到j(luò)ava代碼,而是GC task thread#0 (ParallelGC),這個(gè)是GC垃圾回收的線程,是不是死循環(huán)導(dǎo)致了GC太頻繁,導(dǎo)致CPU使用率居高不下呢?

我們使用jstat看下jvm的GC信息看看。

命令:jstat -gcutil 【進(jìn)程PID】【毫秒】【打印次數(shù)】

實(shí)例:jstat -gcutil 373 2000 5,查看373進(jìn)程的GC信息,每2秒打印一次,共打印5次,如下圖所示:

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

S0:幸存1區(qū)當(dāng)前使用比例 S1:幸存2區(qū)當(dāng)前使用比例 E:伊甸園區(qū)使用比例 O:老年代使用比例 M:元數(shù)據(jù)區(qū)使用比例 CCS:壓縮使用比例 YGC:年輕代垃圾回收次數(shù) FGC:老年代垃圾回收次數(shù) FGCT:老年代垃圾回收消耗時(shí)間 GCT:垃圾回收消耗總時(shí)間

上面的原生方法查找要遵循一定的步驟,相對(duì)有些麻煩點(diǎn),有沒(méi)有比較簡(jiǎn)單的方法呢?往下看

Arthas(阿爾薩斯)

Arthas(阿爾薩斯)是阿里巴巴開(kāi)源出來(lái)的一個(gè)針對(duì) java 的線上診斷工具,功能非常強(qiáng)大。Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同時(shí)提供豐富的 Tab 自動(dòng)補(bǔ)全功能,進(jìn)一步方便進(jìn)行問(wèn)題的定位和診斷。我們來(lái)看看

下載Arthas

1使用arthas-boot(推薦)

下載arthas-boot.jar,然后用java -jar的方式啟動(dòng):

  1. <pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; word-wrap: break-word !important; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.544px; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background: rgb(27, 25, 24); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;"
  2.  
  3. 1.  `curl -O https://alibaba.github.io/arthas/arthas-boot.jar` 
  4.  
  5. 2.  `java -jar arthas-boot.jar` 
  6.  
  7. </pre> 
干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

按1進(jìn)入java進(jìn)程,此時(shí)java進(jìn)程PID已經(jīng)變成373

進(jìn)入阿爾薩斯完成,如下圖,可以看到登錄路徑已經(jīng)變成了[arthas@17376]$,可以輸入dashboard,進(jìn)入監(jiān)控頁(yè)面了。

監(jiān)控查看

已經(jīng)進(jìn)入Arthas操作界面,輸入dashboard,回車(chē)后將看到線程及堆棧信息,如圖所示,arthas已經(jīng)將cpu高使用率的線程給安排上了。

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

上面我們就看到有2個(gè)線程居高不下,還有GC的數(shù)量和耗時(shí)。

thread【ID】查看線程

ctrl + c 退出dashboard界面,輸入thread 32查看線程信息,如下圖所示:

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

可以看到是TestWhile類(lèi)中的whileTrue方法中的put方法導(dǎo)致cpu使用率升高。

問(wèn)題一下子就出來(lái)了,Arthas功能不單單止于此,可以直接反編譯,看看代碼。

jad反編譯

使用Arthas自帶的反編譯方法jad,輸入命令:

  • jad com.rainbow.demo.service.TestWhile*

可以反編譯java的class查看問(wèn)題函數(shù)的具體代碼,如下圖所示:

干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

退出arthas

最后,既然問(wèn)題已經(jīng)找到,那就退出Arthas吧。輸入命令:quit

Arthas的功能是非常強(qiáng)大的,這里就簡(jiǎn)單介紹,下一次老顧用專(zhuān)門(mén)的文章介紹

老顧在介紹一個(gè)更簡(jiǎn)單的一個(gè)腳本,立刻發(fā)現(xiàn)問(wèn)題所在

show-busy-java-threads

show-busy-java-threads.sh這個(gè)工具是useful-scripts工具集的其中一個(gè)工具。

show-busy-java-threads用于快速排查Java的CPU性能問(wèn)題(top us值過(guò)高),自動(dòng)查出運(yùn)行的Java進(jìn)程中消耗CPU多的線程,并打印出其線程棧,從而確定導(dǎo)致性能問(wèn)題的方法調(diào)用。

注意:此工具的核心還是使用jdk的jstack方法,只是在其上做了封裝展示。

下載到當(dāng)前目錄下

下載地址:https://github.com/oldratlee/useful-scripts/releases

在bin下面有很多工具,我們這次只要show-busy-java-threads.sh

上傳show-busy-java-threads腳本到服務(wù)器

一定賦予執(zhí)行權(quán)限

chmod +x show-busy-java-threads

直接運(yùn)行

  1. <pre style="margin: 0px; padding: 8px 0px 6px; max-width: 100%; box-sizing: border-box; word-wrap: break-word !important; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: 0.544px; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background: rgb(27, 25, 24); border-radius: 0px; overflow-y: auto; color: rgb(80, 97, 109); text-align: start; font-size: 10px; line-height: 12px; font-family: consolas, menlo, courier, monospace, "Microsoft Yahei" !important; border-width: 1px !important; border-style: solid !important; border-color: rgb(226, 226, 226) !important;"
  2.  
  3. 1.  `./show-busy-java-threads ` 
  4.  
  5. </pre> 
干貨分享:一文教你如何利用阿里開(kāi)源工具,排查線上CPU居高問(wèn)題

如下圖所示,找到了CPU使用率前5高的線程,查找非常迅速。

從前面兩個(gè)線程可以看出,與使用原生工具(jstack)看到的一樣。

其他命令

與Arthas一樣,show-busy-java-threads也有一些其他很好用的增強(qiáng)命令:

show-busy-java-threads

從所有的 Java進(jìn)程中找出最消耗CPU的線程(缺省5個(gè)),打印出其線程棧。

show-busy-java-threads -c 3

-c 3:3為n,指定顯示最耗cpu使用率前3的線程。

show-busy-java-threads -c 3 -p 17376

展示進(jìn)程17376耗費(fèi)CPU組多的3個(gè)線程;

-p 17376 :17376為進(jìn)程PID,-p參數(shù)指定進(jìn)程PID。

show-busy-java-threads -s 【指定jstack命令的全路徑】

對(duì)于sudo方式的運(yùn)行,JAVAHOME環(huán)境變量不能傳遞給root,而root用戶(hù)往往沒(méi)有配置JAVAHOME且不方便配置,顯式指定jstack命令的路徑就反而顯得更方便了

show-busy-java-threads -a yao.log

將輸出結(jié)果導(dǎo)入到指定文件yao.log中

show-busy-java-threads 3 5

每5秒執(zhí)行一次,一共執(zhí)行3次;缺省執(zhí)行一次,缺省間隔是3秒

總結(jié)

今天老顧介紹了3中方法排查服務(wù)器CPU負(fù)載過(guò)高的情況,主要流程是:

1、查看CPU負(fù)載過(guò)高進(jìn)程。

2、查看進(jìn)程中負(fù)載高的線程。

3、獲取進(jìn)程中的堆棧信息。

4、獲取堆棧中對(duì)應(yīng)的線程信息,找到里面的問(wèn)題方法。

在排查過(guò)程中我們不只使用了原生工具,還使用了增強(qiáng)工具Arthas與show-busy-java-threads,大大簡(jiǎn)化了我們排查的步驟。

其實(shí)增強(qiáng)工具無(wú)非就是在原生方法上面封裝了而已,有很多這種工具都是在原生方法中封裝而成。今天就介紹到這里,謝謝?。?!

責(zé)任編輯:張燕妮 來(lái)源: 今日頭條
相關(guān)推薦

2024-11-20 16:12:31

Python圖像處理計(jì)算機(jī)視覺(jué)

2024-11-20 16:42:03

Python科學(xué)計(jì)算

2024-12-19 15:00:00

數(shù)據(jù)清洗Python

2021-12-07 06:02:15

Redis Docker運(yùn)維

2024-11-18 17:16:18

Python性能優(yōu)化編程

2023-12-27 07:40:43

HTTP服務(wù)器負(fù)載均衡

2022-02-20 09:56:28

TCPIP網(wǎng)絡(luò)協(xié)議

2023-07-31 21:56:54

哨兵系統(tǒng)redis

2022-09-05 07:32:46

mock數(shù)據(jù)Stream

2019-07-23 07:30:16

2023-05-11 08:26:56

2021-01-15 13:18:39

數(shù)據(jù)模型領(lǐng)域模型代碼

2020-12-22 10:02:53

ZabbixMySQL數(shù)據(jù)庫(kù)

2017-09-04 14:46:10

分布式事務(wù)問(wèn)題

2021-08-10 05:49:10

網(wǎng)絡(luò)協(xié)議C語(yǔ)言Linux操作

2020-11-03 11:04:20

Linux 工具 開(kāi)發(fā)

2024-08-14 14:20:00

2021-01-27 09:34:51

Visual C++Dev C++codelite

2024-10-15 17:12:38

代碼父子線程開(kāi)源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)