最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

知識(shí)分享:CPU排查方法

2021-03-31 14:21 作者:光耀三十洲  | 我要投稿

前段時(shí)間我們新上了一個(gè)新的應(yīng)用,因?yàn)榱髁恳恢辈淮?,集群QPS大概只有5左右,寫接口的rt在30ms左右。

因?yàn)樽罱尤肓诵碌臉I(yè)務(wù),業(yè)務(wù)方給出的數(shù)據(jù)是日常QPS可以達(dá)到2000,大促峰值QPS可能會(huì)達(dá)到1萬(wàn)。

學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://space.bilibili.com/701029654

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://space.bilibili.com/216317641

所以,為了評(píng)估水位,我們進(jìn)行了一次壓測(cè)。壓測(cè)在預(yù)發(fā)布環(huán)境執(zhí)行。壓測(cè)過程中發(fā)現(xiàn),當(dāng)單機(jī)QPS達(dá)到200左右時(shí),接口的rt沒有明顯變化,但是CPU利用率急劇升高,直到被打滿。

-w1460

壓測(cè)停止后,CPU利用率立刻降了下來(lái)。

于是開始排查是什么導(dǎo)致了CPU的飆高。

學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://space.bilibili.com/701029654

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://space.bilibili.com/216317641

問題排查與解決

在壓測(cè)期間,登錄到機(jī)器,開始排查問題。

本案例的排查過程使用的阿里開源的Arthas工具進(jìn)行的,不使用arthas,使用JDK自帶的命令也是可以。

在開始排查之前,可以先看一下CPU的使用情況,最簡(jiǎn)單的就是使用top命令直接查看:

可以看到,進(jìn)程ID為3480的Java進(jìn)程占用的CPU比較高,基本可以斷定是應(yīng)用代碼執(zhí)行過程中消耗了大量CPU,接下來(lái)開始排查具體是哪個(gè)線程,哪段代碼比較耗CPU。

學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://space.bilibili.com/701029654

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://space.bilibili.com/216317641

首先,下載Arthas命令:

使用Arthas命令"thread -n 3 -i 1000"查看當(dāng)前"最忙"(耗CPU)的三個(gè)線程:

-w1147

通過上面的堆棧信息,可以看出,占用CPU資源的線程主要是卡在JDBC底層的TCP套接字讀取上。連續(xù)執(zhí)行了很多次,發(fā)現(xiàn)很多線程都是卡在這個(gè)地方。

通過分析調(diào)用鏈,發(fā)現(xiàn)這個(gè)地方是我代碼中有數(shù)據(jù)庫(kù)的insert,并且使用TDDL來(lái)創(chuàng)建sequence,在sequence的創(chuàng)建過程中需要和數(shù)據(jù)庫(kù)有交互。

學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://space.bilibili.com/701029654

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://space.bilibili.com/216317641

但是,基于對(duì)TDDL的了解,TDDL每次從數(shù)據(jù)庫(kù)中查詢sequence序列的時(shí)候,默認(rèn)會(huì)取出1000條,緩存在本地,只有用完之后才會(huì)再?gòu)臄?shù)據(jù)庫(kù)獲取下一個(gè)1000條序列。

按理說我們的壓測(cè)QPS只有300左右,不應(yīng)該這么頻繁的何數(shù)據(jù)庫(kù)交互才對(duì)。但是,經(jīng)過多次使用arthas的查看,發(fā)現(xiàn)大部分CPU都耗盡在這里。

于是開始排查代碼問題。最終發(fā)現(xiàn)了一個(gè)很傻的問題,那就是我們的sequence創(chuàng)建和使用有問題:

是因?yàn)?,我們每次insert語(yǔ)句都重新build了一個(gè)新的sequence,這就導(dǎo)致本地緩存就被丟掉了,所以每次都會(huì)去數(shù)據(jù)庫(kù)中重新拉取1000條,但是只是用了一條,下一次就又重新取了1000條,周而復(fù)始。

學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://space.bilibili.com/701029654

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://space.bilibili.com/216317641

于是,調(diào)整了代碼,把Sequence實(shí)例的生成改為在應(yīng)用啟動(dòng)時(shí)初始化一次。這樣后面在獲取sequence的時(shí)候,不會(huì)每次都和數(shù)據(jù)庫(kù)交互,而是先查本地緩存,本地緩存的耗盡了才會(huì)再和數(shù)據(jù)庫(kù)交互,獲取新的sequence。

public abstract class BaseMybatisDAO implements InitializingBean {

? ? ? ? @Override

? ? ? ? public void afterPropertiesSet() throws Exception {

? ? ? ? ? ? sequence = SequenceBuilder.create().name(getTableName()).sequenceDao(sequenceDao).build();

? ? ? ? }

? ? }

通過實(shí)現(xiàn)InitializingBean,并且重寫afterPropertiesSet()方法,在這個(gè)方法中進(jìn)行Sequence的初始化。

學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://space.bilibili.com/701029654

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://space.bilibili.com/216317641

改完以上代碼,提交進(jìn)行驗(yàn)證。通過監(jiān)控?cái)?shù)據(jù)可以看出優(yōu)化后,數(shù)據(jù)庫(kù)的讀RT有明顯下降:

sequence的寫操作QPS也有明顯下降:

于是我們開始了新的一輪壓測(cè),但是發(fā)現(xiàn),CPU的使用率還是很高,壓測(cè)的QPS還是上不去,于是重新使用Arthas查看線程的情況。

發(fā)現(xiàn)了一個(gè)新的比較耗費(fèi)CPU的線程的堆棧,這里面主要是因?yàn)槲覀冇玫搅艘粋€(gè)聯(lián)調(diào)工具,該工具預(yù)發(fā)布默認(rèn)開啟了TDDL的采集(官方文檔中描述為預(yù)發(fā)布默認(rèn)不開啟TDDL采集,但是實(shí)際上會(huì)采集)。

學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://space.bilibili.com/701029654

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://space.bilibili.com/216317641

這個(gè)工具在打印日志過程中會(huì)進(jìn)行脫敏,脫敏框架會(huì)調(diào)用Google的re2j進(jìn)行正則表達(dá)式的匹配。

因?yàn)槲业牟僮髦蠺DDL操作比較多,默認(rèn)采集大量TDDL日志并且進(jìn)行脫敏處理,確實(shí)比較耗費(fèi)CPU。

所以,通過在預(yù)發(fā)布中關(guān)閉DP對(duì)TDDL的采集,即可解決該問題。

總結(jié)與思考

本文總結(jié)了一次線上CPU飆高的問題排查過程,其實(shí)問題都不難,并且還挺傻的,但是這個(gè)排查過程是值得大家學(xué)習(xí)的。

學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://space.bilibili.com/701029654

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://space.bilibili.com/216317641

其實(shí)在之前自己排查過很多次CPU飆高的問題,這次也是按照老方法進(jìn)行排查,但是剛開始并沒有發(fā)現(xiàn)太大的問題,只是以為是流量升高導(dǎo)致數(shù)據(jù)庫(kù)操作變多的正常現(xiàn)象。

期間又多方查證(通過arthas查看sequence的獲取內(nèi)容、通過數(shù)據(jù)庫(kù)查看最近插入的數(shù)據(jù)的主鍵ID等)才發(fā)現(xiàn)是TDDL的Sequence的初始化機(jī)制有問題。

在解決了這個(gè)問題之后,以為徹底解決問題,結(jié)果又遇到了DP采集TDDL日志導(dǎo)致CPU飆高,最終再次解決后有了明顯提升。

所以,事出反常必有妖,排查問題就是一個(gè)抽絲剝繭的過程。

學(xué)習(xí)更多,請(qǐng)點(diǎn)擊:https://space.bilibili.com/701029654

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://space.bilibili.com/216317641


作者:HollisChuang
鏈接:https://juejin.cn/post/6945636880733962277
來(lái)源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。



知識(shí)分享:CPU排查方法的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
佛坪县| 万山特区| 长子县| 陈巴尔虎旗| 天祝| 修文县| 灯塔市| 玉溪市| 虹口区| 大石桥市| 大庆市| 小金县| 昭苏县| 江门市| 阿荣旗| 石渠县| 吐鲁番市| 高尔夫| 南川市| 五寨县| 扎赉特旗| 长丰县| 娄底市| 湘乡市| 桓台县| 边坝县| 富宁县| 虞城县| 德清县| 蒙山县| 镇巴县| 扎赉特旗| 宜昌市| 洞头县| 泾川县| 会东县| 孟村| 会泽县| 建平县| 诏安县| 乐山市|