Spring Cloud速度優化,一次提高三十倍吞吐量的優化經驗

此Spring Cloud 項目採用的技術棧爲

  • 註冊中心 Spring Cloud Eureka
  • 配置中心 Spring Cloud Config
  • 鏈路追蹤 Zipkin 
  • 分佈式事務TxLcn
  • 一些其他組件

硬件條件 

  • CPU AMD Ryzen 7 2700  3.20GHz
  • 內存16GB

在實際中測試登錄接口,併發量爲250TPS左右(每秒處理250個請求)

同樣一臺電腦Redis的吞吐量爲7W左右,差距太大,接下來分析問題產生的原因

發現問題

編寫一個無業務邏輯接口,排除數據庫的影響,直接返回請求成功的結果,代碼如下

@RestController
public class TestController implements BaseRestController {
    @RequestMapping("/test")
    public RestResponse<TestSpeedResult> test(){
        TestSpeedResult result = new TestSpeedResult();
        return  this.createReponse(result);
    }

}

 

對此接口進行Jmeter壓力測試,線程數爲500,無限制循環調用,產生的結果如下圖

發現兩個問題

  • 吞吐量爲375左右,非常慢,要知道,這個接口無任何處理請求。
  • 最大處理時間達到的驚人的31秒(測試進行了32秒),說明有請求一直處於阻塞狀態。

問題分析

從這種情況可以看出,問題和數據庫無關,純返回數據的接口的速度都非常慢

拿出我的絕手好活 VisualVm,Java自帶的強大神器,擁有監控內存,監控CPU的性能,追蹤等各種插件。

使用CPU抽樣,查看是哪些方法花費太多時間

可以看到,有個名爲

findFirstNonLoopbackAddress的函數居然佔據了CPU百分之97.7的時間

我們以debug模式啓動應用,在函數頭下斷點,開啓Jmeter,函數成功斷下來,我們看下調用棧

從第二條數據可以看出,該方法是由zipkin調用,大概查看了下源碼,是用來上報Trace信息所調用的。上報追蹤信息是影響性能的主要因素。

解決及驗證

修改配置文件,關閉鏈路追蹤

設置spring.zipkin.enabled 爲false。

重新使用Jmeter進行吞吐量測試


可以看到吞吐量已經道道11660左右。

吞吐量提高了31倍,恢復了正常水準。

總結

Zipkin會拖慢系統速度,建議在生產環境關閉,在開發環境開啓。避免影響整個系統性能。

另外, 通過Zipkin配置調整優化應該也能解決這個問題,這個就需要小夥伴們自己去探索了~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章