摘要:應(yīng)用性能優(yōu)化是一個(gè)程序員必須要考慮的問題,典型的性能問題如頁面響應(yīng)慢接口超時(shí),服務(wù)器負(fù)載高并發(fā)數(shù)低,數(shù)據(jù)庫頻繁死鎖等。診斷對于主要關(guān)注平均負(fù)載,使用率,上下文切換次數(shù)。應(yīng)用診斷及工具應(yīng)用代碼性能問題是相對好解決的一類性能問題。
Java 應(yīng)用性能優(yōu)化是一個(gè)程序員必須要考慮的問題,典型的性能問題如頁面響應(yīng)慢、接口超時(shí),服務(wù)器負(fù)載高、并發(fā)數(shù)低,數(shù)據(jù)庫頻繁死鎖等。
Java應(yīng)用性能的瓶頸點(diǎn)非常多,比如磁盤、內(nèi)存、網(wǎng)絡(luò) I/O 等系統(tǒng)因素,Java 應(yīng)用代碼,JVM GC,數(shù)據(jù)庫,緩存等。可以將 Java 性能優(yōu)化分為 4 個(gè)層級:應(yīng)用層、數(shù)據(jù)庫層、框架層、JVM 層,如圖 1 所示。
圖 1.Java 性能優(yōu)化分層模型
每層優(yōu)化難度逐級增加,涉及的知識和解決的問題也會不同。比如應(yīng)用層需要理解代碼邏輯,通過 Java 線程棧定位有問題代碼行等;數(shù)據(jù)庫層面需要分析 SQL、定位死鎖等;框架層需要懂源代碼,理解框架機(jī)制;JVM 層需要對 GC 的類型和工作機(jī)制有深入了解,對各種 JVM 參數(shù)作用了然于胸。
1 CPU 診斷
對于 CPU 主要關(guān)注平均負(fù)載(Load Average),CPU 使用率,上下文切換次數(shù)(Context Switch)。
通過 top 命令可以查看系統(tǒng)平均負(fù)載和 CPU 使用率,圖 2 為通過 top 命令查看某系統(tǒng)的狀態(tài)。
圖 2.top 命令示例
平均負(fù)載有三個(gè)數(shù)字:63.66,58.39,57.18,分別表示過去 1 分鐘、5 分鐘、15 分鐘機(jī)器的負(fù)載。按照經(jīng)驗(yàn),若數(shù)值小于 0.7*CPU 個(gè)數(shù),則系統(tǒng)工作正常;若超過這個(gè)值,甚至達(dá)到 CPU 核數(shù)的四五倍,則系統(tǒng)的負(fù)載就明顯偏高。
圖 2 中 15 分鐘負(fù)載已經(jīng)高達(dá) 57.18,1 分鐘負(fù)載是 63.66(系統(tǒng)為 16 核),說明系統(tǒng)出現(xiàn)負(fù)載問題,且存在進(jìn)一步升高趨勢,需要定位具體原因了。
通過 vmstat 命令可以查看 CPU 的上下文切換次數(shù):
上下文切換次數(shù)發(fā)生的場景主要有如下幾種:
? 1)時(shí)間片用完,CPU 正常調(diào)度下一個(gè)任務(wù);
? 2)被其它優(yōu)先級更高的任務(wù)搶占;
? 3)執(zhí)行任務(wù)碰到 I/O 阻塞,掛起當(dāng)前任務(wù),切換到下一個(gè)任務(wù);
? 4)用戶代碼主動(dòng)掛起當(dāng)前任務(wù)讓出 CPU;
? 5)多任務(wù)搶占資源,由于沒有搶到被掛起;
? 6)硬件中斷。
Java 線程上下文切換主要來自共享資源的競爭。一般單個(gè)對象加鎖很少成為系統(tǒng)瓶頸,除非鎖粒度過大。但在一個(gè)訪問頻度高,對多個(gè)對象連續(xù)加鎖的代碼塊中就可能出現(xiàn)大量上下文切換,成為系統(tǒng)瓶頸。
比如在我們系統(tǒng)中就曾出現(xiàn) log4j 1.x 在較大并發(fā)下大量打印日志,出現(xiàn)頻繁上下文切換,大量線程阻塞,導(dǎo)致系統(tǒng)吞吐量大降的情況,其相關(guān)代碼如清單 1 所示,升級到 log4j 2.x 才解決這個(gè)問題。
2 Memory
從操作系統(tǒng)角度,內(nèi)存關(guān)注應(yīng)用進(jìn)程是否足夠,可以使用 free –m 命令查看內(nèi)存的使用情況。
通過 top 命令可以查看進(jìn)程使用的虛擬內(nèi)存 VIRT 和物理內(nèi)存 RES,根據(jù)公式 VIRT = SWAP + RES 可以推算出具體應(yīng)用使用的交換分區(qū)(Swap)情況,使用交換分區(qū)過大會影響 Java 應(yīng)用性能,可以將 swappiness 值調(diào)到盡可能小。
因?yàn)閷τ?Java 應(yīng)用來說,占用太多交換分區(qū)可能會影響性能,畢竟磁盤性能比內(nèi)存慢太多。
3 I/O
I/O 包括磁盤 I/O 和網(wǎng)絡(luò) I/O,一般情況下磁盤更容易出現(xiàn) I/O 瓶頸。通過 iostat 可以查看磁盤的讀寫情況,通過 CPU 的 I/O wait 可以看出磁盤 I/O 是否正常。
如果磁盤 I/O 一直處于很高的狀態(tài),說明磁盤太慢或故障,成為了性能瓶頸,需要進(jìn)行應(yīng)用優(yōu)化或者磁盤更換。
4 Java 應(yīng)用診斷及工具
應(yīng)用代碼性能問題是相對好解決的一類性能問題。通過一些應(yīng)用層面監(jiān)控報(bào)警(UMP),如果確定有問題的功能和代碼,直接通過代碼就可以定位;或者通過 top+jstack,找出有問題的線程棧,定位到問題線程的代碼上,也可以發(fā)現(xiàn)問題。對于更復(fù)雜,邏輯更多的代碼段,通過 Stopwatch 打印性能日志往往也可以定位大多數(shù)應(yīng)用代碼性能問題。
常用的 Java 應(yīng)用診斷包括線程、堆棧、GC 等方面的診斷。
jstack
jstack 命令通常配合 top 使用,通過 top -H -p pid 定位 Java 進(jìn)程和線程,再利用 jstack -l pid 導(dǎo)出線程棧。由于線程棧是瞬態(tài)的,因此需要多次 dump,一般 3 次 dump,一般每次隔 5s 就行。將 top 定位的 Java 線程 pid 轉(zhuǎn)成 16 進(jìn)制,得到 Java 線程棧中的 nid,可以找到對應(yīng)的問題線程棧。
JProfiler
JProfiler 可對 CPU、堆、內(nèi)存進(jìn)行分析,功能強(qiáng)大.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75615.html
摘要:在本文中我將會介紹應(yīng)用性能優(yōu)化的一般原則。性能優(yōu)化的流程圖摘取自和合著的性能,描述了應(yīng)用性能優(yōu)化的處理流程。例如,對每臺服務(wù)器,你面臨著為單個(gè)分配堆內(nèi)存和運(yùn)行個(gè)并為每個(gè)分配堆內(nèi)存的選擇。不過位能使用堆內(nèi)存最大理論值只有。 原文鏈接:http://www.cubrid.org/blog/dev-platform/the-principles-of-java-application-per...
摘要:高性能代碼的最佳實(shí)踐前言在這篇文章中,我們將討論幾個(gè)有助于提升應(yīng)用程序性能的方法。要獲得有關(guān)應(yīng)用程序需求的最好最可靠的方法是對應(yīng)用程序執(zhí)行實(shí)際的負(fù)載測試,并在運(yùn)行時(shí)跟蹤性能指標(biāo)。 showImg(https://segmentfault.com/img/bVbtgk4?w=256&h=254); 高性能Java代碼的最佳實(shí)踐前言 在這篇文章中,我們將討論幾個(gè)有助于提升Java應(yīng)用程序性...
摘要:能夠讓的周期利用的更充分對于多線程應(yīng)用運(yùn)行在多處理器和多核系統(tǒng)上至很有挑戰(zhàn)性的。另外,當(dāng)達(dá)到飽和狀態(tài)的時(shí)候并不能說明的性能和伸縮性已經(jīng)達(dá)到了最佳的狀態(tài)。磁盤如果應(yīng)用有對磁盤進(jìn)行操作,我們需要對磁盤進(jìn)行監(jiān)控,來監(jiān)測可能出現(xiàn)的磁盤性能問題。 對于 Java 性能比較關(guān)心的同學(xué)大概都知道《Java Performance》這本書,一般而言,很多同學(xué)在日常寫 Java Code 的時(shí)候很少去關(guān)...
摘要:昨天有個(gè)小學(xué)弟給我發(fā)來微信,說他現(xiàn)在有點(diǎn)后悔選擇開發(fā)了,月月光不說,還加班特別嚴(yán)重,平時(shí)也沒有屬于自己的時(shí)間去學(xué)習(xí),問我剛畢業(yè)的時(shí)候是不是這樣。每天回到出租屋都是倒頭就睡,非常累,也沒有其他時(shí)間提升自己的技術(shù)。 昨天有個(gè)小學(xué)弟給我發(fā)來微信,說他現(xiàn)在有點(diǎn)后悔選擇Android開發(fā)了,月月光不說...
摘要:甲骨文對于是一個(gè)完整的解決方案,包括高性能的虛擬機(jī),分析,監(jiān)測和診斷工具,可用于在應(yīng)用程序的延遲預(yù)測。它也可以被用作一個(gè)運(yùn)行時(shí)性能分析工具,稱為運(yùn)行時(shí)分析器,還可以分析內(nèi)存問題。是一個(gè)堆分析器,可以幫助你發(fā)現(xiàn)內(nèi)存泄漏和減少內(nèi)存消耗。 1、NetBeans profiler NetBeans Profiler是一個(gè)模塊化的添加,為NetBeans IDE提供分析功能,它是一個(gè)開源的集成開...
閱讀 1622·2021-09-02 15:41
閱讀 1014·2021-09-02 15:11
閱讀 1311·2021-07-28 00:15
閱讀 2333·2019-08-30 15:55
閱讀 1169·2019-08-30 15:54
閱讀 1712·2019-08-30 15:54
閱讀 2994·2019-08-30 14:02
閱讀 2541·2019-08-29 16:57