1 火焰圖介紹
性能調(diào)優(yōu)利器:火焰圖與《性能之巔》學(xué)習(xí)筆記之火焰圖 其之一都提到了《性能之巔》。
火焰圖(Flame Graph)是由 Linux 性能優(yōu)化大師 Brendan Gregg 發(fā)明的东揣,和所有其他的 profiling 方法不同的是嘶卧,火焰圖以一個(gè)全局的視野來看待時(shí)間分布,它從底部往頂部侦铜,列出所有可能導(dǎo)致性能瓶頸的調(diào)用棧钟鸵。(摘自性能調(diào)優(yōu)利器:火焰圖)
如何分析生成的火焰圖(摘自《性能之巔》學(xué)習(xí)筆記之火焰圖 其之一):
● 火焰圖頂部顯示了采樣過程中on CPU的方法棺耍。對(duì)CPU profiles,這些方法直接占用cpu資源俊卤。對(duì)于其他的profile害幅,這些方法導(dǎo)致了相關(guān)的內(nèi)核事件。
● 在火焰圖頂部尋找“高原”狀的方法狠怨,位于頂部的某個(gè)很寬的方法,表示其在采樣中大量出現(xiàn)棍苹。對(duì)于CPU profiles茵汰,這意味著這個(gè)方法經(jīng)常在CPU上運(yùn)行蹂午。
● 自頂向下看顯示了調(diào)用關(guān)系,上邊的方法被其下方的方法調(diào)用奥洼,以此類推晚胡。快速的從上往下瀏覽可以理解某個(gè)方法為什么被調(diào)用瓷患。
● 自底向上看顯示了代碼邏輯遣妥,提供了程序的全局視圖箫踩。底部的方法會(huì)調(diào)用其頂部的多個(gè)方法,以此類推锦担。自底向上看可以看到代碼的分支形成的多個(gè)小型的“塔尖”吱韭。
● box的寬度可以用來比較理盆,更寬的box意味著在采樣結(jié)果中更多的比例凑阶。
● 對(duì)于cpu profiles 來說,如果a方法比b方法寬姨俩,有可能是因?yàn)閍方法本身執(zhí)行需要使用比b方法更多的cpu。也有可能是a方法被調(diào)用的次數(shù)比b方法更頻繁调窍。采樣的最終結(jié)果并不能體現(xiàn)一個(gè)方法被調(diào)用多少次邓萨,所以這兩種情況都有可能菊卷。
● 如果一個(gè)方法頂部出現(xiàn)了兩個(gè)“大塔尖”,導(dǎo)致火焰圖中出現(xiàn)一個(gè)“大分叉”歉甚,這樣的方法很值得研究扑眉。兩個(gè)“塔尖”可能是被調(diào)用的兩個(gè)子方法腰素,也可能是條件語句的兩個(gè)不同分支。
2 性能分析
接下來以某微服務(wù)為例咧虎,來實(shí)際看一下如何優(yōu)化程序的性能计呈。
2.1 on-cpu 火焰圖
使用 arthas profiler 可以生成 on-cpu 火焰圖:
推薦閱讀 arthas 的中文社區(qū)
$profiler start -e cpu
分析:addIotdaData 方法中大部分時(shí)間都用于日志打印捌显,結(jié)合代碼查看,發(fā)現(xiàn)每接收到一條數(shù)據(jù)都打印了日志理肺,因此在日志打印上占用了較多的 CPU妹萨。
分析:addIotdaData 上使用了兩次 aop炫欺,大約占用了12%左右的 CPU品洛。
2.2 off-cpu 火焰圖
使用 arthas profiler 可以生成 off-cpu 火焰圖:
$profiler start -e lock
分析:絕大部分等待時(shí)間都是在 pulsar 的 producer 中,結(jié)合代碼查看帽揪,在發(fā)送數(shù)據(jù)時(shí)使用的是同步的方式转晰。
2.3 Hot/Cold 火焰圖
使用 arthas profiler 可以生成 Hot/Cold 火焰圖:
$profiler start -e wall
cacheToken 耗時(shí) 10%,結(jié)合業(yè)務(wù)發(fā)現(xiàn)防嗡,這部分邏輯是不需要的蚁趁,可優(yōu)化实胸。
分析:tomcat 中非業(yè)務(wù)處理部分的耗時(shí)約為 30%庐完,比實(shí)際業(yè)務(wù)處理的耗時(shí)(25%)還要多,因此考慮使用更高性能的 web 容器淆党,比如 netty讶凉。
使用 arthas profiler 可以生成內(nèi)存火焰圖:
$profiler start -e alloc
分析:未發(fā)現(xiàn)有內(nèi)存泄露的現(xiàn)象懂讯。
3 性能測(cè)試
性能測(cè)試的四個(gè)主要指標(biāo):
響應(yīng)時(shí)間:指應(yīng)用系統(tǒng)從發(fā)出請(qǐng)求開始到收到最后響應(yīng)數(shù)據(jù)所需要的時(shí)間褐望。響應(yīng)時(shí)間是系統(tǒng)最重要的性能指標(biāo),直觀的反映了系統(tǒng)的“快慢”实蔽。
并發(fā)數(shù):系統(tǒng)能夠同時(shí)處理請(qǐng)求的數(shù)目减宣,這個(gè)數(shù)字也反映了系統(tǒng)的負(fù)載特性。對(duì)于網(wǎng)站而言贼邓,并發(fā)數(shù)即系統(tǒng)并發(fā)用戶數(shù)塑径,指同時(shí)提交請(qǐng)求的用戶數(shù)目填具,于此相對(duì)應(yīng),還有在線用戶數(shù)(當(dāng)前登錄系統(tǒng)的用戶數(shù))和系統(tǒng)用戶數(shù)(可能訪問系統(tǒng)的總用戶數(shù))誉简。
吞吐量:指單位時(shí)間內(nèi)系統(tǒng)處理的請(qǐng)求的數(shù)量盟广,體現(xiàn)件系統(tǒng)的處理能力筋量。對(duì)于網(wǎng)站,可以用“請(qǐng)求數(shù)/秒”或是“頁(yè)面數(shù)/秒”來衡量肋拔,也可以用“訪問人數(shù)/天”或是“處理的業(yè)務(wù)數(shù)/小時(shí)”等來衡量呀酸。TPS(每秒事務(wù)數(shù))也是吞吐量的一個(gè)指標(biāo)性誉,此外還有 HPS(每秒 HTTP 請(qǐng)求數(shù)),QPS(每秒查詢數(shù))等爆存。
吞吐量 = ( 1000 / 響應(yīng)時(shí)間 ms ) × 并發(fā)數(shù)
性能計(jì)數(shù)器:是描述服務(wù)器或操作系統(tǒng)性能的一些數(shù)據(jù)指標(biāo)蝗砾。包括 System Load悼粮、對(duì)象與線程數(shù)、內(nèi)存使用菜循、CPU 使用申尤、磁盤與網(wǎng)絡(luò) I/O 等指標(biāo)衙耕。這些指標(biāo)也是系統(tǒng)監(jiān)控的重要參數(shù)橙喘,對(duì)這些指標(biāo)設(shè)置報(bào)警閥值胶逢,當(dāng)監(jiān)控系統(tǒng)發(fā)現(xiàn)性能計(jì)數(shù)器超過閥值的時(shí)候初坠,就向運(yùn)維和開發(fā)人員報(bào)警,及時(shí)發(fā)現(xiàn)處理系統(tǒng)異常锁保。
上述內(nèi)容摘自:性能壓測(cè)的時(shí)候南誊,隨著并發(fā)壓力的增加抄囚,系統(tǒng)響應(yīng)時(shí)間和吞吐量如何變化
不同并發(fā)下的性能表現(xiàn):
分析:200并發(fā)情況下,TPS與Response Time都比較穩(wěn)定穴亏,300并發(fā)時(shí)重挑,性能下降的比較厲害谬哀,250并發(fā)時(shí),性能開始下降且變得不穩(wěn)定谦屑。因此可以認(rèn)為篇梭,系統(tǒng)能夠穩(wěn)定支持的并發(fā)數(shù)在200左右恬偷,TPS在1800左右,響應(yīng)時(shí)間在50ms左右坦康。