在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何解決JDK8小版本升級(jí)后性能下降的問(wèn)題

Rokr_wireless_t ? 來(lái)源:openEuler ? 作者:openEuler ? 2021-07-26 14:44 ? 次閱讀

編者按:在升級(jí) JDK8U 的小版本后(從 8u74 升級(jí)到 8u202),遇到性能劇烈下降的問(wèn)題(性能下降 13 倍)。該應(yīng)用是一個(gè)非常簡(jiǎn)單的 Web 應(yīng)用,且應(yīng)用在 JDK 升級(jí)前后并無(wú)任何發(fā)布修復(fù)。

通常來(lái)說(shuō) JDK 小版本升級(jí)都是問(wèn)題修改,不影響功能和性能使用,而應(yīng)用性能劇烈下降一定是 JDK 的內(nèi)部 bug。對(duì)于這樣明確由 JDK 引起的性能問(wèn)題,該如何解決?

最常見(jiàn)的方法是通過(guò)工具分析 JVM 執(zhí)行過(guò)程,檢查函數(shù)執(zhí)行的情況是否發(fā)生變化,如果找到變化,則可以深入分析哪些因素引起了變化,并進(jìn)一步得到根因。筆者使用 perf 工具分析 JVM 執(zhí)行時(shí)的熱點(diǎn)函數(shù),并對(duì)出現(xiàn)問(wèn)題的函數(shù)進(jìn)行剖析,使用函數(shù)插樁來(lái)分析函數(shù)的執(zhí)行次數(shù),發(fā)現(xiàn)不同版本行為差異的根源,并找到了引起問(wèn)題的根因。希望讀者遇到性能問(wèn)題時(shí)可以參照本文使用 perf 工具對(duì)問(wèn)題進(jìn)行定位。

工欲善其事,必先利其器。程序員在定位性能瓶頸的時(shí)候,要是有一個(gè)趁手的性能調(diào)優(yōu)工具,能一針見(jiàn)血地指出程序的性能問(wèn)題,可謂事半功倍。

Linux 中最常用的性能調(diào)優(yōu)工具 Perf(Linux 系統(tǒng)原生提供的性能分析工具),使用 perf 先對(duì)應(yīng)用(假設(shè)要采樣的應(yīng)用為 JavaApp)進(jìn)行采樣,使用 record 命令,如下:

perfrecordjavaJavaApp

另外 perf 能按出現(xiàn)的百分比降序打印 CPU 正在執(zhí)行的函數(shù)名以及調(diào)用棧,如命令:

perfreport-n

這種結(jié)果的輸出還是不直觀的,Linux 性能優(yōu)化大師 Brendan Gregg 發(fā)明了火焰圖(因整個(gè)圖形看起來(lái)像燃燒的火焰而得名),以全局的方式來(lái)看各個(gè)函數(shù)的調(diào)用時(shí)間分布,以圖形化的方式列出調(diào)用棧。

火焰圖是基于 perf 的結(jié)果生成的圖形,我們先了解一下怎么去看火焰圖。

X 軸表示被抽樣到的次數(shù)。理解 X 軸的含義,需先了解采樣數(shù)據(jù)的原理。Perf 是在指定時(shí)間段內(nèi),每隔一段時(shí)間采集一次數(shù)據(jù),被采集到的次數(shù)越多,說(shuō)明該函數(shù)的執(zhí)行總時(shí)間長(zhǎng),可能的原因有:調(diào)用次數(shù)多,或者單次執(zhí)行時(shí)間長(zhǎng)。因此,X 軸的寬度不能簡(jiǎn)單的認(rèn)為是運(yùn)行時(shí)長(zhǎng)。Y 軸表示調(diào)用棧。

如何從火焰圖看出性能的瓶頸在哪里?最有理由懷疑的地方,頂層的“平頂”。關(guān)于 perf 和火焰圖使用方法可以參官網(wǎng)http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html。

下面是我們利用火焰圖來(lái)定位問(wèn)題的一次實(shí)戰(zhàn)。

火焰圖定位問(wèn)題的實(shí)戰(zhàn)

問(wèn)題場(chǎng)景

問(wèn)題發(fā)生的場(chǎng)景是客戶端向服務(wù)器發(fā)起 http 請(qǐng)求,服務(wù)器返回?cái)?shù)據(jù)給客戶端(這是一個(gè)非常簡(jiǎn)單的服務(wù)交互)。我們發(fā)現(xiàn)使用 JDK 8u74 的性能要遠(yuǎn)優(yōu)于 JDK 8u202 的性能,下表中統(tǒng)計(jì)了 20 次服務(wù)器的響應(yīng)時(shí)長(zhǎng)。

009cbc14-e029-11eb-9e57-12bb97331649.png

從響應(yīng)時(shí)間來(lái)看,8u202 相比 8u74 性能下降 13 倍之多,由于應(yīng)用本身并未做任何修改,所以考慮使用火焰圖來(lái)定位性能消耗的問(wèn)題點(diǎn)。在 8u74 和 8u202 分別運(yùn)行應(yīng)用,并用 perf 的 record 抓取數(shù)據(jù)并生成火焰圖。

火焰圖定位

對(duì)比兩張火焰圖,使用 8u74 時(shí) ClientHandshaker.processMessage 占比為 1.15%,而在 8u202 中這個(gè)函數(shù)占比為 23.98%,很明顯在 ClientHandshaker.processMessage 帶來(lái)了性能差異。

00c5357c-e029-11eb-9e57-12bb97331649.png

01225572-e029-11eb-9e57-12bb97331649.png

根因定位

兩者在這個(gè) ClientHandshaker.processMessage 上的 cpu 消耗差異很大,繼續(xù)分析這個(gè)函數(shù)找到根因。

voidprocessMessage(bytehandshakeType,intlength)throwsIOException{ if(this.state>=handshakeType&&handshakeType!=0){ //...異常 }else{ label105: switch(handshakeType){ case0://hello_request this.serverHelloRequest(newHelloRequest(this.input)); break; //... case2://sever_hello this.serverHello(newServerHello(this.input,length)); break; case11:///certificate this.serverCertificate(newCertificateMsg(this.input)); this.serverKey=this.session.getPeerCertificates()[0].getPublicKey(); break; case12://server_key_exchange該消息并不是必須的,取決于協(xié)商出的key交換算法 //... case13://certificate_request客戶端雙向驗(yàn)證時(shí)需要 //... case14://server_hello_done this.serverHelloDone(newServerHelloDone(this.input)); break; case20://finished this.serverFinished(newFinished(this.protocolVersion,this.input,this.cipherSuite)); } if(this.state

processMessage()主要是通過(guò)不同的信息類(lèi)型進(jìn)行不同的握手消息的處理。而在火焰圖中可以看到,JDK8u74 圖中,主要消耗在函數(shù) serverFinished()和 serverHello()上,而 JDK8u202 主要消耗在函數(shù) serverHelloDone()和 serverKeyExchange()。

在介紹火焰圖的時(shí)候,我們有提到,X 軸的長(zhǎng)度是映射了被采樣到的次數(shù)。因此需要進(jìn)一步確定消耗:函數(shù)單次執(zhí)行耗時(shí)過(guò)長(zhǎng)而成為熱點(diǎn),還是因?yàn)轭l繁調(diào)用函數(shù)導(dǎo)致函數(shù)耗時(shí)過(guò)長(zhǎng)而成為熱點(diǎn)。

可通過(guò)字節(jié)碼插樁(通過(guò) Instrument 技術(shù)實(shí)現(xiàn)對(duì)函數(shù)的計(jì)數(shù),然后編譯成 agent,執(zhí)行應(yīng)用時(shí)加載 agent,具體使用 Instrument 的方法可以參考官方文檔)查看函數(shù) serverHelloDone()的調(diào)用次數(shù)及執(zhí)行時(shí)間。

JDK8u202數(shù)據(jù) Executecount:253 Executecount:258 Executecount:649 Executecount:661 serverHelloDoneexecutetime[1881195ns] Executecount:1223 Executecount:1234 Executecount:1843 Executecount:1852 serverHelloDoneexecutetime[1665012ns] Executecount:2446 Executecount:2456 serverHelloDoneexecutetime[1686206ns] JDK8u74數(shù)據(jù) Executecount:56 Executecount:56 Executecount:56 Executecount:56 Executecount:56 Executecount:56

Execute time 是取了每 1000 次調(diào)用的平均值,Execute count 每 5000ms 輸出一次總執(zhí)行次數(shù)。很明顯使用 JDK8u202 時(shí)在不斷調(diào)用 serverHelloDone,而 74 在調(diào)用 56 次后沒(méi)有再調(diào)用過(guò)這個(gè)函數(shù)。

初始化握手時(shí),serverHelloDone 方法中,客戶端會(huì)根據(jù)服務(wù)端返回加密套件決定加密方式,構(gòu)造不同的 Client Key Exchange 消息;服務(wù)器如果允許重用該會(huì)話,則通過(guò)在 Server Hello 消息中設(shè)置相同的會(huì)話 ID 來(lái)應(yīng)答。

這樣,客戶端和服務(wù)器就可以利用原有會(huì)話的密鑰和加密套件,不必重新協(xié)商,也就不再走 serverHelloDone 方法。從現(xiàn)象來(lái)看, JDK8u202 沒(méi)有復(fù)用會(huì)話,而是建立的新的會(huì)話。

水落石出

查看 JDK8u 161 的 release notes,添加了 TLS 會(huì)話散列和擴(kuò)展主密鑰擴(kuò)展支持,找到引入的一個(gè)還未修復(fù)的 issue,對(duì)于帶有身份驗(yàn)證的 TLS 的客戶端,支持 UseExtendedMasterSecret 會(huì)破壞 TLS-Session 的恢復(fù),導(dǎo)致不使用現(xiàn)有的 TLS-Session,而執(zhí)行新的 Handshake。

JDK8u161 之后的版本(含 JDK8u161),若復(fù)用會(huì)話時(shí)不能成功恢復(fù) Session,而是創(chuàng)建新的會(huì)話,會(huì)造成較大性能消耗,且積壓的大量的不可復(fù)用的 session 造成 GC 壓力變大;如果業(yè)務(wù)場(chǎng)景存在不變更證書(shū)密鑰,需要復(fù)用會(huì)話,且對(duì)性能有要求,可通過(guò)添加參數(shù)-Djdk.tls.useExtendedMasterSecret=false 來(lái)解決這個(gè)問(wèn)題。

后記

如果遇到相關(guān)技術(shù)問(wèn)題(包括不限于畢昇 JDK),可以通過(guò)畢昇 JDK 社區(qū)求助。畢昇 JDK 社區(qū)每雙周周二舉行技術(shù)例會(huì),同時(shí)有一個(gè)技術(shù)交流群討論 GCC、LLVM 和 JDK 等相關(guān)編譯技術(shù),感興趣的同學(xué)可以添加如下微信小助手入群(請(qǐng)備注:Complier)。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • jdk8
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    1937

原文標(biāo)題:使用 perf 解決 JDK8 小版本升級(jí)后性能下降的問(wèn)題

文章出處:【微信號(hào):wireless-tag,微信公眾號(hào):?jiǎn)⒚髟贫丝萍肌繗g迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    motorBench 2.45.0版本說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《motorBench 2.45.0版本說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 01-22 16:15 ?0次下載
    motorBench 2.45.0<b class='flag-5'>版本</b>說(shuō)明

    OurBMC 24.12版本正式上線

    日前,經(jīng)過(guò)社區(qū)開(kāi)發(fā)者的共同努力,OurBMC 全新升級(jí),24.12版本正式上線。
    的頭像 發(fā)表于 01-07 13:45 ?184次閱讀

    R60AFD1跌倒雷達(dá)全新固件127版本,精準(zhǔn)升級(jí)新體驗(yàn)

    云帆瑞達(dá)頂裝跌倒雷達(dá)R60AFD1-V,全新固件版本1.27已升級(jí)。此次升級(jí)專(zhuān)注于算法固件的優(yōu)化,未對(duì)硬件進(jìn)行改動(dòng),但由于算法變化較大,無(wú)法支持前期舊版本OTA
    的頭像 發(fā)表于 11-28 15:12 ?245次閱讀
    R60AFD1跌倒雷達(dá)全新固件127<b class='flag-5'>版本</b>,精準(zhǔn)<b class='flag-5'>升級(jí)</b>新體驗(yàn)

    機(jī)器視覺(jué) 歡創(chuàng)播報(bào) 華為高階智能駕駛3.0版本8月上市

    1 華為高階智能駕駛3.0版本8月上市 據(jù)媒體報(bào)道,華為常務(wù)董事、智能汽車(chē)解決方案BU董事長(zhǎng)余承東在AITO問(wèn)界第40萬(wàn)輛新車(chē)下線暨M(jìn)9第7萬(wàn)輛交付儀式上透露,將在8月份正式上市華為高階智能駕駛
    的頭像 發(fā)表于 08-01 13:59 ?682次閱讀
    機(jī)器視覺(jué) 歡創(chuàng)播報(bào)  華為高階智能駕駛3.0<b class='flag-5'>版本</b><b class='flag-5'>8</b>月上市

    RaftKeeper v2.1.0版本發(fā)布,性能大幅提升!

    ClickHouse 場(chǎng)景中,用于解決 ZooKeeper 的性能瓶頸問(wèn)題,同時(shí) RaftKeeper 也可以用于其它大數(shù)據(jù)組件比如 HBase。 v2.1.0 作為 v2.0.0 的重要版本,引入了一系列
    的頭像 發(fā)表于 07-15 15:10 ?382次閱讀
    RaftKeeper v2.1.0<b class='flag-5'>版本</b>發(fā)布,<b class='flag-5'>性能</b>大幅提升!

    OTA升級(jí)重啟版本不切換問(wèn)題怎么解決?

    我用自己搭的http server作為ota升級(jí)服務(wù)器,可以看到版本正確的被下載和寫(xiě)到flash,最后crc校驗(yàn)也成功,信息如下: upgrade data load finish. img_crc
    發(fā)表于 07-12 08:41

    升級(jí)到RTOS SDK v1.5版本編譯報(bào)錯(cuò)如何解決?

    準(zhǔn)備升級(jí)到RTOS SDK v1.5版本,在進(jìn)行工程編譯的時(shí)候出現(xiàn)問(wèn)題,cJSON.c使用了floor和pow兩個(gè)方法,并且該文件#include ,但在鏈接的時(shí)候庫(kù)中找不到這兩個(gè)方法的定義,出現(xiàn)
    發(fā)表于 07-12 06:10

    JDK8升級(jí)JDK11最全實(shí)踐干貨來(lái)了

    呢?值得我們升級(jí)嗎?而且升級(jí)過(guò)程會(huì)遇到哪些問(wèn)題呢?帶著這些問(wèn)題,本篇文章將帶來(lái)完整的JDK8升級(jí)JDK11最全實(shí)踐。 2、為什么
    的頭像 發(fā)表于 06-25 14:51 ?527次閱讀
    <b class='flag-5'>JDK8</b><b class='flag-5'>升級(jí)</b><b class='flag-5'>JDK</b>11最全實(shí)踐干貨來(lái)了

    JDK11升級(jí)JDK17最全實(shí)踐干貨來(lái)了

    解決你的問(wèn)題。 上篇文章給大家?guī)?lái)了JDK8升級(jí)JDK11的最全實(shí)踐,相信大家閱讀后已經(jīng)對(duì)JDK11有了比較深入的了解。2021年9月14日,Oracle發(fā)布了可以長(zhǎng)期支持的
    的頭像 發(fā)表于 06-25 14:50 ?796次閱讀
    <b class='flag-5'>JDK</b>11<b class='flag-5'>升級(jí)</b><b class='flag-5'>JDK</b>17最全實(shí)踐干貨來(lái)了

    stm32cubemx升級(jí)到6.10.0,不能打開(kāi)以前版本的文件了,怎么解決?

    stm32cubemx升級(jí)到6.10.0,不能打開(kāi)以前版本的文件了,怎么解決?
    發(fā)表于 05-17 11:24

    FogCloud正式發(fā)布5.0版本,全面升級(jí)性能與服務(wù)!

    全新 FogCloud V5.0 如約而至,它不僅延續(xù)了一貫的卓越性能與用戶體驗(yàn),更在性能優(yōu)化、穩(wěn)定性提升及功能創(chuàng)新上實(shí)現(xiàn)了重大突破。 在此版本中,慶科信息對(duì)功能模塊進(jìn)行了深度挖掘和全面升級(jí)
    的頭像 發(fā)表于 04-24 11:54 ?360次閱讀
    FogCloud正式發(fā)布5.0<b class='flag-5'>版本</b>,全面<b class='flag-5'>升級(jí)</b><b class='flag-5'>性能</b>與服務(wù)!

    蘋(píng)果停iOS 16.7.6驗(yàn)證,僅支持16.7.7版本驗(yàn)證

    據(jù)悉,蘋(píng)果已于4月17日停止了對(duì)iOS 16.7.6版本的驗(yàn)證服務(wù)。對(duì)于已升級(jí)至iOS 16.7.7版本的iPhone用戶來(lái)說(shuō),他們已無(wú)法返回至舊版系統(tǒng)。
    的頭像 發(fā)表于 04-17 10:27 ?1226次閱讀

    stm32cubeIDE 1.6.1 ioc中的字體很大如何解決?

    今天把stm32cubeIDE 升級(jí)到1.6.1版本,就出現(xiàn)打開(kāi).ioc配置界面中的字體很大,設(shè)置的內(nèi)容一屏只能放下幾項(xiàng)的問(wèn)題,請(qǐng)問(wèn)大家有知道如何解決這個(gè)問(wèn)題嗎?之前的版本么有這個(gè)問(wèn)題
    發(fā)表于 04-07 06:31

    升級(jí)STM32WB55 dongle FUS版本遇到的疑問(wèn)求解

    的,我升級(jí)一下FUS版本,發(fā)現(xiàn)fus oprerator版本,還是空的,這里面的這個(gè)fus oprerator版本怎么升級(jí)呢,有哪位大佬可以
    發(fā)表于 03-13 07:58

    升級(jí)了STM32CubeMX到6.10版本,結(jié)果側(cè)面升級(jí)和安裝SDK庫(kù)點(diǎn)擊無(wú)效了怎么解決?

    升級(jí)了STM32CubeMX到6.10版本,結(jié)果側(cè)面升級(jí)和安裝SDK庫(kù)點(diǎn)擊無(wú)效了,賬戶登錄也點(diǎn)擊出不來(lái),重裝6.9.2版本就都可以。
    發(fā)表于 03-08 06:27
    主站蜘蛛池模板: 三级欧美在线 | 六月综合 | 操你啦在线播放 | 亚洲综合成人在线 | 色视频在线观看在线播放 | 国产精品久久久久久久牛牛 | 久久久精品午夜免费不卡 | 午夜看片| 狠狠狠狠干 | 亚洲一区二区在线免费观看 | 四虎精品久久久久影院 | 久久久久999 | 亚洲日本色图 | 欧美天堂色 | 六月婷婷精品视频在线观看 | 激情婷婷丁香 | 福利视频一区二区微拍堂 | 秋霞一级特黄真人毛片 | 性色欧美 | 精品一区二区在线观看 | 国产午夜精品一区二区理论影院 | 美女扒开尿口给男人爽的视频 | 福利一区在线观看 | 亚洲欧洲国产精品你懂的 | 久九色| 日本xxxx18vr69| 欧美日韩亚洲色图 | 日本一区二区三区在线 视频观看免费 | 性生生活三级视频在线观看 | 国内久久精品 | 国产福利在线观看你懂的 | 亚洲欧美精品成人久久91 | 视频在线观看一区二区三区 | аⅴ天堂 在线 | 亚洲入口 | 亚洲成人7777| 亚洲午夜视频在线观看 | 免费免播放器在线视频观看 | 久青草久青草高清在线播放 | 婷婷综合激情 | 日本人69xxx|