JFR 定位因?yàn)镾SL導(dǎo)致CPU Load飚高的問題該怎么解決,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
潮安網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,潮安網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為潮安1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的潮安做網(wǎng)站的公司定做!
在某一時(shí)刻,某個(gè)微服務(wù)的某個(gè)實(shí)例 CPU 負(fù)載突然飚高
由于建立了很多數(shù)據(jù)庫鏈接,猜想可能是數(shù)據(jù)庫比較慢,查看數(shù)據(jù)庫這段時(shí)間的 SQL 統(tǒng)計(jì),發(fā)現(xiàn)數(shù)據(jù)庫并不慢。
其中這個(gè)微服務(wù)這段時(shí)間的熱點(diǎn) SQL,執(zhí)行并不慢。那么問題出在了哪里呢?可能是由于 GC,可能是由于 safepoint,還有可能是獲取鎖時(shí)間過長(參考:Java 監(jiān)控 JFR全解),我們 dump 一下 JFR 并查看其中的 safepoint,GC 以及 Monitor Blocked 相關(guān)事件。
首先查看GC,發(fā)現(xiàn)都是 Young GC, GC 暫停時(shí)間也可以接受。
然后是 safepoint,雖然有采集到 safepoint,但是暫停時(shí)間也沒有很長。
最后查看 Java Monitor Block,發(fā)現(xiàn)有很多很長時(shí)間的鎖等待。
堆棧顯示,阻塞在:void sun.security.provider.SecureRandom.engineNextBytes(byte[])
上面,這就是一個(gè)經(jīng)典的問題,Java Random,參考代碼:NativePRNG
// name of the *System* property, takes precedence over PROP_RNDSOURCE private static final String PROP_EGD = "java.security.egd"; // name of the *Security* property private static final String PROP_RNDSOURCE = "securerandom.source"; private static final boolean useLegacyDSA = Boolean.parseBoolean(GetPropertyAction.privilegedGetProperty ("jdk.security.legacyDSAKeyPairGenerator")); static final String URL_DEV_RANDOM = "file:/dev/random"; static final String URL_DEV_URANDOM = "file:/dev/urandom";
涉及到兩種隨機(jī)數(shù) seed 生成方式,一種是"file:/dev/random",另一種是"file:/dev/urandom",通過設(shè)置系統(tǒng)屬性java.security.egd
指定,默認(rèn)是"file:/dev/random"
在熵池不夠用的時(shí)候,默認(rèn)的"file:/dev/random"會(huì)阻塞,"file:/dev/urandom"不會(huì),繼續(xù)用。對(duì)于我們來說,"file:/dev/urandom"夠用,所以通過-Djava.security.egd=file:/dev/./urandom
設(shè)置系統(tǒng)屬性,使用 urandom 來減少阻塞。
看完上述內(nèi)容,你們掌握J(rèn)FR 定位因?yàn)镾SL導(dǎo)致CPU Load飚高的問題該怎么解決的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!