背景
最近工作中要做一個(gè)優(yōu)化鳖孤,將定時(shí)任務(wù)的調(diào)度頻率從1min/次提升到30s/次,相當(dāng)于頻率提高一倍抡笼。這就需要我從系統(tǒng)性能苏揣、任務(wù)處理時(shí)間等方面進(jìn)行分析了。
數(shù)據(jù)準(zhǔn)備
首先是需要對(duì)該場(chǎng)景下的調(diào)度數(shù)據(jù)進(jìn)行分析推姻。我的任務(wù)場(chǎng)景是比較簡(jiǎn)單的平匈,就是每次定時(shí)調(diào)度批量處理某些任務(wù)。我的數(shù)據(jù)準(zhǔn)備也是比較簡(jiǎn)單的,只需要觀察此時(shí)線上每次調(diào)度時(shí)會(huì)處理的任務(wù)數(shù)吐葱,再加上后續(xù)業(yè)務(wù)上會(huì)擴(kuò)張的任務(wù)數(shù)量街望,對(duì)任務(wù)數(shù)據(jù)量進(jìn)行線下mock,然后分析每次任務(wù)執(zhí)行時(shí)的CPU占用率以及任務(wù)執(zhí)行的總時(shí)間就可以了弟跑。
工具準(zhǔn)備
分析CPU性能有很多的工具灾前,開(kāi)發(fā)和線上的機(jī)器都是Linux的RedHat系列,所以我使用的是nmon和他的解析工具nmon Analyser
第一步在開(kāi)發(fā)機(jī)上安裝nmon性能監(jiān)控工具:
sudo yum install nmon
驗(yàn)證安裝成功孟辑,輸入nmon命令進(jìn)入性能監(jiān)控控制臺(tái)哎甲,如下:
工具使用
我先開(kāi)始采集機(jī)器性能數(shù)據(jù)(每一秒采集一次數(shù)據(jù),共采集5分鐘的數(shù)據(jù))
nmon -s 1 -c300 -f -m /home/admin/tmp &
-s1:每一秒采集一次數(shù)據(jù)饲嗽;
-c300:采集300次炭玫,即為采集5分鐘的數(shù)據(jù);
-f:生成的數(shù)據(jù)文件名中包含文件創(chuàng)建的時(shí)間
-m:生成的數(shù)據(jù)文件的存放目錄
&:后臺(tái)運(yùn)行
接著開(kāi)始觸發(fā)定時(shí)調(diào)度貌虾,定時(shí)任務(wù)觸發(fā)完吞加,觀察nmon數(shù)據(jù)是否采集結(jié)束,可以通過(guò)觀察/home/admin/tmp下的nmon文件大小是否還在變大來(lái)確定尽狠。nmon文件生成完畢后衔憨,可以通過(guò)測(cè)試哥哥教我的命令在文件生成的目錄運(yùn)行命令
python -m SimpkleHttpServer 2345
接著在本地瀏覽器中輸入"機(jī)器域名:2345"的端口號(hào),就可以將.nmon文件下載下來(lái)了袄膏。
下載分析工具nmon Analyser践图,下載下來(lái)是一個(gè)excel文件,選擇啟用宏并打開(kāi)Analyser的sheet沉馆,點(diǎn)擊Analyze nmon data码党,將download的
.nmon文件引入。
稍等片刻斥黑,我們就可以看到一系列的性能數(shù)據(jù)了揖盘,類(lèi)似如下圖(并不是我的nmon數(shù)據(jù)圖)。
在我的數(shù)據(jù)里面锌奴,CPU使用率高達(dá)100%兽狭,所以需要進(jìn)一步分析CPU占用率高的進(jìn)程是哪一個(gè)了莺葫。
分析命令使用
可以使用top命令去觀察CPU占用量大的進(jìn)程是哪一個(gè)秋秤,也是一秒鐘統(tǒng)計(jì)一次,可以得到類(lèi)似的數(shù)據(jù)文件。
top -d 1 -b > /home/admin/tmp/top.txt
而我的top文件告訴我進(jìn)程占用量最高的是Java進(jìn)程耻姥。命令查詢(xún)的結(jié)果可以和我JAVA應(yīng)用服務(wù)所對(duì)應(yīng)。
jps -v
所以確定了造成CPU占用率過(guò)高的原因確實(shí)是應(yīng)用JAVA服務(wù)有咨,接著需要進(jìn)一步確認(rèn)是JAVA進(jìn)程中的哪一個(gè)線程造成的琐簇。可以通過(guò)命令分析線程的CPU利用率
top -Hp pid -d 1 -b > /home/admin/tmp/top2.txt
這時(shí)候需要將圖中的線程號(hào)換算成16進(jìn)制數(shù)據(jù),通過(guò)命令jstack來(lái)分析是哪些線程造成的
jstack pid | grep 十六進(jìn)制線程號(hào)
其中C2 CompilerThread0這個(gè)線程網(wǎng)上的說(shuō)明有很多JAVA 進(jìn)程異常分析 - CPU婉商、內(nèi)存似忧,剩下的確實(shí)都是任務(wù)調(diào)度的線程 。
因?yàn)殚_(kāi)發(fā)機(jī)器的性能和線上機(jī)器的性能是不能比擬的丈秩,所以在做性能分析的時(shí)候盯捌,要申請(qǐng)一臺(tái)和線上機(jī)器性能一樣的機(jī)器,當(dāng)我們換到和線上機(jī)器配置的開(kāi)發(fā)機(jī)器時(shí)蘑秽,CPU的利用率從最高100%降到了最高20%饺著,說(shuō)明線上機(jī)器的性能是可以支撐定時(shí)調(diào)度批量觸發(fā)任務(wù)的。
任務(wù)處理時(shí)間
除了要看機(jī)器的性能外肠牲,還需要看在一次調(diào)度時(shí)間內(nèi)幼衰,是否所有的任務(wù)都可以被執(zhí)行完,用以判斷是否會(huì)存在積壓的情況缀雳。
每次觸發(fā)共有6種類(lèi)型的任務(wù)會(huì)被觸發(fā)渡嚣,所以需要查詢(xún)線上這6種類(lèi)型的任務(wù)的一次執(zhí)行時(shí)間,并且每次定時(shí)任務(wù)觸發(fā)時(shí)各個(gè)類(lèi)型的任務(wù)所占的比例肥印,計(jì)算時(shí)根據(jù)線上機(jī)器數(shù)與CPU數(shù)計(jì)算整體的任務(wù)完成時(shí)間识椰。
上下游業(yè)務(wù)分析
在機(jī)器性能和任務(wù)處理時(shí)間都滿(mǎn)足的情況下,本以為可以完成這次調(diào)撥頻率提高的優(yōu)化竖独,結(jié)果被組里的老司機(jī)告知裤唠,有一種任務(wù)對(duì)應(yīng)的下游業(yè)務(wù)只能在每分鐘的第40s進(jìn)行處理。
結(jié)論
最后因?yàn)橄掠螛I(yè)務(wù)接口處理的原因莹痢,不能執(zhí)行頻率提高的優(yōu)化种蘸。
總結(jié)
初探的過(guò)程主要是數(shù)據(jù)準(zhǔn)備,工具準(zhǔn)備以及壓測(cè)竞膳,除了從機(jī)器的性能上航瞭,還要結(jié)合業(yè)務(wù)場(chǎng)景進(jìn)行分析,在整個(gè)過(guò)程中主要使用了如下的工具和命令進(jìn)行分析
1.nmon -s 1 -c300 -f -m /home/admin/tmp &
2.top -Hp 72474 -d 1 -b > /home/admin/tmp/top72474.txt
3.top -d 1 -b > top1.txt
4.python -m SimpleHTTPServer 2345
5.jps -v
6.jstack 72474
7.jinfo -flag CICOmpilerCount 72474