分析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複製程式碼
透過pippip 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