線上服務響應時間太長的排查歷程

前言:

最近線上環境某個接口服務響應時間偏長,致使用戶體驗感超差;當出現這種狀況時,咱們該怎麼快速的排查這類問題呢?html

經常使用的排查思路:java

  • 爲代碼添加上詳細的打印日誌; 不建議 ,一是線上環境,無法隨便的從新部署更換了詳細日誌的代碼,二是 添加詳細的日誌輸出,那就意味這會生成大量的日誌文件,這些日誌文件會佔據大量服務器磁盤空間。git

  • 搭建一個模擬了線上環境的測試環境進行復盤排查;額,出現了這種問題哪有那麼多的時間讓你進行環境覆盤排查,因此此方案也是 不建議的github

  • 線上診斷神器 Arthas ,這個工具是阿里開源的,專門用於線上環境問題排查的,這個工具提供了不少的 命令 用來排查問題; 當出現上面的響應時間偏長的問題,就能夠使用 Arthas 提供的 trace 命令進行排查,使用這個工具的 trace 命令能夠統計到方法中整個調用鏈路上的全部性能開銷和追蹤調用鏈路,查找其中耗時比較長的方法再具體排查便可。spring

文章接下來將從兩方面展開:數據庫

①、搭建模擬線上服務接口響應時間偏長的環境;SpringBoot 服務接口 + JMeter 模擬服務接口調用;springboot

②、使用診斷神器 Arthas 提供的命令 trace 命令進行響應時間偏長的問題排查;服務器

模擬線上服務環境:

一、SpringBoot 項目搭建,而且編寫好服務接口;工具

注意:服務接口代碼爲了簡便,只寫了 一些大循環的代碼 來模擬較長的耗時;除此以外,實際上還包含不少多其它常見的狀況,例如:性能

  • 服務接口方法中存在不少的 JDBC 操做 ,而且因爲數據庫中數據量太大,致使不少的 JDBC 查詢很是耗時,而且此時可能因爲尚未建立合適的索引,致使查詢耗時更加的長,最終致使服務接口響應時間偏長;

  • 此服務接口中調用了 其它的服務接口 ,因爲內部調用的其它服務接口出現問題等,致使此其它服務接口執行耗時比較長,進而致使服務接口響應時間偏長;

服務接口代碼以下:

test一、test2方法以下:

二、JMeter 模擬用戶調用的測試腳本配置:

三、服務接口 SpringBoot 代碼 和 JMeter 測試腳本的所在項目位置:

服務接口代碼準備好後,使用IDEA開發工具將其導出爲 Jar 包 。

服務接口代碼和JMeter腳本獲取地址:模擬Demo源碼地址

爲了模擬最爲真實的線上環境,需將準備好的 服務接口Jar包 放到 Linux 服務器中,而後使用命令 java -jar .jar 運行起 Jar 包;

最後使用 JMeter 進行接口的調用,在 聚合報告 中發現平均響應時間偏長;如圖:

若是有用戶反映某功能響應時間太長了,彆着急,根據下面使用Arthas的方法進行排查,絕對方便又快速的找到問題緣由。嘿嘿嘿 . . . . . .

Arthas 進行問題排查:

按照下面的步驟來,你必定會成功快速的排查出問題緣由的;

一、 首先須要下載阿里開源的Arthas 的診斷工具 Jar 包,下載地址:arthas-boot.jar ;而後將 Jar 包放到 部署服務接口項目的服務器中

二、 而後使用 ps 命令,查詢出當前運行服務接口的程序進程號;例如:本文章模擬的服務接口程序 Jar 包名稱爲 springboot_arthas-1.0.0.jar ,因此命令爲: ps -ef | grep springboot_arthas-1.0.0

三、 而後運行Arthas 診斷工具,命令:java -jar arthas-boot.jar ;開始運行的界面如圖:

此時診斷工具尚未運行完,須要手動選擇要診斷/監控的java 進程,而且此工具也會列出所有的java進程號,你只須要輸入 它們最前的序號 [1] 便可;如圖:

四、 運行完後,就能夠使用 trace命令 統計服務接口方法調用鏈路上的所有節點的耗時;

trace 命令能主動搜索 class-patternmethod-pattern 對應的方法調用路徑,渲染和統計整個調用鏈路上的全部性能開銷和追蹤調用鏈路。

具體命令格式: trace [全限定類名] [類中的方法名]

例如:統計的本服務接口:

com.lyl.controller.TestController : 全限定類名

process:TestController 類中的方法;

具體命令: trace com.lyl.controller.TestController process

五、 trace 命令執行結果展現,如圖:

經過trace 命令監控統計的調用鏈路各個方法的執行耗時,能夠發現調用的 com.lyl.util.StringUtil 類中的 test2() 方法執行耗時比較大;

因此須要特別去查看這個方法的代碼是否存在問題;

若是這個代碼中還存在許多的方法調用鏈路,則須要再次使用 trace 命令進行監控調用鏈路的耗時,找出具體可能存在問題的方法。

Arthas 阿里開源的診斷工具還提供了不少的命令供使用,你們能夠自行去查看學習,地址:命令列表

注意:

①、使用Arthas 診斷的程序代碼,在打包時 不能混淆 ,不然在使用trace 命令會報 類或方法找不到

②、在使用trace命令監控統計時,須要JMeter測試腳本正在運行調用服務接口,若是服務接口沒有正在調用中,則統計不到內部調用鏈路的耗時狀況;

點贊 + 評論 + 轉發 喲

若是本文對您有幫助的話,請揮動下您愛發財的小手點下贊呀,您的支持就是我不斷創做的動力,謝謝!

您還能夠VX搜索【木子雷】公衆號,堅持高質量原創java技術文章,福利多多喲!

相關文章
相關標籤/搜索