性能分析
1.前提
性能分析的前提除了需要豐富的性能測(cè)試監(jiān)控(如PTS(Performance Testing Service)自身的客戶側(cè)監(jiān)控牲览、基礎(chǔ)類監(jiān)控-阿里云監(jiān)控徽惋、應(yīng)用類 監(jiān)控-ARMS監(jiān)控等)惩坑,還需要具備相關(guān)的技術(shù)知識(shí)(包括但不限于:操作系統(tǒng)、中間件泽篮、數(shù)據(jù)庫(kù)唐断、開發(fā)等)。
2.流程
a : 跟進(jìn)以往經(jīng)驗(yàn)澎怒,出現(xiàn)TPS不達(dá)標(biāo)的情況褒搔,優(yōu)先查看硬件資源使用率,可以很快速直觀的看到資源使用情況來深入分析喷面,例如應(yīng)用服務(wù)器 和 數(shù)據(jù)庫(kù)服務(wù)器 的CPU星瘾,Memory,Disk I/O惧辈,Network I/O琳状,如果是某個(gè)硬件指標(biāo)有問題,需要深入的進(jìn)行分析盒齿。
監(jiān)控工具:阿里云念逞、亞馬遜云 或 自己搭建的grafana等平臺(tái)均可以監(jiān)控。b: 如果說上面步驟資源消耗正常边翁,沒有出現(xiàn)飆高的情況翎承,可以先從網(wǎng)絡(luò)接入層開始進(jìn)行分析。很多情況下壓測(cè)流量并沒有完全進(jìn)入到后端(服務(wù)端)符匾,在網(wǎng)絡(luò)接入層(云化的架構(gòu),例如:SLB/WAF/高防IP,甚至是CDN/全站加速等)可能就會(huì)出現(xiàn)由于各種規(guī)格(帶寬甸各、最大連接數(shù)垛贤、新建連接數(shù)等)限制或者因?yàn)閴簻y(cè)的某些特征符合DDoS(Distributed Denial of Service分布式阻斷服務(wù))的行為而觸發(fā)了防護(hù)策略導(dǎo)致壓測(cè)結(jié)果達(dá)不到預(yù)期。
c: 接著看關(guān)鍵指標(biāo)是否滿足要求趣倾,如果不滿足聘惦,需要確定是哪個(gè)地方有問題,一般情況下誊酌,服務(wù)器端問題可能性比較大部凑,也有可能是客戶端問題(這種情況非常小)碧浊。
d: 如果硬件指標(biāo)都沒有問題,需要查看中間件相關(guān)指標(biāo)瘟仿,例如:線程池箱锐、連接池、GC等劳较,如果是這些指標(biāo)問題驹止,需要深入的分析。
e: 如果中間件相關(guān)指標(biāo)沒問題观蜗,需要查看數(shù)據(jù)庫(kù)相關(guān)指標(biāo)臊恋,例如:慢查SQL、命中率墓捻、鎖抖仅、參數(shù)設(shè)置。
-
f: 如果以上指標(biāo)都正常砖第,應(yīng)用程序的算法撤卢、緩沖、緩存梧兼、同步或異步可能有問題放吩,需要具體深入的分析。
image.png
3.可能瓶頸點(diǎn)
硬件羽杰、規(guī)格上的瓶頸
一般指的是CPU渡紫、內(nèi)存、磁盤I/O方面的問題考赛,分為服務(wù)器硬件瓶頸惕澎、網(wǎng)絡(luò)瓶頸(對(duì)局域網(wǎng)可以不考慮)。中間件上的性能瓶頸
一般指的是應(yīng)用服務(wù)器欲虚、web服務(wù)器等應(yīng)用軟件集灌,還包括數(shù)據(jù)庫(kù)系統(tǒng)。 例如:中間件weblogic平臺(tái)上配置的JDBC連接池的參數(shù)設(shè)置不合理,造成的瓶頸欣喧。應(yīng)用程序上的性能瓶頸
一般指的是開發(fā)人員開發(fā)出來的應(yīng)用程序腌零。 例如,JVM參數(shù)不合理唆阿,容器配置不合理益涧,慢SQL(可使用阿里云APM類產(chǎn)品如ARMS協(xié)助定位),數(shù)據(jù)庫(kù)設(shè)計(jì)不合理驯鳖,程序架構(gòu)規(guī)劃不合理闲询,程序本身設(shè)計(jì)有問題(串行處理、請(qǐng)求的處理線程不夠浅辙、無緩沖扭弧、無緩存、生產(chǎn)者和消費(fèi)者不協(xié)調(diào)等)记舆,造成系統(tǒng)在大量用戶訪問時(shí)性能低下而造成的瓶頸鸽捻。操作系統(tǒng)上的性能瓶頸
一般指的是windows、UNIX泽腮、Linux等操作系統(tǒng)御蒲。 例如,在進(jìn)行性能測(cè)試诊赊,出現(xiàn)物理內(nèi)存不足時(shí)厚满,虛擬內(nèi)存設(shè)置也不合理,虛擬內(nèi)存的交換效率就會(huì)大大降低碧磅,從而導(dǎo)致行為的響應(yīng)時(shí)間大大增加碘箍,這時(shí)認(rèn)為操作系統(tǒng)上出現(xiàn)性能瓶頸。網(wǎng)絡(luò)設(shè)備上的性能瓶頸
一般指的是防火墻续崖、動(dòng)態(tài)負(fù)載均衡器敲街、交換機(jī)等設(shè)備。當(dāng)前更多的云化服務(wù)架構(gòu)使用的網(wǎng)絡(luò)接入產(chǎn)品:包括但不限于SLB严望、WAF多艇、高防IP、CDN像吻、全站加速等等峻黍。 例如,在動(dòng)態(tài)負(fù)載均衡器上設(shè)置了動(dòng)態(tài)分發(fā)負(fù)載的機(jī)制拨匆,當(dāng)發(fā)現(xiàn)某個(gè)應(yīng)用服務(wù)器上的硬件資源已經(jīng)到達(dá)極限時(shí)姆涩,動(dòng)態(tài)負(fù)載均衡器將后續(xù)的交易請(qǐng)求發(fā)送到其他負(fù)載較輕的應(yīng)用服務(wù)器上。在測(cè)試時(shí)發(fā)現(xiàn)惭每,動(dòng)態(tài)負(fù)載均衡器沒有起到相應(yīng)的作用骨饿,這時(shí)可以認(rèn)為網(wǎng)絡(luò)瓶頸亏栈。
4.方法
-
CPU
CPU資源利用率很高的話,需要看CPU消耗User宏赘、Sys绒北、Wait哪種狀態(tài)。- 如果CPU User非常高察署,需要查看消耗在哪個(gè)進(jìn)程闷游,可以用top(linux)命令看出,接著用top –H –p <pid>看哪個(gè)線程消耗資源高贴汪。如果是Java應(yīng)用脐往,就可以用jstack看出此線程正在執(zhí)行的堆棧,看資源消耗在哪個(gè)方法上扳埂,查看源代碼就知道問題所在业簿;如果是c++應(yīng)用,可以用gprof性能工具進(jìn)行分析聂喇。
- 如果CPU Sys非常高辖源,可以用strace(linux)看系統(tǒng)調(diào)用的資源消耗及時(shí)間。
- 如果CPU Wait非常高希太,考慮磁盤讀寫了,可以通過減少日志輸出酝蜒、異步或換速度快的硬盤誊辉。
Memory
操作系統(tǒng)為了最大化利用內(nèi)存,一般都設(shè)置大量的cache亡脑,因此堕澄,內(nèi)存利用率高達(dá)99%并不是問題,內(nèi)存的問題主要看某個(gè)進(jìn)程占用的內(nèi)存是否非常大以及是否有大量的swap(虛擬內(nèi)存交換)霉咨。磁盤I/O
磁盤I/O一個(gè)最顯著的指標(biāo)是繁忙率蛙紫,可以通過減少日志輸出、異步或換速度快的硬盤來降低繁忙率途戒。網(wǎng)絡(luò)I/O
網(wǎng)絡(luò)I/O主要考慮傳輸內(nèi)容大小坑傅,不能超過硬件網(wǎng)絡(luò)傳輸?shù)淖畲笾?0%,可以通過壓縮減少內(nèi)容大小喷斋、在本地設(shè)置緩存以及分多次傳輸?shù)炔僮魈岣呔W(wǎng)絡(luò)I/O性能唁毒。內(nèi)核參數(shù)
內(nèi)核參數(shù)一般都有默認(rèn)值,這些內(nèi)核參數(shù)默認(rèn)值對(duì)于一般系統(tǒng)沒問題星爪,但是對(duì)于壓力測(cè)試來說浆西,可能運(yùn)行的參數(shù)將會(huì)超過內(nèi)核參數(shù),導(dǎo)致系統(tǒng)出現(xiàn)問題顽腾,可以用sysctl來查看及修改近零。JVM
JVM主要分析GC/FULL GC是否頻繁,以及垃圾回收的時(shí)間,可以用jstat命令來查看久信,對(duì)于每個(gè)代大小以及GC頻繁窖杀,通過jmap將內(nèi)存轉(zhuǎn)儲(chǔ),再借助工具HeapAnalyzer來分析哪地方占用的內(nèi)存較高以及是否有內(nèi)存泄漏可能入篮。簡(jiǎn)單點(diǎn)可以使用APM工具陈瘦,例如阿里云ARMS。線程池
如果線程不夠用潮售,可以通過參數(shù)調(diào)整痊项,增加線程;對(duì)于線程池中的線程設(shè)置比較大的情況酥诽,還是不夠用可能的原因是:某個(gè)線程被阻塞來不及釋放鞍泉,可能在等鎖、方法耗時(shí)較長(zhǎng)肮帐、數(shù)據(jù)庫(kù)等待時(shí)間很長(zhǎng)等原因?qū)е驴裕枰M(jìn)一步分析才能定位。JDBC連接池
連接池不夠用的情況下训枢,可以通過參數(shù)進(jìn)行調(diào)整增加托修;但是對(duì)于數(shù)據(jù)庫(kù)本身處理很慢的情況下,調(diào)整沒有多大的效果恒界,需要查看數(shù)據(jù)庫(kù)方面以及因代碼導(dǎo)致連接未釋放的原因睦刃。-
SQL
SQL效率低下也是導(dǎo)致性能差的一個(gè)非常重要的原因,可以通過查看執(zhí)行計(jì)劃看SQL慢在哪里十酣,一般情況涩拙,SQL效率低下原因主要有:
SQL問題列表
調(diào)優(yōu)
1.調(diào)優(yōu)步驟
確定問題
應(yīng)用程序代碼:在通常情況下,很多程序的性能問題都是寫出來的耸采,因此對(duì)于發(fā)現(xiàn)瓶頸的模塊兴泥,應(yīng)該首先檢查一下代碼。
數(shù)據(jù)庫(kù)配置:經(jīng)常引起整個(gè)系統(tǒng)運(yùn)行緩慢虾宇,一些諸如大型數(shù)據(jù)庫(kù)都是需要DBA進(jìn)行正確的參數(shù)調(diào)整才能投產(chǎn)的搓彻。
操作系統(tǒng)配置:不合理就可能引起系統(tǒng)瓶頸。
硬件設(shè)置:硬盤速度文留、內(nèi)存大小等都是容易引起瓶頸的原因好唯,因此這些都是分析的重點(diǎn)。
網(wǎng)絡(luò):網(wǎng)絡(luò)負(fù)載過重導(dǎo)致網(wǎng)絡(luò)沖突和網(wǎng)絡(luò)延遲燥翅。分析問題
當(dāng)確定了問題之后骑篙,我們要明確這個(gè)問題影響的是響應(yīng)時(shí)間吞吐量,還是其他問題森书?
是多數(shù)用戶還是少數(shù)用戶遇到了問題靶端?如果是少數(shù)用戶谎势,這幾個(gè)用戶與其它用戶的操作有什么不同?
系統(tǒng)資源監(jiān)控的結(jié)果是否正常杨名?CPU的使用是否到達(dá)極限脏榆?I/O情況如何?
問題是否集中在某一類模塊中台谍?
是客戶端還是服務(wù)器出現(xiàn)問題须喂? 系統(tǒng)硬件配置是否夠用?
實(shí)際負(fù)載是否超過了系統(tǒng)的負(fù)載能力趁蕊? 是否未對(duì)系統(tǒng)進(jìn)行優(yōu)化坞生?
通過這些分析及一些與系統(tǒng)相關(guān)的問題,可以對(duì)系統(tǒng)瓶頸有更深入的了解掷伙,進(jìn)而分析出真正的原因是己。確定調(diào)整目標(biāo)和解決方案
高系統(tǒng)吞吐量,縮短響應(yīng)時(shí)間任柜,更好地支持并發(fā)卒废。測(cè)試解決方案
對(duì)通過解決方案調(diào)優(yōu)后的系統(tǒng)進(jìn)行基準(zhǔn)測(cè)試。(基準(zhǔn)測(cè)試是指通過設(shè)計(jì)科學(xué)的測(cè)試方法宙地、測(cè)試工具和測(cè)試系統(tǒng)摔认,實(shí)現(xiàn)對(duì)一類測(cè)試對(duì)象的某項(xiàng)性能指標(biāo)進(jìn)行定量的和可對(duì)比的測(cè)試)。分析調(diào)優(yōu)結(jié)果
系統(tǒng)調(diào)優(yōu)是否達(dá)到或者超出了預(yù)定目標(biāo)宅粥;系統(tǒng)是整體性能得到了改善级野,還是以系統(tǒng)某部分性能來解決其他問題;調(diào)優(yōu)是否可以結(jié)束了粹胯。 最后,如果達(dá)到了預(yù)期目標(biāo)辰企,調(diào)優(yōu)工作可以先告一段落风纠。
- 調(diào)優(yōu)注意事項(xiàng)
- 在應(yīng)用系統(tǒng)的設(shè)計(jì)開發(fā)過程中,應(yīng)始終把性能放在考慮的范圍內(nèi)牢贸,將性能測(cè)試常態(tài)化竹观,日常化的內(nèi)網(wǎng)的性能測(cè)試+定期的真實(shí)環(huán)境的業(yè)務(wù)性能測(cè)試潜索,PTS都可以支持臭增。
- 確定清晰明確的性能目標(biāo)是關(guān)鍵,進(jìn)而將目標(biāo)轉(zhuǎn)化為PTS中的壓測(cè)場(chǎng)景并設(shè)置好需要的目標(biāo)量級(jí)竹习,然后視情況選擇并發(fā)誊抛、TPS模式,自動(dòng)遞增/手工調(diào)速的組合進(jìn)行流量控制整陌。
- 必須保證調(diào)優(yōu)后的程序運(yùn)行正確拗窃。
- 系統(tǒng)的性能更大程度上取決于良好的設(shè)計(jì)瞎领,調(diào)優(yōu)技巧只是一個(gè)輔助手段。
- 調(diào)優(yōu)過程是迭代漸進(jìn)的過程随夸,每一次調(diào)優(yōu)的結(jié)果都要反饋到后續(xù)的代碼開發(fā)中去九默。
- 性能調(diào)優(yōu)不能以犧牲代碼的可讀性和可維護(hù)性為代價(jià)。