首頁>技術>

分析API的耗時是將API的總耗時拆分為不同的部分,清晰地知道是什麼原因導致耗時過高。我們藉助不同的工具,在不同的網路環境下進行耗時分析,從而提出相應的最佳化建議。

請求傳送過慢導致耗時增加;DNS解析過慢導致耗時增加;惡劣的網路環境導致耗時增加;一直在排隊導致響應過慢;服務端響應過慢導致耗時增加;響應體積過大導致耗時增加;等等……

一般從感官上覺得API介面響應慢,大部分人會直接歸結於服務端處理慢,其實是不合理的。透過在內網環境下的API耗時分析和外網環境下的API耗時分析的對比,一般會認識到原因所在。

透過瀏覽器的開發者工具分析

重點關注指標Waiting (TTFB),TTFB代表第一個位元組到達的時間。此時間包括一次往返延遲和伺服器準備響應所花費的時間。可以近似的認為是服務端耗時。

如果網路情況不好或者響應資料過大,則Content Download耗時會長一些,這時候應該考慮壓縮響應.

Queueing. 【排隊中】瀏覽器在以下情況下將請求排隊: 有更高優先順序的請求. 已為該來源打開了六個TCP連線,這是限制。僅適用於HTTP/1.0和HTTP/1.1. 瀏覽器正在磁碟快取中短暫分配空間.Stalled. 【停止】該請求可能由於排隊中描述的任何原因而停止.Proxy negotiation. 【代理協商】瀏覽器正在與代理伺服器協商請求.Request sent. 【傳送請求】該請求正在傳送.Waiting (TTFB). 【等待中】瀏覽器正在等待響應的第一個位元組。TTFB代表第一個位元組到達的時間。此時間包括一次往返延遲和伺服器準備響應所花費的時間.Content Download. 【響應內容下載】瀏覽器正在接收響應.其他可能出現的DNS Lookup. 【DNS】瀏覽器正在解析請求的IP地址.Initial connection. 【初始化連線】瀏覽器正在建立連線,包括TCP握手/重試和協商SSL.透過httpstat工具分析

httpstat git地址

如果是在Linux伺服器上進行呼叫,則可以使用httpstat。

安裝直接下載指令碼
wget https://raw.githubusercontent.com/reorx/httpstat/master/httpstat.py複製程式碼
透過pip
pip install httpstat複製程式碼
Mac
brew install httpstat複製程式碼
使用

httpstat可以使用cURL的引數。

httpstat www.baidu.comhttpstat 127.0.0.1/post -X POST --data-urlencode "id=1" -v複製程式碼

Server Processing可以近似的認為是服務端耗時。

服務端到底慢在哪裡?列印耗時日誌?
StopWatch stopWatch = new StopWatch();stopWatch.start();// ...stopWatch.stop();LOGGER.info("[某某某業務] - [Time:{}ms]", stopWatch.getLastTaskTimeMillis());複製程式碼

腦子瞬間一熱就會使用的方法,簡單直接,但是如果定位不準確,你可能要加很多這種日誌。

還是用火焰圖吧

讓軟體執行情況視覺化,是效能分析、除錯的利器

火焰圖的生成工具很多,比如Async Profiler、linux-perl,網上也有很多關於這方面的介紹,IDEA也整合Async Profiler,這個很方便。

選擇程式進行火焰圖的分析

可以選擇一個已經執行中的java程式進行分析,輸出火焰圖。

直接使用Async Profiler更簡單

async-profiler git地址

安裝

從git上直接下載。

解壓下可用。

簡單使用

執行命令。

./profiler.sh -d 10 -f /tmp/flamegraph.svg <pid>./profiler.sh -e itimer -d 10 -f /tmp/flamegraph.svg <pid>複製程式碼

可以透過-e來指定cpu、alloc、lock、wall、itimer、ClassName.methodName。

cpu:在這種模式下,profiler收集堆疊跟蹤樣本,包括Java方法、本機呼叫、JVM程式碼和核心函式。alloc:可以將探查器配置為收集分配最大堆記憶體的呼叫站點,而不是檢測消耗CPU的程式碼。即檢查當前分配記憶體最多的地方。lock:滿足的鎖定嘗試,包括Java物件監視器和可重入鎖。wall:告訴async-profiler在給定的時間內對所有執行緒平均取樣,而不管執行緒狀態如何: 執行、休眠或阻塞。例如,在分析應用程式啟動時間時,這可能會有所幫助。。ClassName.methodName:ClassName.methodName選項使用給定的Java方法,以便使用堆疊跟蹤記錄此方法的所有呼叫。cpu:在這種模式下,profiler收集堆疊跟蹤樣本,包括Java方法、本機呼叫、JVM程式碼和核心函式。

在瀏覽器中開啟file:///tmp/flamegraph.svg,並找到呼叫的API,我這裡呼叫的是ProjectManageController中的findProject方法。

根據長度可以看出該方法中呼叫方法的耗時情況,這樣我們就知道耗時主要集中在什麼地方。

PS:如果方法名被編譯掉了,那麼可以在java啟動時加入-XX:+PreserveFramePointer

做更多的工作

使用者體驗的最佳化是一個長期而艱鉅的過程,為了衡量我們網站的效能是否良好,我們有更多的工作需要去做。通常,會在底層自定義一些以使用者為中心的指標,比如Server-Timing。

原文連結:https://juejin.cn/post/6936063402640932878

11
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • IIC通訊協議程式碼分享及除錯過程中的一些小誤區分享