spring hystrix和內置tomcat組件的參數調優解析


1. springboot內置tomcat容器的參數配置
server:
    port: 12021
    # server端的socket超時間(毫秒),使用值-1表示沒有(即無限)超時,默認值為60000(即60秒)
    # Tomcat附帶的標准server.xml將此值設置為20000(即20秒),除非disableUploadTimeout設置為false,否則在讀取請求正文(如果有)時也會使用此超時
    connection-timeout: 80000
    tomcat:
      # URL統一編碼
      uri-encoding: UTF-8
      # 處理的最大並發請求數,默認值200
      max-threads: 1000        
      # 在給定時間接受和處理的最大連接數,默認值10000
      max-connections: 20000
      # 初始化時創建的最小線程數,始終保持運行,默認值10
      min-spare-threads: 20
      # 監聽端口隊列最大數,滿了之后客戶請求會被拒絕(不能小於maxSpareThreads),默認為100
      acceptCount: 700
      # 取消post參數大小限制,默認為2097152(2M)
      max-http-post-size: -1 
      # 請求和響應HTTP標頭的最大大小,以字節為單位指定,如果未指定,則此屬性設置為8192(8 KB)
      max-http-header-size: 8192(8 KB)

開發中遇到問題,需查詢tomcat官方文檔: http://tomcat.apache.org/tomcat-8.0-doc/config/http.html#HTTP/1.1_and_HTTP/1.0_Support

2. spring cloud hystrix的參數hystrix.command.default和hystrix.threadpool.default中的default為默認CommandKey(默認值:當前執行方法名)
Execution相關的屬性的配置:
隔離策略,有THREAD和SEMAPHORE
THREAD - 它在單獨的線程上執行,並發請求受線程池中的線程數量的限制
SEMAPHORE - 它在調用線程上執行,並發請求受到信號量計數的限制
hystrix.command.default.execution.isolation.strategy 隔離策略,默認是Thread, 可選Thread|Semaphore
在THREAD模式下,達到超時時間,可以中斷
在SEMAPHORE模式下,會等待執行完成后,再去判斷是否超時
設置標准:有retry,99meantime+avg meantime;沒有retry,99.5meantime
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 命令執行超時時間,默認1000ms
hystrix.command.default.execution.timeout.enabled 執行是否啟用超時,默認啟用true
hystrix.command.default.execution.isolation.thread.interruptOnTimeout 發生超時是是否中斷,默認true(THREAD模式有效)
execution.isolation.thread.interruptOnCancel 當發生取消時,執行是否應該中斷,默認值為false(THREAD模式有效)
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests 最大並發請求數,默認10,
## 該參數當使用ExecutionIsolationStrategy.SEMAPHORE策略時才有效。如果達到最大並發請求數,請求會被拒絕。
## 理論上選擇semaphore size的原則和選擇thread size一致,但選用semaphore時每次執行的單元要比較小且執行速度快(ms級別),否則的話應該用thread,semaphore應該占整個容器(tomcat)的線程池的一小部分
## 只有在高並發(單個實例每秒達到幾百個調用)的調用時,才需要修改HystrixCommands 的隔離策略為semaphore
Fallback相關的屬性:(應用於Hystrix的THREAD和SEMAPHORE策略)
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests 如果並發數達到該設置值,請求會被拒絕和拋出異常並且fallback不會被調用,默認10
hystrix.command.default.fallback.enabled 當執行失敗或者請求被拒絕,是否會嘗試調用hystrixCommand.getFallback(),默認true

Collapser Properties相關參數:
hystrix.collapser.default.maxRequestsInBatch 單次批處理的最大請求數,達到該數量觸發批處理,默認Integer.MAX_VALUE
hystrix.collapser.default.timerDelayInMilliseconds 觸發批處理的延遲,也可以為創建批處理的時間+該值,默認10
hystrix.collapser.default.requestCache.enabled 是否對HystrixCollapser.execute() and HystrixCollapser.queue()的cache,默認true

ThreadPool相關參數:
線程數默認值10適用於大部分情況(有時可以設置得更小),如果需要設置得更大,那有個基本得公式可以follow:
requests per second at peak when healthy × 99th percentile latency in seconds + some breathing room
每秒最大支撐的請求數 (99%平均響應時間 + 緩存值)
比如:每秒能處理1000個請求,99%的請求響應時間是60ms,那么公式是:1000 * (0.060+0.012)
基本得原則時保持線程池盡可能小,主要是為了釋放壓力,防止資源被阻塞。當一切都是正常的時候,線程池一般僅會有1到2個線程激活來提供服務。
hystrix.threadpool.default.coreSize 並發執行的最大線程數,默認10
hystrix.threadpool.default.maxQueueSize BlockingQueue的最大隊列數,當設為-1,會使用SynchronousQueue,值為正時使用LinkedBlcokingQueue。該設置只會在初始化時有效,之后不能修改threadpool的queue size,除非reinitialising thread executor。默認-1。
hystrix.threadpool.default.queueSizeRejectionThreshold 即使maxQueueSize沒有達到,達到queueSizeRejectionThreshold該值后,請求也會被拒絕。因為maxQueueSize不能被動態修改,這個參數將允許我們動態設置該值。if maxQueueSize == -1,該字段將不起作用
hystrix.threadpool.default.keepAliveTimeMinutes 如果corePoolSize和maxPoolSize設成一樣(默認實現)該設置無效。如果通過plugin(https://github.com/Netflix/Hystrix/wiki/Plugins)使用自定義實現,該設置才有用,默認1.
hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds 線程池統計指標的時間,默認10000
hystrix.threadpool.default.metrics.rollingStats.numBuckets 將rolling window划分為n個buckets,默認10

實際使用中,發現使用默認配置,經常報semaphore異常,服務請求被拒絕。用壓測工具jmeter場景復現:

1. 通過gateway訪問服務,開100個線程請求,成功率52%;200個線程請求,成功率39%;500個線程請求功率30%;

2. 不通過網關,直接訪問服務,開100個線程請求,成功率100%200個線程請求,成功率100%;500個線程請求功率49%;

現象解釋:

1. springboot默認的tomcat線程池為200,通過直連服務,並發訪問的線程在200以下時,請求順利處理,達到500時,超過了線程數,線程不夠用,會導致部分請求失敗,可通過超時時間和線程池配置優化;

2. gateway網關,配合hystrix訪問,因為默認的semaphore是10,並發到100時,信號量處理不過來,就會有大量的fallback,並發到200時,同時會導致失效的fallback的內置隊列(默認100個)空間不足,拋出異常,並發加到500,異常增多,失敗率加大;

根據hystrix配置參數的作用,優化hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=200,壓測gateway發現,並發500,成功率為100%,遠優於直接請求。(由於直連接口並發調用指標小於500,綜合考慮服務器的承載后,沒有測試上限)

結果表明gateway,hystrix的內部調用對並發有較好的優化,聯合tomcat線程池和hystrix的semaphore.maxConcurrentRequests,能夠極大的提高單機並發性能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM