精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 應用壓測性能問題定位經(jīng)驗分享

開發(fā) 新聞
問題千千萬,但只要修練了足夠深厚的內(nèi)功,形成一套屬于自己的排查問題思路和打法,再加上一套支撐問題排查的工具,憑借已有的經(jīng)驗還有偶發(fā)到來的那一絲絲靈感,相信所有的問題都會迎刃而解。

什么是壓測

壓測,即壓力測試,是確立系統(tǒng)穩(wěn)定性的一種測試方法,通常在系統(tǒng)正常運作范圍之外進行,以考察其功能極限和和可能存在的隱患。

壓測主要用于檢測服務器的承受能力,包括用戶承受能力,即多少用戶同時使用系統(tǒng)時基本不影響質量、流量承受等。另外,通過諸如疲勞測試還能發(fā)現(xiàn)系統(tǒng)一些穩(wěn)定性的問題,比如是否存在連接池中的連接被耗盡,內(nèi)存被耗盡,線程池被耗盡,這些只能通過疲勞測試來進行發(fā)現(xiàn)定位。

為什么要壓測

壓測的目的就是通過模擬真實用戶的行為,測算出機器的性能(單臺機器的 QPS、TPS),從而推算出系統(tǒng)在承受指定用戶數(shù)(100 W)時,需要多少機器能支撐得住。因此在進行壓測時一定要事先設定壓測目標值,這個值不能太小,也不能太大,按照目前業(yè)務預估的增長量來做一個合理的評估。壓測是在上線前為了應對未來可能達到的用戶數(shù)量的一次預估(提前演練),壓測以后通過優(yōu)化程序的性能或準備充足的機器,來保證用戶的體驗。壓測還能探測應用系統(tǒng)在出現(xiàn)交易洪峰時穩(wěn)定性情況,以及可能出現(xiàn)的一些問題,發(fā)現(xiàn)應用系統(tǒng)薄弱一環(huán),從而更有針對性地進行加強。

壓測

這幾種測試可以穿插進行,一般會在壓力測試性能指標達標后,再安排耐久性測試。

壓測名詞解釋

常見的壓測工具

ab

ApacheBench 是 Apache 服務器自帶的一個 web 壓力測試工具,簡稱 ab。ab 又是一個命令行工具,對發(fā)起負載的本機要求很低,根據(jù) ab 命令可以創(chuàng)建很多的并發(fā)訪問線程,模擬多個訪問者同時對某一 URL 地址進行訪問,因此可以用來測試目標服務器的負載壓力。總的來說 ab 工具小巧簡單,上手學習較快,可以提供需要的基本性能指標,但是沒有圖形化結果,不能監(jiān)控。

Jmeter

Apache JMeter 是 Apache 組織開發(fā)的基于 Java 的壓力測試工具。用于對軟件做壓力測試,它最初被設計用于 Web 應用測試,但后來擴展到其他測試領域。

JMeter 能夠對應用程序做功能/回歸測試,通過創(chuàng)建帶有斷言的腳本來驗證你的程序返回了你期望的結果。

JMeter 的功能過于強大,這里暫時不介紹用法,可以查詢相關文檔使用(參考文獻中有推薦的教程文檔)

LoadRunner

LoadRunner 是 HP(Mercury)公司出品的一個性能測試工具,功能非常強大,很多企業(yè)級客戶都在使用,具體請參考官網(wǎng)鏈接。

阿里云PTS

性能測試 PTS(Performance Testing Service)是一款性能測試工具。支持按需發(fā)起壓測任務,可提供百萬并發(fā)、千萬 TPS 流量發(fā)起能力,100% 兼容 JMeter。提供的場景編排、API 調(diào)試、流量定制、流量錄制等功能,可快速創(chuàng)建業(yè)務壓測腳本,精準模擬不同量級用戶訪問業(yè)務系統(tǒng),幫助業(yè)務快速提升系統(tǒng)性能和穩(wěn)定性。

作為阿里內(nèi)部使用多年的性能測試工具,PTS 具備如下特性:

  1. 免運維、開箱即用。SaaS化施壓、最大支持百萬級并發(fā)、千萬級TPS流量自助發(fā)起能力。
  2. 支持多協(xié)議HTTP1.1/HTTP2/JDBC/MQTT/Kafka/RokectMq/Redis/Websocket/RMTP/HLS/TCP/UDP/SpringCloud/Dubbo/Grpc 等主流協(xié)議。
  3. 支持流量定制。全球施壓地域定制/運營商流量定制/IPv6 流量定制。
  4. 穩(wěn)定、安全。阿里自研引擎、多年雙十一場景打磨、支持 VPC 網(wǎng)絡壓測。
  5. 性能壓測一站式解決方案。** 0 編碼構建復雜壓測場景,覆蓋壓測場景構建、壓測模型設定、發(fā)起壓力、分析定位問題、出壓測報告完整的壓測生命周期。
  6. 100% 兼容開源 JMeter。
  7. 提供安全、無侵入的生產(chǎn)環(huán)境寫壓測解決方案。

壓測工具的比較

如何選擇壓測工具

這個世界上沒有最好的工具,只有最適合的工具,工具千千萬,選擇一款適合你的才是最重要的,在實際使用中有各種場景,讀者可以結合壓測步驟來確定適合自己的工具:

  1. 確定性能壓測目標:性能壓測目標可能源于項目計劃、業(yè)務方需求等
  2. 確定性能壓測環(huán)境:為了盡可能發(fā)揮性能壓測作用,性能壓測環(huán)境應當盡可能同線上環(huán)境一致
  3. 確定性能壓測通過標準:針對性能壓測目標以及選取的性能壓測環(huán)境,制定性能壓測通過標準,對于不同于線上環(huán)境的性能壓測環(huán)境,通過標準也應當適度放寬
  4. 設計性能壓測:編排壓測鏈路,構造性能壓測數(shù)據(jù),盡可能模擬真實的請求鏈路以及請求負載
  5. 執(zhí)行性能壓測:借助性能壓測工具,按照設計執(zhí)行性能壓測
  6. 分析性能壓測結果報告:分析解讀性能壓測結果報告,判定性能壓測是否達到預期目標,若不滿足,要基于性能壓測結果報告分析原因

由上述步驟可知,一次成功的性能壓測涉及到多個環(huán)節(jié),從場景設計到施壓再到分析,缺一不可。工欲善其事,必先利其器,而一款合適的性能工具意味著我們能夠在盡可能短的時間內(nèi)完成一次合理的性能壓測,達到事半功倍的效果。

JAVA 應用性能問題排查指南

問題分類

問題形形色色,各種各樣的問題都會有。對其進行抽象和分類是非常必要的。這里將從兩個維度來對性能問題進行分類。第一個維度是資源維度,第二個維度是頻率維度。

資源維度類的問題:CPU 沖高,內(nèi)存使用不當,網(wǎng)絡過載。

頻率維度類的問題:交易持續(xù)性緩慢,交易偶發(fā)性緩慢。

對于每一類問題都有相應的解決辦法,方法或者工具使用不當,會導致不能快速而且精準地排查定位問題。

壓測性能問題定位調(diào)優(yōu)是一門需要多方面綜合能力結合的一種技術工作,需要憑借個人的技術能力、經(jīng)驗、有時候還需要一些直覺和靈感,還需要一定的溝通能力,因為有時候問題并不是由定位問題的人發(fā)現(xiàn)的,所以需要通過不斷地溝通來發(fā)現(xiàn)一些蛛絲馬跡。涉及的技術知識面遠不僅限于程序語言本身,還可能需要扎實的技術基本功,比如操作系統(tǒng)原理、網(wǎng)絡、編譯原理、JVM 等知識,決不只是簡單的了解,而是真正的掌握,比如 TCP/IP,必須得深入掌握。JVM 得深入掌握內(nèi)存組成,內(nèi)存模型,深入掌握 GC 的一些算法等。這也是一些初中級技術人員在一遇到性能問題就傻眼,完全不知道如何從哪里下手。如果擁有扎實的技術基本功,再加上一些實戰(zhàn)經(jīng)驗然后形成一套屬于自己的打法,在遇到問題后才能心中不亂,快速撥開迷霧,最終找到問題的癥結。

本文筆者還帶來了實際工作中定位和排查出來的一些典型的性能問題的案例,每個案例都會介紹問題發(fā)生的相關背景,一線人員提供的問題現(xiàn)象和初步排查定位結論,且在筆者介入后看到的問題現(xiàn)象,再配合一些常用的問題定位工具,介紹發(fā)現(xiàn)和定位問題的整個過程,問題發(fā)生的根本原因等。

分析思路框架

遇到一個性能問題,首先要從各種表象和一些簡單工具將問題進行定義和分類,然后再做進一步的定位分析,可以參考一下圖 1 作者總結出來的一個決策圖,這張圖是筆者從近幾個金融行業(yè) ToB 項目中做性能定位調(diào)優(yōu)過程的一個總結提練,不一定適合所有的問題,但至少覆蓋到了近幾個項目中遇到的性能問題的排查過程。在接下來的大篇幅中將對每一類問題進行展開,并附上一些真實的經(jīng)典案例,這些案例都是真真實實發(fā)生的,有一定的代表性,且很多都是客戶定位了很長時間都沒發(fā)現(xiàn)問題根本原因的問題。其中 GC 類問題在此文不做過多分析,對于 GC 這一類問題后續(xù)有空寫一篇專門的文章來進行展開。

內(nèi)存溢出

內(nèi)存溢出問題按照問題發(fā)生頻率又可進一步分為堆內(nèi)存溢出、棧內(nèi)存溢出、Metaspace 內(nèi)存溢出以及 Native 內(nèi)存溢出,下面對每種溢出情況進行詳細分析。

  • 堆內(nèi)存溢出

相信這類問題大家多多少少都接觸過,問題發(fā)生的根本原因就是應用申請的堆內(nèi)存超過了 Xmx 參數(shù)設置的值,進而導致 JVM 基本處于一個不可用的狀態(tài)。如圖 2 所示,示例代碼模擬了堆內(nèi)存溢出,運行時設置堆大小為 1MB,運行后結果如圖3所示,拋出了一個 OutOfMemoryError 的錯誤異常,相應的 Message 是 Java heap space,代表溢出的部分是堆內(nèi)存。

  • 棧內(nèi)存溢出

這類問題主要是由于方法調(diào)用深度太深,或者不正確的遞歸方法調(diào)用,又或者是 Xss 參數(shù)設置不當都會引發(fā)這個問題,如圖 4 所示,一個簡單的無限遞歸調(diào)用就會引發(fā)棧內(nèi)存溢出,出錯結果如圖5所示,將會拋一個 StackOverflowError 的錯誤異常。Xss 參數(shù)可以設置每個線程棧內(nèi)存最大大小,JDK8 的默認大小為 1MB,正常情況下一般不需要去修改該參數(shù),如果遇到 StackOverflowError 的報錯,那么就需要留意了,需要查證是程序的問題還是參數(shù)設置的問題,如果確實是方法調(diào)用深度很深,默認的 1MB 不夠用,那么就需要調(diào)高 Xss 參數(shù)。

  • Native內(nèi)存溢出

這種溢出發(fā)生在 JVM 使用堆外內(nèi)存時,且超過一個進程所支持的最大的內(nèi)存上限,或者堆外內(nèi)存超過 MaxDirectMemorySize 參數(shù)指定的值時即會引發(fā) Native 內(nèi)存溢出。如圖 6 所示,需要配置 MaxDirectMemorySize 參數(shù),如果不配置這個參數(shù)估計很難模擬出這個問題,作者的機器的 64 位的機器,堆外內(nèi)存的大小可想而知了。運行該程序得到的運行結果如圖 7 所示,拋出來的異常也是 OutOfMemoryError,這個跟堆內(nèi)存異常類似,但是 Message 是 Direct buffer memory,這個跟堆內(nèi)存溢出的 Message 是不一樣的,請?zhí)貏e留意這條 Message,這對精準定位問題是非常重要的。

  • Metaspace內(nèi)存溢出

Metaspace 是在 JDK8 中才出現(xiàn)的,之前的版本中都叫 Perm 空間,大概用途都相差不大。模擬 Metaspace 溢出的方式很簡單,如圖 8 所示通過 cglib 不斷動態(tài)創(chuàng)建類并加載到 JVM,這些類信息就是保存在 Metaspace 內(nèi)存里面的,在這里為了快速模擬出問題,將 MaxMetaspaceSize 設置為 10MB。執(zhí)行結果如圖 9 所示,依然是拋出 OutOfMemoryError 的錯誤異常,但是 Message 變成了 Metaspace。

JVM 的內(nèi)存溢出最常見的就這四種,如果能知道每一種內(nèi)存溢出出現(xiàn)的原因,那么就能快速而精準地進行定位。下面對一些遇到的真實的經(jīng)典案例進行分析。

  • 案例:堆外內(nèi)存溢出

這種問題也比較好查,前提是在堆內(nèi)存發(fā)生溢出時必須自動轉儲堆內(nèi)存到文件中,如果壓測過程中通過 kill -3 或者 jmap 命令觸發(fā)堆內(nèi)存轉儲。然后通過一些堆內(nèi)存分析工具比如 IBM 的 Heap Analyzer 等工具找出是哪種對象占用內(nèi)存最多,最終可以把問題原因揪出來。

如果需要在發(fā)生 OOM 時自動轉儲堆內(nèi)存,那么需要在啟動參數(shù)中加入如下參數(shù):

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/usr/local/oom

如果需要手工獲取線程轉儲或者內(nèi)存轉儲,那么請使用 kill -3 命令,或者使用 jstack 和 jmap 命令。

jstack -l pid > stackinfo,這條命令可以把線程信息轉儲到文本文件,把文件下載到本地然后用諸如 IBM Core file analyze 工具進行分析。

jmap -dump:format=b,file=./jmap.hprof pid,這條命令可以把堆內(nèi)存信息到當前目錄的 jmap.hprof 文件中,下載到本地,然后用諸如 IBM Heap Analyze 等堆內(nèi)存分析工具進行分析,根據(jù)二八定律,找準最耗內(nèi)存的對象就可以解決 80% 的問題。

圖 10 就是一個真實發(fā)生的案例,該問題的發(fā)生現(xiàn)象是這樣的,壓測開始后,前十分鐘一切正常,但是在經(jīng)歷大約十分鐘后,TPS 逐漸下降,直到后面客戶端的 TCP 連接都建不上去,客戶一度認為是服務端Linux的網(wǎng)絡棧的參數(shù)設置有問題,導致 TCP 無法建連,給出的證據(jù)是,服務端存在大量的 TIME_WAIT 狀態(tài)的連接,然后要求調(diào)整Linux內(nèi)核網(wǎng)絡參數(shù),減少 TIME_WAIT 狀態(tài)的連接數(shù)。什么是 TIME_WAIT?在這個時候就不得不祭出祖?zhèn)?TCP 狀態(tài)機的那張圖了,如圖 11 所示。對照這個圖就能知道 TIME_WAIT 的來朧去脈了,TIME_WAIT 主要出現(xiàn)在主動關閉連接方,當然了,如果雙方剛好同時關閉連接的時候,那么雙方都會出現(xiàn) TIME_WAIT 狀態(tài)。在進行關閉連接四路握手協(xié)議時,最后的 ACK 是由主動關閉端發(fā)出的,如果這個最終的 ACK 丟失,服務器將重發(fā)最終的 FIN,因此客戶端必須維護狀態(tài)信息以允許它重發(fā)最終的 ACK。如果不維持這個狀態(tài)信息,那么客戶端將響應 RST 分節(jié),服務器將此分節(jié)解釋成一個錯誤(在 java 中會拋出 connection reset的SocketException)。因而,要實現(xiàn) TCP 全雙工連接的正常終止,必須處理終止序列四個分節(jié)中任何一個分節(jié)的丟失情況,主動關閉的客戶端必須維持狀態(tài)信息進入 TIME_WAIT 狀態(tài)。

圖 10 真實堆內(nèi)存溢出案例一

圖 11 TCP 狀態(tài)機

順著客戶提供的這些信息,查了一下壓測客戶端,采用的是 HTTP 協(xié)議,keep-alive 為開,而且采用的是連接池的方式與服務端進行交互,理論上在服務器端不應該出現(xiàn)如此之多的 TIME_WAIT 連接,猜測一種可能性是由于客戶側剛開始壓測的時候 TPS 比較高,占用連接數(shù)多,后續(xù)性能下來后,連接數(shù)空閑且來不及跟服務端進行保活處理,導致連接被服務端給主動關閉掉了,但這也僅限于是猜測了。

為了更精準地定位問題,決定去一線現(xiàn)場看下情況,在 TPS 嚴重往下掉的時候,通過 top、vmstat 等命令進行初步探測,發(fā)現(xiàn) cpu 占比并不十分高,大約 70% 左右。但是 JVM 占用的內(nèi)存已經(jīng)快接近 Xmx 參數(shù)配置的值了,然后用 jstat -gcutil -h10 pid 5s 100 命令看一下 GC 情況,不查不知道一查嚇一跳,如圖 12 所示,初看這就是一份不太正常的 GC 數(shù)據(jù),首先老年代占比直逼 100%,然后 5 秒內(nèi)居然進行了 7 次 FullGC,eden 區(qū)占比 100%,因為老年代已經(jīng)滿了,年輕代的 GC 都已經(jīng)停滯了,這明顯不正常,趁 JVM 還活著,趕緊執(zhí)行 jmap -dump:format=b,file=./jmap.hprof pid,把整個堆文件快照拿下來,整整 5 個 G。取下來后通過 IBM 的 HeapAnalyzer 工具分析堆文件,結果如圖 10 所示,經(jīng)過一番查找,發(fā)現(xiàn)某個對象占比特別大,占比達 98%,繼續(xù)追蹤持有對象,最終定位出問題,申請了某個資源,但是一直沒有釋放,修改后問題得到完美解決,后續(xù)再經(jīng)過長達 8 個小時的耐久性測,沒能再發(fā)現(xiàn)問題,TPS 一直非常穩(wěn)定。

圖 12 GC 情況統(tǒng)計分析

再來看看為何會出現(xiàn)那么多的 TIME_WAIT 連接,跟開始的猜測是一致的,由于大量的閑置連接被服務端主動關閉掉,所以才會出現(xiàn)那么多的 TIME_WAIT 狀態(tài)的連接。

CPU高

  • 案例

某金融銀行客戶在壓測過程中發(fā)現(xiàn)一個問題,導致 TPS 極低,交易響應時長甚至接近驚人的 30S,嚴重不達票,服務響應時間如圖 23 所示,這是應用打的 tracer log,顯示的耗時很不樂觀。應用采用 SOFA 構建,部署在專有云容器上面,容器規(guī)格為 4C8G,使用 OceanBase 數(shù)據(jù)庫。交易緩慢過程中客戶在相應容器里面用 top、vmstat 命令獲取 OS 信息,發(fā)現(xiàn)內(nèi)存使用正常,但是 CPU 接近 100%,通過 jstack 命令取線程轉儲文件,如圖 22 所示,客戶發(fā)現(xiàn)大量的線程都卡在了獲取數(shù)據(jù)庫連接上面,再上應用日志中也報了大量的獲取 DB 連接失敗的錯誤日志,這讓客戶以為是連接池中的連接數(shù)不夠,所以不斷繼續(xù)加大 MaxActive 這個參數(shù),DB 連接池使用的是 Druid,在加大參數(shù)后,性能沒有任何改善,且獲取不到連接的問題依舊。客戶在排查該問題大概兩周且沒有任何實質性進展后,開始向阿里 GTS 的同學求助。

筆者剛好在客戶現(xiàn)場,介入該性能問題的定位工作。跟客戶一番溝通,并查閱了了歷史定位信息記錄后,根據(jù)以往的經(jīng)驗,這個問題肯定不是由于連接池中的最大連接數(shù)不夠的原因導致的,因為這個時候客戶已經(jīng)把 MaxActive 的參數(shù)已經(jīng)調(diào)到了恐怖的 500,但問題依舊,在圖 22 中還能看到一些有用的信息,比如正在 Waiting 的線程高達 908 個,Runnable 的線程高達 295 個,都是很恐怖的數(shù)字,大量的線程處于 Runnable 狀態(tài),CPU 忙著進行線程上下文的切換,CPU 呼呼地轉,但實際并沒有干多少有實際有意義的事。后經(jīng)詢問,客戶將 SOFA 的業(yè)務處理線程數(shù)調(diào)到了 1000,默認是 200。

圖 22 線程卡在獲取 DB 連接池中的連接

圖 23 交易緩慢截圖

查到這里基本可以斷定客戶陷入了“頭痛醫(yī)頭,腳痛醫(yī)腳”,“治標不治本”的窘境,進一步跟客戶溝通后,果然如此。剛開始的時候,是由于 SOFA 報了線程池滿的錯誤,然后客戶不斷加碼 SOFA 業(yè)務線程池中最大線程數(shù),最后加到了 1000,性能提升不明顯,然后報了一個獲取不到數(shù)據(jù)庫連接的錯誤,客戶又認為這是數(shù)據(jù)庫連接不夠了,調(diào)高 Druid 的 MaxActive 參數(shù),最后無論怎么調(diào)性能也都上不來,甚至到后面把內(nèi)存都快要壓爆了,如圖 24 所示,內(nèi)存中被一些業(yè)務 DO 對象給填滿了,后面客戶一度以為存在內(nèi)存泄露。對于這類問題,只要像是出現(xiàn)了數(shù)據(jù)庫連接池不夠用、或者從連接池中獲取連接超時,又或者是線程池耗盡這類問題,只要參數(shù)設置是在合理的范圍,那么十有八九就是交易本身處理太慢了。后面經(jīng)過進一步的排查最終定位是某個 SQL 語句和內(nèi)部的一些處理不當導致的交易緩慢。修正后,TPS 正常,最后把線程池最大大小參數(shù)、DB 連接池的參數(shù)都往回調(diào)成最佳實踐中推薦的值,再次壓測后,TPS 依然保持正常水平,問題得到最終解決。

圖 24 內(nèi)存填滿了業(yè)務領域對象

這個案例一雖說是因為 CPU 沖高且交易持續(xù)緩慢的這一類典型問題,但其實就這個案例所述的那樣,在定位和調(diào)優(yōu)的時候很容易陷進一種治標不治本的困境,很容易被一些表象所迷惑。如何撥開云霧見月明,筆者的看法是 5 分看經(jīng)驗,1 分看靈感和運氣,還有 4 分得靠不斷分析。如果沒經(jīng)驗怎么辦?那就只能沉下心來分析相關性能文件,無論是線程轉儲文件還是 JFR,又或者其他采集工具采集到性能信息,反正不要放過任何蛛絲馬跡,最后實在沒轍了再請求經(jīng)驗豐富的專家的協(xié)助排查解決。

  • 使用 JMC+JFR 定位問題

如果超長問題偶然發(fā)生,這里介紹一個比較簡單且非常實用的方法,使用 JMC+JFR,可以參考鏈接進行使用。但是使用前必須開啟 JMX 和 JFR 特性,需要在啟動修改啟動參數(shù),具體參數(shù)如下,該參數(shù)不要帶入生產(chǎn),另外如果將容器所屬宿主機的端口也暴露成跟 jmxremote.port 一樣的端口,如下示例為 32433,那么還可以使用 JConsole 或者 JVisualvm 工具實時觀察虛擬機的狀況,這里不再做詳細介紹。

-Dcom.sun.management.jmxremote.port=32433

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.

authenticate=false

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder

下面以一個實際的 JFR 實例為例。

首先要開啟 JMX 和 JFR 功能,需要在啟動參數(shù)中加 JMX 開啟參數(shù)和 JFR 開啟參數(shù),如上面所述,然后在容器里面執(zhí)行下述命令,執(zhí)行后顯示“Started recording pid. The result will be written to xxxx”,即表示已經(jīng)開始錄制,這個時候開始進行壓測,下述命令中的 duration 是 90 秒,也就表示會錄制 90S 后才會停止錄制,錄制完后將文件下載到本地,用 jmc 工具進行分析,如果沒有這個工具,也可以使用 IDEA 進行分析。

jcmd pid JFR.start name=test duratinotallow=90s filename=output.jfr

通過分析火焰圖,具體怎么看火焰圖請參考鏈接。通過這個圖可以看到主要的耗時是在哪個方法上面,給我們分析問題提供了很大的便利。

還可以查看 call tree,也能看出耗時主要發(fā)生在哪里。

JMC 工具下載地址:JDK Mission Control (JMC) 8 Downloads (oracle.com)

最后再介紹一款工具,阿里巴巴開源的 arthas,也是性能分析和定位的一把利器,具體使用就不在這里介紹了,可以參考 arthas 官網(wǎng)。

  • 如何定位 CPU 耗時過高的線程及方法

首先找到 JAVA 進程的 PID,然后執(zhí)行 top -H -p pid,這樣可以找到最耗時的線程,如下圖所示。然后使用 printf "%x\n" 17880,將線程號轉成 16 進制,最終通過這個 16 進制值去 jstack 線程轉儲文件中去查找是哪個線程占用 CPU 最高。

其他問題案例

這類問題在發(fā)生的時候,JVM 表現(xiàn)得靜如止水,CPU 和內(nèi)存的使用都在正常水位,但是交易就是緩慢,對于這一類問題可以參考 CPU 沖高類問題來進行解決,通過使用線程轉儲文件或者使用JFR來錄制一段 JVM 運行記錄。這類問題大概率的原因是由于大部分線程卡在某個 IO 或者被某個鎖個 Block 住了,下面也帶來一個真實的案例。

  • 案例一

某金融保險頭部客戶,反應某個交易非常緩慢,經(jīng)常響應時間在 10S 以上,應用部署在公有云的容器上,容器規(guī)格為 2C4G,數(shù)據(jù)庫是 OceanBase。問題每次都能重現(xiàn),通過分布式鏈路工具只能定位到在某個服務上面慢,并不能精確定是卡在哪個方法上面。在交易緩慢期間,通過 top、vmstat 命令查看 OS 的狀態(tài),CPU 和內(nèi)存資源都在正常水位。因此,需要看在交易期間的線程的狀態(tài)。在交易執(zhí)行緩慢期間,將交易的線程給轉儲出來,如圖 29 所示,可以定位相應的線程卡在哪個方法上面,案例中的線程卡在了執(zhí)行 socket 讀數(shù)據(jù)階段,從堆棧可以斷定是卡在了讀數(shù)據(jù)庫上面了。如果這個方法依然不好用,那么還可以借助抓包方式來進行定位。

圖 29 交易被 hang 住示例圖

  • 案例二

某金融銀行客戶壓測過程中發(fā)現(xiàn) TPS 上不去,10TPS 不到,響應時間更是高到令人發(fā)指,在經(jīng)過一段時間的培訓賦能和磨合,該客戶已經(jīng)具備些性能定位的能力。給反饋的信息是 SQL 執(zhí)行時間、CPU 和內(nèi)存使用一切正常,客戶打了一份線程轉儲文件,發(fā)現(xiàn)大多數(shù)線程都卡在了使用 RedissionLock 的分布式鎖上面,如圖 30 所示,后經(jīng)查是客戶沒有合理使用分布式鎖導致的問題,解決后,TPS 翻了 20 倍。

圖 30 分布式鎖使用不當導致的問題示例

這兩個案例其實都不算復雜,也很容易進行排查,放到這里只是想重述一下排查這類問題的一個整體的思路和方法。如果交易緩慢且資源使用都正常,可以通過分析線程轉儲文件或者 JFR 文件來定位問題,這類問題一般是由于 IO 存在瓶頸,又或者被鎖 Block 住的原因導致的。

總結

問題千千萬,但只要修練了足夠深厚的內(nèi)功,形成一套屬于自己的排查問題思路和打法,再加上一套支撐問題排查的工具,憑借已有的經(jīng)驗還有偶發(fā)到來的那一絲絲靈感,相信所有的問題都會迎刃而解。

責任編輯:張燕妮 來源: 阿里云云棲號
相關推薦

2023-01-05 11:44:43

性能HTTPS

2025-07-31 01:47:00

2023-02-22 08:15:13

壓測模擬計算

2023-10-31 18:12:03

壓測工具測試

2011-06-14 09:27:43

高性能WEB開發(fā)

2012-01-10 16:22:25

Web

2009-12-16 15:23:33

Ruby on rai

2021-12-03 08:45:57

RocketMQ壓測性能

2009-12-31 10:15:12

Silverlight

2009-12-15 14:51:50

Ruby繼承

2010-07-14 10:53:20

Web應用

2023-04-11 08:35:59

線程池Java

2011-06-22 18:26:49

關鍵詞

2018-01-10 14:08:34

阿里雙11壓測

2011-07-07 09:03:12

ASP.NET

2016-08-02 15:35:27

數(shù)據(jù)中心虛擬化

2014-03-04 09:55:54

虛擬數(shù)據(jù)中心

2025-09-25 07:54:41

Apache服務器性能

2012-06-13 09:44:04

性能案例

2022-11-25 18:49:11

云原生
點贊
收藏

51CTO技術棧公眾號

日韩免费高清视频网站| 二人午夜免费观看在线视频| 欧美性色综合| 精品调教chinesegay| 99免费视频观看| 尤物在线视频| 成人av在线资源| 国产精品9999| 国产一级中文字幕| re久久精品视频| 精品蜜桃在线看| 第四色婷婷基地| 女人让男人操自己视频在线观看| 国产精品青草综合久久久久99| 懂色av一区二区三区在线播放| 香蕉影院在线观看| 国产精品大片免费观看| 在线日韩中文字幕| 激情综合丁香五月| 日韩欧美久久| 欧美性大战xxxxx久久久| 妞干网视频在线观看| 国产露出视频在线观看| 成人av网址在线| 成人av色在线观看| 波多野结衣家庭主妇| 影音先锋中文字幕一区| 久久电影一区二区| 欧美亚洲色综久久精品国产| 老司机aⅴ在线精品导航| 5566中文字幕一区二区电影| 国产精品69页| av日韩电影| 天天亚洲美女在线视频| 国产911在线观看| 色大18成网站www在线观看| 91亚洲精品乱码久久久久久蜜桃| 99精品在线直播| 久久久久久久久久福利| а√天堂在线官网| 自拍偷在线精品自拍偷无码专区| 日产精品久久久一区二区| 色窝窝无码一区二区三区| 免费欧美日韩国产三级电影| 欧美一区二区.| 成年人午夜视频| 激情综合视频| 久久久久久中文字幕| 久久久国产精华液| 女生裸体视频一区二区三区| 裸体女人亚洲精品一区| 看黄色录像一级片| 99热在线成人| 久久影院中文字幕| 欧美爱爱小视频| 欧美日韩国产在线一区| 操人视频在线观看欧美| 极品魔鬼身材女神啪啪精品| 香蕉国产精品| 欧美猛交免费看| 妺妺窝人体色www在线下载| 亚洲欧美偷拍自拍| 欧美激情欧美激情在线五月| 欧美激情图片小说| 激情成人亚洲| 4p变态网欧美系列| 国产免费www| 久久97超碰色| 97超碰人人看人人| 神马午夜在线观看| 久久久久久久久久久久久女国产乱| 久久久久久久有限公司| 国产一二三在线观看| 国产天堂亚洲国产碰碰| 亚洲午夜精品一区二区 | 蜜桃av一区二区在线观看| 国产精品美女久久| 国产国语亲子伦亲子| 成人久久视频在线观看| 乱一区二区三区在线播放| 国产黄色片在线观看| 亚洲欧美日韩国产中文在线| 男人的天堂avav| 天堂av中文在线观看| 欧美日韩中文一区| 18禁一区二区三区| 亚洲免费专区| 久久亚洲综合国产精品99麻豆精品福利 | 国产裸体美女永久免费无遮挡| 日本视频在线一区| 97av影视网在线观看| 日韩资源在线| 亚洲欧美日韩在线| 美女av免费在线观看| 久久av影院| 精品日韩在线观看| 国产在线综合视频| 国产精品magnet| 日本精品久久中文字幕佐佐木| 中文字幕码精品视频网站| 国产东北露脸精品视频| 日本一区二区三区视频在线观看 | 亚洲欧美成aⅴ人在线观看 | 蜜桃视频在线观看一区| 91视频免费进入| 久久av少妇| 亚洲妇熟xx妇色黄| 国产一区二区在线观看免费视频| 福利片在线一区二区| 日韩在线国产精品| 久久精品这里有| 麻豆精品一区二区av白丝在线 | 欧洲福利电影| 国内久久久精品| 国产精品高潮呻吟av| 99久久久久久99| 国产精品视频一二三四区| 成人免费影院| 亚洲国产精品va在线看黑人动漫| 阿v天堂2014| 一区二区三区导航| 91在线在线观看| 男人在线资源站| 在线观看不卡一区| 中文字幕丰满乱子伦无码专区| 亚洲欧美亚洲| 91在线免费观看网站| www.亚洲视频| 日本二三区不卡| 国产精品嫩草av| 欧美视频四区| 99久久综合狠狠综合久久止| 日本免费在线观看| 欧美日韩在线精品一区二区三区激情 | 欧美精品久久96人妻无码| 成人不卡视频| 亚洲小视频在线观看| 亚洲 欧美 中文字幕| 99riav久久精品riav| 国产真人做爰毛片视频直播| 亚洲一区网址| 欧美激情videoshd| 亚洲第一色视频| 亚洲人成小说网站色在线| 日本久久久久久久久久久久| 黑人操亚洲人| 国产精品久久久久久久久久小说| 你懂的免费在线观看| 日韩欧美成人免费视频| 免费看污片网站| 玖玖国产精品视频| 神马影院我不卡午夜| 成人18视频在线观看| 日韩在线免费av| 国产又黄又猛又爽| 亚洲永久免费视频| 呦呦视频在线观看| 玖玖视频精品| 热这里只有精品| 免费精品一区二区三区在线观看| 久久成人国产精品| 亚洲第一页综合| 懂色aⅴ精品一区二区三区蜜月| aaaa黄色片| 日韩国产高清影视| 国产免费色视频| 999精品视频在这里| 亚洲**2019国产| 黄色av免费在线观看| 欧美又粗又大又爽| 国产极品美女在线| 成人黄色国产精品网站大全在线免费观看| 少妇大叫太大太粗太爽了a片小说| 日韩在线观看中文字幕| 91成人福利在线| 日韩免费啪啪| 精品国产a毛片| 少妇高潮av久久久久久| 国产精品久久久爽爽爽麻豆色哟哟| 欧美在线a视频| 日韩一区二区久久| 性欧美精品一区二区三区在线播放| 激情亚洲小说| 国外成人在线视频| 国产无限制自拍| 亚洲一级黄色大片| 亚洲精品中文在线观看| 99re这里只有| 麻豆成人av在线| 国产真人做爰毛片视频直播| 精品国产一区二区三区噜噜噜| 成人免费午夜电影| 大桥未久在线视频| 日韩中文字幕在线精品| 亚洲成人一级片| 欧美三级中文字幕在线观看| 黑人巨大精品一区二区在线| 91女厕偷拍女厕偷拍高清| 狠狠操狠狠干视频| 亚洲女同在线| 欧美久久久久久久久久久久久久| 中文有码一区| 成人免费看片网址| 国产精品美女午夜爽爽| 97精品久久久中文字幕免费| 国产一级在线| 亚洲精品成人av| 国产av一区二区三区| 91久久精品国产91性色tv| 校园春色 亚洲| 国产精品女主播在线观看| 2一3sex性hd| 国产成人精品免费网站| 丝袜制服一区二区三区| 日韩亚洲在线| 日韩a级黄色片| 91精品国产91久久综合| 欧美一区二区三区四区五区六区| 日本精品视频| 成人午夜在线观看| 丁香婷婷久久| 国产成人精品一区二区三区| 国产色婷婷在线| 欧美成人中文字幕在线| 在线播放麻豆| 国产亚洲精品一区二区| 天天综合网在线观看| 欧美大片日本大片免费观看| 亚洲一级黄色大片| 欧美日本在线一区| 中文字幕日韩国产| 欧美综合视频在线观看| 69视频免费在线观看| 精品国产91久久久久久| 免费在线看黄网址| 亚洲综合av网| 久久久久亚洲av成人片| 亚洲视频免费在线观看| 日韩av毛片在线观看| 中文字幕不卡在线播放| 中文天堂资源在线| 欧美激情一区二区三区在线| 最近中文字幕免费| 国产午夜亚洲精品不卡| 全黄一级裸体片| 久久久亚洲高清| 人妻精品久久久久中文字幕| 91香蕉视频mp4| 国内精品久久99人妻无码| 久久免费午夜影院| 国产手机在线观看| 国产日韩一级二级三级| 超薄肉色丝袜一二三| 国产精品私人影院| 羞羞在线观看视频| 亚洲黄一区二区三区| 久久久精品国产sm调教| 亚洲线精品一区二区三区八戒| 九九精品在线观看视频| 亚洲成a人在线观看| 草久久免费视频| 日本高清不卡一区| 国产又粗又猛又爽又黄91| 欧美精品日韩一区| 精品人妻无码一区二区色欲产成人 | 久久久久久久久久久免费视频| 先锋a资源在线看亚洲| 黄色三级视频片| 久久99精品久久久久久动态图 | 亚洲精品a区| 精品一区二区国产| sdde在线播放一区二区| 粉嫩av一区二区三区天美传媒| 黄色综合网站| 日韩精品一区中文字幕| 国产曰批免费观看久久久| av不卡中文字幕| 久久精品一区二区三区av| 久久爱一区二区| 偷拍亚洲欧洲综合| 一区二区视频在线免费观看| 欧美一区二区三区婷婷月色| 四虎在线视频免费观看| 色琪琪综合男人的天堂aⅴ视频| av官网在线播放| 欧美做爰性生交视频| a一区二区三区亚洲| 精品视频一区二区三区四区| 成人羞羞网站入口| 成人黄色av片| 激情综合五月婷婷| 亚洲av无码国产精品久久| 国产精品高潮呻吟久久| 粉嫩aⅴ一区二区三区| 欧美色视频在线| 午夜视频福利在线| 久久久av电影| 日韩av福利| 国产精品久久久对白| 色欧美自拍视频| 精品人妻一区二区三区四区在线 | 在线观看视频91| 丰满少妇高潮在线观看| 中日韩午夜理伦电影免费| www555久久| 成人亚洲欧美一区二区三区| 亚洲调教一区| 欧美久久在线观看| 国产综合色在线视频区| 久久美女免费视频| 精品国产电影一区| 亚洲精品久久久狠狠狠爱| 尤物九九久久国产精品的特点| 丁香花在线高清完整版视频| 国产在线视频不卡| 欧洲grand老妇人| 亚洲爆乳无码专区| caoporen国产精品视频| 精品国产乱码久久久久久鸭王1| 在线精品视频一区二区| 深夜福利在线看| 97人洗澡人人免费公开视频碰碰碰| 国产精品一区二区免费福利视频| 国产综合精品一区二区三区| 91成人精品视频| 亚洲综合av在线播放| 国产视频视频一区| 日韩熟女一区二区| 国产丝袜精品视频| 亚洲精品日产| 精品麻豆av| 中文在线不卡| 四季av综合网站| 懂色av一区二区三区| 天天综合永久入口| 91av成人在线| 日本三级久久| 日本在线视频www| 国产亚洲一二三区| 无码人妻熟妇av又粗又大| 亚洲免费影视第一页| 欧美成人黑人| 日本在线观看一区二区三区| 日欧美一区二区| 91社区视频在线观看| 欧美色精品天天在线观看视频| 成人精品一区二区三区免费| 奇米4444一区二区三区| 欧美激情在线免费| 丁香婷婷激情网| 国产精品美女久久久久久久久| 中文文字幕一区二区三三| 色悠悠国产精品| 国产一区一区| 男女日批视频在线观看| www.亚洲色图| 亚洲av中文无码乱人伦在线视色| 亚洲欧美日韩在线一区| www.精品国产| 中国一级黄色录像| 成人天堂资源www在线| 日本少妇性生活| 亚洲美女av黄| 日韩有码欧美| 欧洲精品在线播放| 91免费国产在线观看| 午夜视频网站在线观看| 深夜精品寂寞黄网站在线观看| 国产专区精品| 日韩免费视频播放| 国产欧美日韩一区二区三区在线观看| 中文字幕免费观看视频| 欧美大尺度在线观看| 老司机凹凸av亚洲导航| 91n.com在线观看| 亚洲男帅同性gay1069| 天堂中文在线看| 国产精品视频久久| 精品99视频| 日韩毛片无码永久免费看| 91精品国产全国免费观看| 黄页网站大全在线免费观看| 欧美成人综合一区| 国内精品视频一区二区三区八戒 | 国产一区成人| 日韩不卡av在线| 精品国产1区2区3区| 久久精品女人天堂av免费观看 | 日本免费视频在线观看| 国产精品影院在线观看| 国产一区日韩欧美| 国产人妻大战黑人20p| 欧美一级搡bbbb搡bbbb| 国产精欧美一区二区三区蓝颜男同| 一区二区三区电影| 99r国产精品| www.久久综合| 国产精品亚发布| 香蕉久久夜色精品国产| 国产精品国产精品88|