第33講后臺(tái)服務(wù)出現(xiàn)明顯變慢談?wù)勀愕脑\斷思路_第1頁(yè)
第33講后臺(tái)服務(wù)出現(xiàn)明顯變慢談?wù)勀愕脑\斷思路_第2頁(yè)
第33講后臺(tái)服務(wù)出現(xiàn)明顯變慢談?wù)勀愕脑\斷思路_第3頁(yè)
第33講后臺(tái)服務(wù)出現(xiàn)明顯變慢談?wù)勀愕脑\斷思路_第4頁(yè)
第33講后臺(tái)服務(wù)出現(xiàn)明顯變慢談?wù)勀愕脑\斷思路_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第33講 | 服務(wù)出現(xiàn)明顯“變慢”,談?wù)勀愕?思路?2018-07-212018/7/23極客時(shí)間 | Java 技術(shù)36講第33講 | 服務(wù)出現(xiàn)明顯“變慢”,談?wù)勀愕?思路?朗讀人: 1018 | 4.72M在日常工作中,應(yīng)用或者系統(tǒng)出現(xiàn)性能問(wèn)題往往是不可避免的,除了在有一定規(guī)模的 IT 企業(yè)或者專注于特定性能領(lǐng)域的企業(yè),可能大多數(shù)工程師并 成為專職的性能工程師,但是掌握基本的性能知識(shí)和技能,往往是日常工作的需要,并且也是工程師進(jìn)階的必要條件之一,能 位和解決性能問(wèn)題也是對(duì)你知識(shí)、技能和能力的檢驗(yàn)。我要問(wèn)你的問(wèn)題是, 服務(wù)出現(xiàn)明顯“變慢”,談?wù)勀愕?思路?典型回答首先,需要對(duì)這個(gè)問(wèn)題進(jìn)行更加

2、清晰的定義:服務(wù)是突然變慢還是長(zhǎng)時(shí)間運(yùn)行后觀察到變慢?類似問(wèn)題是否重復(fù)出現(xiàn)?“慢”的定義是什么,我能夠理解是系統(tǒng)對(duì)其他方面的請(qǐng)求的反應(yīng)延時(shí)變長(zhǎng)嗎? 第二,理清問(wèn)題的癥狀,這更便于定位具體的 ,有以下一些思路:?jiǎn)栴}可能來(lái)自于 Java 服務(wù)自身,也可能僅僅是受系統(tǒng)里其他服務(wù)的影響。初始可以先確認(rèn)是否出現(xiàn)了意外的程序錯(cuò)誤,例如檢查應(yīng)用本身的錯(cuò)誤日志。 1/72018/7/23極客時(shí)間 | Java 技術(shù)36講對(duì)于分布式系統(tǒng),很多公司都會(huì)實(shí)現(xiàn)更 的日志、性能等 系統(tǒng)。一些 Java 工具也可以用于這個(gè) ,例如通過(guò) JFR(Java Flight Recorder), 應(yīng)用是否大量出現(xiàn)了某種類型的異常

3、。如果有,那么異常可能就是個(gè) 點(diǎn)。如果沒(méi)有,可以先檢查系統(tǒng)級(jí)別的資源等情況, CPU、內(nèi)存等資源是否被其他進(jìn)程大量占用,并且這種占用是否不符合系統(tǒng)正常運(yùn)行狀況。Java 服務(wù)自身,例如 GC 日志里面是否觀察到 Full GC 等惡劣情況出現(xiàn),或者是否Minor GC 在變長(zhǎng)等;利用 jstat 等工具,獲取內(nèi)存使用的統(tǒng)計(jì)也是個(gè)常用 ;利用jstack 等工具檢查是否出現(xiàn)死鎖等。如果還不能確定具體問(wèn)題,對(duì)應(yīng)用進(jìn)行 Profiling 也是個(gè)辦法,但因?yàn)樗鼤?huì)對(duì)系統(tǒng)產(chǎn)生侵入性,如果不是非常必要,大多數(shù)情況下并不建議在生產(chǎn)系統(tǒng)進(jìn)行。定位了程序錯(cuò)誤或者 JVM 配置的問(wèn)題后,就可以采取相應(yīng)的補(bǔ)救措施,

4、然后驗(yàn)證是否解決, 否則還需要重復(fù)上面部分過(guò)程??键c(diǎn)分析我選擇的是一個(gè)常見(jiàn)的并且比較貼近實(shí)際應(yīng)用的的性能相關(guān)問(wèn)題,我提供的回答 兩部分。在正面回答之前,先探討更加精確的問(wèn)題定義是什么。有時(shí)候面試官并沒(méi)有表達(dá)清楚,有必 要確認(rèn) 的理解正確,然后再深入回答。從系統(tǒng)、應(yīng)用的不同角度、不同層次,逐步將問(wèn)題域盡量縮 離出真實(shí) 。具體步驟未必千篇一律,在處理過(guò)較多這種問(wèn)題之后,經(jīng)驗(yàn)會(huì)令你的直覺(jué)分外敏感。大多數(shù)工程師也許并沒(méi)有全面的性能問(wèn)題 機(jī)會(huì),如果被問(wèn)到也不必過(guò)于緊張,你可以向面試官展示 問(wèn)題的思考方式,展現(xiàn) 的知識(shí)和綜合運(yùn)用的能力。接觸到一個(gè)陌生的問(wèn)題,通過(guò),能夠條理清晰地將排查方案逐步確定下來(lái),也是

5、能力的體現(xiàn)。面試官可能會(huì) 某個(gè)角度的深入詢問(wèn),兼顧工作和面試的需求,我會(huì) 下面一些方面進(jìn)行 。目的是讓你對(duì)性能分析有個(gè)整體的印象,在遇到特定領(lǐng)域問(wèn)題時(shí),即使不知道具體細(xì)節(jié)的工具和 ,至少也可以找到探索、的方向。我將 業(yè)界常見(jiàn)的性能分析 論。從系統(tǒng)分析到 JVM、應(yīng)用性能分析,把握整體思路和主要工具。對(duì)于線程狀態(tài)、JVM 內(nèi)存使用等很多方面,我在專欄前面已經(jīng)陸陸續(xù)續(xù) 了很多, 這一講也可以看作是聚焦性能角度的一個(gè)小結(jié)。2/72018/7/23極客時(shí)間 | Java 技術(shù)36講如果你有 進(jìn)行系統(tǒng)性的學(xué)習(xí),我建議參考 Hunt 編撰的Java Performance或者Scott Oaks 的Jav

6、a Performance:The Definitive Guide。另外,如果不希望出現(xiàn)理解偏差,最好是閱讀英文版。知識(shí)擴(kuò)展首先,我們來(lái)了解一下業(yè)界最廣泛的性能分析 論。根據(jù)系統(tǒng)架構(gòu)不同,分布式系統(tǒng)和大型單體應(yīng)用也 著思路的區(qū)別,例如,分布式系統(tǒng)的性能瓶頸可能更加集中。傳統(tǒng)意義上的性能調(diào)優(yōu)大多是 單體應(yīng)用的調(diào)優(yōu),專欄的側(cè)重點(diǎn)也是如此, Hunt 曾將其論總結(jié)為兩類:自上而下。從應(yīng)用的頂層,逐步深入到具體的不同模塊,或者更 的技術(shù)細(xì)節(jié)單元,找到可能的問(wèn)題和解決辦法。這是最常見(jiàn)的性能分析思路,也是大多數(shù)工程師的選擇。自下而上。從類似 CPU 這種硬件底層,類似Cache-Miss之類的問(wèn)題和調(diào)優(yōu)

7、機(jī)會(huì),出發(fā)點(diǎn)是指令級(jí)別優(yōu)化。這往往是專業(yè)的性能工程師才能掌握的技能,并且需要專業(yè)工具配合, 大多數(shù)是移植到新的平臺(tái)上,或需要提供極致性能時(shí) 進(jìn)行。例如,將大數(shù)據(jù)應(yīng)用移植到 SPARC 體系結(jié)構(gòu)的硬件上,需要對(duì)比和盡量性能潛力,但又希望盡量不改源代碼。我所給出的回答,首先是試圖排除功能性錯(cuò)誤,然后就是典型的自上而下分析思路。第二,我們一起來(lái)看看自上而下分析中,各個(gè)階段的常見(jiàn)工具和思路。需要注意的是,具體的工 具在不同的操作系統(tǒng)上可能區(qū)別非常大。系統(tǒng)性能分析中,CPU、內(nèi)存和 IO 是主要關(guān)注項(xiàng)。對(duì)于 CPU,如果是常見(jiàn)的 Linux,可以先用 top 命令查看負(fù)載狀況,下圖是我截取的一個(gè)狀態(tài)???/p>

8、以看到,其平均負(fù)載(load average)的三個(gè)值(分別是 1 分鐘、5 分鐘、15 分鐘)非常低,并且暫時(shí)看并沒(méi)有升高跡象。如果這些數(shù)值非常高(例如,超過(guò) 50%、60%),并且短期平均值高于長(zhǎng)期平均值,則表明負(fù)載很重;如果還有升高的趨勢(shì),那么就要非常警惕了。3/72018/7/23極客時(shí)間 | Java 技術(shù)36講進(jìn)一步的排查有很多思路,例如,我在專欄第 18 講曾經(jīng)問(wèn)過(guò),怎么找到最耗費(fèi) CPU 的 Java 線程,簡(jiǎn)要 步驟:top H利用 top 命令獲取相應(yīng) pid,“-H”代表 th 模式,你可以配合 grep 命令更精準(zhǔn)定位。然后轉(zhuǎn)換成為 16 進(jìn)制。printf "

9、;%x" your_pid最后利用 jstack 獲取的線程棧,對(duì)比相應(yīng)的 ID 即可。vmstat -1 -10當(dāng)然,還有更加通用的 方向,利用 vmstat 之類,查看上下文切換的數(shù)量,比如下面就是指定時(shí)間間隔為 1,收集 10 次。輸出如下:如果每秒上下文(cs,context switch)切換很高,并且比系統(tǒng)中斷高很多(in,system interrupt),就表明很有可能是因?yàn)椴缓侠淼亩嗑€程調(diào)度所導(dǎo)致。當(dāng)然還需要利用pidstat等手段,進(jìn)行更加具體的定位,我就不再進(jìn)一步展開(kāi)了。除了 CPU,內(nèi)存和 IO 是重要的注意事項(xiàng),比如:利用 之類查看內(nèi)存使用?;蛘?,進(jìn)一步 s

10、wap 使用情況,top 命令輸出中 Virt 作為虛擬內(nèi)存使用量,就是物理內(nèi)存(Res)和 swap 求和,所以可以反推 swap 使用。顯然,JVM 是不希望發(fā)生大量的swap 使用的。4/72018/7/23極客時(shí)間 | Java 技術(shù)36講對(duì)于 IO 問(wèn)題,既可能發(fā)生在磁盤(pán) IO,也可能是網(wǎng)絡(luò) IO。例如,利用 iostat 等命令有助于磁盤(pán)的健康狀況。我曾經(jīng)幫助 過(guò) Java 服務(wù)部署在國(guó)內(nèi)的某云廠商機(jī)器上,其 就是 IO 表現(xiàn)較差,拖累了整體性能,解決辦法就是申請(qǐng)?zhí)鎿Q了機(jī)器。講到這里,如果你對(duì)系統(tǒng)性能非常感 ,我建議參考Brendan Gregg提供的完整圖譜,我所的只能算是九牛一

11、毛。但我還是建議盡量結(jié)合實(shí)際需求,免得迷失在其中。對(duì)于JVM 層面的性能分析,我們已經(jīng) 過(guò)非常多了: 利用 JMC、JConsole 等工具進(jìn)行運(yùn)行時(shí) 。利用各種工具,在運(yùn)行 堆轉(zhuǎn)儲(chǔ)分析,或者獲取各種角度的統(tǒng)計(jì)數(shù)據(jù)(如jstat -gcutil 分析 GC、內(nèi)存分帶等)。,GC 日志等Full GC、Minor GC,或者 堆積等。這里并不 放之四海而皆準(zhǔn)的辦法,具體問(wèn)題可能非常不同,還要看你是否能否充分利用這些工具,從種種跡象之中,逐步 出問(wèn)題所在。對(duì)于應(yīng)用Profiling,簡(jiǎn)單來(lái)說(shuō)就是利用一些侵入性的 ,收集程序運(yùn)行時(shí)的細(xì)節(jié),以定位性能問(wèn)題瓶頸。所謂的細(xì)節(jié),就是例如內(nèi)存的使用情況、最頻繁

12、調(diào)用的 是什么,或者上下文切換的情況等。5/72018/7/23極客時(shí)間 | Java 技術(shù)36講我在前面給出的典型回答里提到, 不建議生產(chǎn)系統(tǒng)進(jìn)行 Profiling,大多數(shù)是在性能測(cè)試階段進(jìn)行。但是,當(dāng)生產(chǎn)系統(tǒng)確實(shí) 這種需求時(shí),也不是沒(méi)有選擇。我建議使用 JFR 配合JMC 來(lái)做 Profiling,因?yàn)樗菑?Hotspot JVM 內(nèi)部收集底層 ,并經(jīng)過(guò)了大量?jī)?yōu)化,性能開(kāi)銷(xiāo)非常低,通常是低于 2% 的;并且如此強(qiáng)大的工具,也已經(jīng)被 Oracle 開(kāi)源出來(lái)!所以,JFR/JMC 完全具備了生產(chǎn)系統(tǒng) Profiling 的能力,目前也確實(shí)在真正大規(guī)模部署的云上使用過(guò)相關(guān)技術(shù),快速地定位了問(wèn)

13、題。Jcmd <pid> JFR.start duration=120s filename=myrecording.jfr它的使用也非常方便,你不需要重新啟動(dòng)系統(tǒng)或者提前增加配置。例如,你可以在運(yùn)行時(shí)啟動(dòng)JFR ,并將這段時(shí)間的 寫(xiě)入文件:然后,使用 JMC 打開(kāi)“.jfr 文件”就可以進(jìn)行分析了, 、異常、線程、IO 等應(yīng)有盡有,其功能非常強(qiáng)大。如果你想了解 細(xì)節(jié),可以參考相關(guān)指南。我從一個(gè)典型性能問(wèn)題出發(fā),從癥狀表現(xiàn)到具體的系統(tǒng)分析、JVM 分析,系統(tǒng)性地整理了常見(jiàn)性能分析的思路;并且在知識(shí)擴(kuò)展部分,從 論和實(shí)際操作的角度,讓你將理論和實(shí)際結(jié)合,相信一定可以對(duì)你有所幫助。一課一練關(guān)于 我們討論的題目你做到心中有數(shù)了嗎? 的思考題是,Profiling 工具獲取數(shù)據(jù)的主要方式有哪些?各有什么優(yōu)缺點(diǎn)。請(qǐng)你在留言區(qū)寫(xiě)寫(xiě)你對(duì)這個(gè)問(wèn)題的思考,我會(huì)選出經(jīng)過(guò)認(rèn)真思考的留言,送給你一份學(xué)習(xí)獎(jiǎng)勵(lì)禮券,歡迎你與我一起討論。你的朋友是不是也在準(zhǔn)備面試呢?你可以“請(qǐng)朋友讀”,把 的題目 給好友

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論