在偶然中發現一個接口耗時有點慢,用了4秒鐘
然後查詢了下,這個接口做的事有點多,即有接口調用,又有很多的查詢然後儲存,是以單看代碼或者時序圖的話很難看出
然後用了
Arthas
的分析了一下這個接口
啟動Arthas後選擇要分析的項目,然後使用
trace
功能,trace的功能是
輸出方法内部調用路徑,并輸出方法路徑上的每個節點上耗時
,很符合我這個場景
trace
指令能主動搜尋
class-pattern
/
method-pattern
對應的方法調用路徑,渲染和統計整個調用鍊路上的所有性能開銷和追蹤調用鍊路
開啟trace
trace com.*** method
然後再次調用接口
就可以看到這個接口下的調用鍊和耗時,很快就發現了耗時最高的接口,于是繼續trace這個接口,重複以上步驟,最終發現耗時的地方
竟然是兩個插入方法耗時最久
看了下表結構也沒有很多索引,而且資料量也不大隻有幾萬條,把sql複制到資料庫中執行,也是正常的
看了下代碼,這兩個插入是在循環中的,但是循環隻有10多次,在本地測試了一下也是正常的
而且本地的接口總耗時才3537ms
用
Arthas
的
dashboard
看了下項目的資源情況
發現堆快滿了,而且隻有100多m的記憶體,看了下啟動參數,隻給這個項目指定了128m的記憶體。。
又看了下伺服器記憶體,也快被用完了