使用spring boot搭建了一個web服務,部署在docker容器中。使用中出現了一個性能問題:多次接口請求中,偶爾會出現一次響應非常慢的情況。正常情況下接口的響應時間在10-20ms,偶爾會出現一次3s以上的響應。下面是自己的一個排查過程
1、驗證本地開發環境。
首先考慮的是在本地開發環境中找出問題所在。經過測試,本地並未出現這個問題。
2、數據庫優化。
考慮到本地開發環境和部署的版本使用的數據庫不同。通過建立索引,查詢優化等方案,對數據庫的查詢進行了優化。然而問題依舊。
3、添加詳細日志,定位問題
首先考慮的是業務代碼可能存在問題,通過分析日志,發現響應慢的並不是業務代碼,而是spring boot框架中的代碼。主要耗時在過濾器和攔截器中。
4、添加gc日志
考慮可能由於過一段時間會出現一次gc,接口也是偶爾出現一次響應慢的情況,猜測兩者可能有關系。通過日志發現,響應慢的時候並不一定出現gc,並且每次gc的時間都很短,在ms級別。
5、更換servlet容器
spring boot內置了多個servlet容器,默認使用的是tomcat。從上面日志定位的情況來看,servlet容器可能是主要原因。把tomcat換成undertow之后,問題得以解決,響應時間都固定在10-20ms范圍。
6、為什么tomcat會出現這個問題,后續還需要分析
