Java应用性能调优工具介绍及实践
一、背景
(1)、隨著微服務(wù)架構(gòu)的逐漸推廣,一個(gè)大型的單個(gè)應(yīng)用程序被拆分為數(shù)個(gè)微服務(wù)系統(tǒng),這為研發(fā)人員的本地調(diào)試跟蹤帶來困難
(2)、在微服務(wù)架構(gòu)中,由于業(yè)務(wù)的復(fù)雜性,常常一個(gè)業(yè)務(wù)流程涉及好數(shù)個(gè)微服務(wù)系統(tǒng)的調(diào)用,性能排查時(shí)到底因?yàn)槟膫€(gè)微服務(wù)系統(tǒng)的性能瓶頸從而導(dǎo)致整個(gè)業(yè)務(wù)性能的瓶頸,不好定位
????????因此,下面為大家介紹目前有哪些開源工具支持查看應(yīng)用JVM狀況、Debug調(diào)試跟蹤、調(diào)用鏈跟蹤等功能,方便應(yīng)用問題快速定位和性能優(yōu)化
1.1、什么樣的場景需要性能調(diào)優(yōu)
(1)、OutOfMemoryError,內(nèi)存不足
(2)、內(nèi)存泄露
(3)、線程死鎖
(4)、鎖爭用(Lock Contention)
(5)、Java進(jìn)程消耗CPU過高
? ? ? ?這些問題出現(xiàn)的時(shí)候常常通過重啟服務(wù)器或者調(diào)大內(nèi)存來臨時(shí)解決,實(shí)際情況,還需要盡量還原當(dāng)時(shí)的業(yè)務(wù)場景,并分析內(nèi)存、線程等數(shù)據(jù),通過分析找到最終的解決方案。
二、常見調(diào)優(yōu)工具
2.1、jvisualvm應(yīng)用監(jiān)控
第一步:應(yīng)用JVM參數(shù)添加JMX監(jiān)控參數(shù)
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<應(yīng)用所在機(jī)器IP> -Dcom.sun.management.jmxremote.port=<“2”+應(yīng)用端口> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"第二步:打開jvisualvm監(jiān)控工具
如果本地有安裝jdk環(huán)境,打開終端工具,輸入:jvisualvm 命令回車進(jìn)入窗口界面,然后在在《遠(yuǎn)程》菜單上右擊后點(diǎn)擊《添加遠(yuǎn)程主機(jī)》,然后設(shè)置端口點(diǎn)擊《確定》即可
JMX端口:“2”+“應(yīng)用端口號(hào)”
例如:應(yīng)用端口號(hào)為:8011,那它的JMX端口為:28011
2.2、應(yīng)用Debug模式開啟
第一步:應(yīng)用JVM參數(shù)新增Debug調(diào)試參數(shù)
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=<“1”+應(yīng)用端口號(hào)>,server=y,suspend=n"第二步:Intellij idea開發(fā)環(huán)境應(yīng)用Debug調(diào)試
打開Intellij idea 的Run Configurations,點(diǎn)擊添加Remote,然后配置應(yīng)用名稱、應(yīng)用地址、端口號(hào),點(diǎn)擊《確定》,最后運(yùn)行調(diào)試
應(yīng)用Debug端口生成規(guī)則:“1”+“應(yīng)用端口號(hào)”
例如:應(yīng)用端口號(hào)為:8011,那它的Debug調(diào)試端口為:18011
注意:
(1)、調(diào)試時(shí)本地分支代碼和部署的分支代碼保持一致
(2)、調(diào)試時(shí)設(shè)置的斷點(diǎn)會(huì)影響其他人的正常使用
2.3、APM-PinPoint性能調(diào)用鏈跟蹤
? ? ? ? Pinpoint是一款全鏈路分析工具,提供了無侵入式的調(diào)用鏈監(jiān)控、方法執(zhí)行詳情查看、應(yīng)用狀態(tài)信息監(jiān)控等功能。基于GoogleDapper論文進(jìn)行的實(shí)現(xiàn),與另一款開源的全鏈路分析工具Zipkin類似,但相比Zipkin提供了無侵入式、代碼維度的監(jiān)控等更多的特性,Pinpoint支持的功能比較豐富。
參考網(wǎng)站:
(1)、Pinpoint安裝部署
(2)、回到網(wǎng)易后開源APM技術(shù)選型與實(shí)戰(zhàn)
(3)、2個(gè)實(shí)例+5個(gè)維度解讀APM技術(shù)
(1)、服務(wù)拓?fù)鋱D
? ? ? ? 對(duì)整個(gè)系統(tǒng)中應(yīng)用的調(diào)用關(guān)系進(jìn)行了可視化的展示,單擊某個(gè)服務(wù)節(jié)點(diǎn),可以顯示該節(jié)點(diǎn)的詳細(xì)信息,比如當(dāng)前節(jié)點(diǎn)狀態(tài)、請(qǐng)求數(shù)量等
(2)、請(qǐng)求調(diào)用棧查看
? ? ? ? 對(duì)分布式環(huán)境中每個(gè)請(qǐng)求提供了代碼維度的可見性,可以在頁面中查看請(qǐng)求針對(duì)到代碼維度的執(zhí)行詳情,幫助查找請(qǐng)求的瓶頸和故障原因。
三、性能調(diào)優(yōu)工具實(shí)踐
3.1、Web跨境Redis請(qǐng)求過于頻繁,導(dǎo)致系統(tǒng)響應(yīng)過慢
(1)、菜單Pattern匹配存儲(chǔ)在rendis,緩存交互過多;解決方案:穩(wěn)定不變的值,例如StringMatchUtils中的正則模型解釋Pattern本地緩存替換redis緩存
總結(jié):通過Pattern本地緩存替換redis緩存優(yōu)化,減少了130多次的redis訪問
(2)、Shiro頻繁訪問Redis讀取和更新session;解決方案:ShareCacheSessionDao使用LocalThread緩存同一請(qǐng)求線程中的session,解決Shiro頻繁訪問Redis讀取和更新session
總結(jié):通過對(duì)Shiro訪問Redis優(yōu)化,Redis訪問次數(shù)減少了1200多次
(3)、本地緩存穿透;當(dāng)key對(duì)應(yīng)的value為空時(shí),緩存失效;解決方案:對(duì)統(tǒng)一配置key值為空也進(jìn)行緩存,5分鐘的有效期;防止統(tǒng)一配置緩存穿透問題
?
總結(jié)
以上是生活随笔為你收集整理的Java应用性能调优工具介绍及实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文浅尝 - EMNLP2020 | 基
- 下一篇: 会议交流 | 最新NLP核心技术与前沿实