當我在幫助一些開(kāi)發(fā)者或架構師分析及優(yōu)化Java應用程序的性能時(shí),關(guān)鍵往往不在于對個(gè)別方法進(jìn)行微調,以節省一或兩微秒的執行時(shí)間。雖然對某些軟件來(lái)說(shuō),微秒級的優(yōu)化確實(shí)非常重要,但我認為這并非著(zhù)眼點(diǎn)所在。我在2015年間對數百個(gè)應用進(jìn)行了分析,發(fā)現多數性能與可伸縮性問(wèn)題都來(lái)源于糟糕的架構決策、框架的錯誤配置、錯誤的數據庫訪(fǎng)問(wèn)模式、過(guò)量的日志記錄,以及由于內存過(guò)度消耗而導致的垃圾回收所帶來(lái)的影響。
在我看來(lái),性能工程的根本在于通過(guò)大量的觀(guān)察,將關(guān)鍵的架構指標、可伸縮性指標以及性能指標關(guān)聯(lián)在一起。通過(guò)對每次構建的結果以及不同負載情況下的表現進(jìn)行分析,以發(fā)現系統中的回歸缺陷或瓶頸所在。以下圖中的儀表板作為示例:
(點(diǎn)擊放大圖像)
通過(guò)將系統負載、響應時(shí)間與SQL語(yǔ)句的執行次數等指標相關(guān)聯(lián),可得出某些性能工程方面問(wèn)題的根本原因。
最上面一張圖叫做“層分解”圖表,它顯示了你的應用中各個(gè)邏輯組件(例如Web Service、數據庫訪(fǎng)問(wèn)、業(yè)務(wù)邏輯、Web服務(wù)器等等)的總體執行時(shí)間。紅色部分所表示的是某個(gè)后端Web Service所花費的時(shí)間,很明顯這里產(chǎn)生了一個(gè)組件熱點(diǎn)。我們同時(shí)可以發(fā)現,該Web Service并沒(méi)有承受異常的負載,因為從第二張圖來(lái)看,當時(shí)應用程序所處理的請求數量這條線(xiàn)比較平穩。一般情況下,整體響應時(shí)間多數都耗費在數據層,但這并不代表數據庫本身的速度緩慢!我了解,低效的數據庫訪(fǎng)問(wèn)往往是造成性能不佳的主要原因,因此通常會(huì )結合分析SQL語(yǔ)句的執行次數。在這個(gè)示例中,已經(jīng)能夠很清楚地看到它與大多數響應時(shí)間的峰值是相關(guān)的。
相關(guān)廠(chǎng)商內容
一路走來(lái)技術(shù)人的創(chuàng )業(yè)故事
未來(lái)物聯(lián)網(wǎng)中智能硬件的角色
人工智能的技術(shù)版圖
GMTC全球移動(dòng)技術(shù)大會(huì ),8折優(yōu)惠!
滴滴出行iOS客戶(hù)端架構演進(jìn)之路
相關(guān)贊助商
ArchSummit深圳2016將于7月15-16在華僑城洲際大酒店舉行,現價(jià)8折搶購,團購報名更多優(yōu)惠!
我所觀(guān)察到最常見(jiàn)的問(wèn)題模式就是糟糕的數據庫訪(fǎng)問(wèn)模式,此外還有過(guò)于細粒度的服務(wù)調用、糟糕的共享數據訪(fǎng)問(wèn)共享、過(guò)度的日志記錄,以及由內存泄露以及大量的對象創(chuàng )建所導致的垃圾回收影響或是應用程序的崩潰。
可選的診斷工具
在本文中,我將專(zhuān)注于探討數據庫方面的問(wèn)題,因為我十分確信你的所有應用都是因這些訪(fǎng)問(wèn)模式中的某一種而產(chǎn)生問(wèn)題的!你可以在市場(chǎng)上已有的各種性能診斷、追蹤,或是APM工具之間隨意選擇,不過(guò)我所選擇的是免費的Dynatrace Personal License。Java本身也提供了各種出色的工具,例如Java Mission Control等等。許多提供數據訪(fǎng)問(wèn)功能的框架也經(jīng)常通過(guò)其日志輸出提供各種診斷選項,例如Hibernate或Spring等等。
在使用這些跟蹤工具時(shí),通常不需要對代碼進(jìn)行任何修改,因為他們都利用了JVMTI(JVM Tooling Interface)以捕獲代碼層面的信息,甚至能夠跨遠程的各層次進(jìn)行調用追蹤,這一點(diǎn)對于分布式、面向(微)服務(wù)的應用來(lái)說(shuō)非常實(shí)用。你所要做的就是修改你的JVM啟動(dòng)命令行選項,以加載這些工具。某些工具的開(kāi)發(fā)商還提供了與IDE的集成功能,你只需簡(jiǎn)單地表示“在運行時(shí)開(kāi)啟XYZ性能診斷功能”。我在YouTube上做了一個(gè)簡(jiǎn)單的視頻指南,演示了如何對在Eclipse中啟動(dòng)的應用進(jìn)行追蹤。
找出數據庫的性能熱點(diǎn)
即使你已經(jīng)發(fā)現造成應用整體響應時(shí)間過(guò)長(cháng)的主要原因在于數據庫,但也不要因此就輕率地指責數據庫與DBA!造成數據庫繁忙的原因可能有以下幾種:
對數據庫的使用過(guò)于低效:錯誤的查詢(xún)設計、糟糕的應用程序邏輯、對于數據訪(fǎng)問(wèn)框架的配置不正確
糟糕的數據庫設計與數據結構:表的關(guān)聯(lián)、緩慢的存儲視圖、缺失的或錯誤的索引、過(guò)期的表統計信息
不恰當的數據庫配置,例如內存、磁盤(pán)、表空間、連接池等等
在本文中,我將著(zhù)重講解如何在應用程序端將訪(fǎng)問(wèn)數據庫所消耗的時(shí)間減至最低:
原文轉自:http://www.infoq.com/cn/articles/Diagnosing-Common-Java-Database-Performance-Hotspots