SpringBoot內(nèi)置tomcat參數(shù)調(diào)優(yōu)的實現(xiàn)
1. 默認(rèn)配置
可通過org.springframework.boot.autoconfigure.web.ServerProperties查看,其中包括屬性tomcat、jetty、undertow三種服務(wù)器的設(shè)置,默認(rèn)啟用tomcat。
# tomcat 8 server: tomcat: max-connections: 10000 #最大連接數(shù),默認(rèn)為10000 accept-count: 100 # 最大連接等待數(shù),默認(rèn)100 max-threads: 200 #最大工作線程數(shù),默認(rèn)200 min-spare-threads: 10 #最小工作線程數(shù),默認(rèn)10 # tomcat 9 server: tomcat: max-connections: 8192 accept-count: 100 threads: max: 200 min-spare: 10
詳解:maxConnections、maxThreads、acceptCount
每一次HTTP請求到達(dá)Web服務(wù)器,Web服務(wù)器都會創(chuàng)建一個線程來處理該請求
min-spare-threads:
最小備用線程數(shù),tomcat啟動時的初始化的線程數(shù),默認(rèn)10。(適當(dāng)增大一些,以便應(yīng)對突然增長的訪問量)
max-threads:
Tomcat可創(chuàng)建的最大工作線程數(shù),默認(rèn)200, 每一個線程處理一個請求,超過這個請求數(shù)后,客戶端請求只能排隊,等有線程釋放才能處理。(4核8g內(nèi)存,線程數(shù)800,一般是 核數(shù)*200 。操作系統(tǒng)做線程之間的切換調(diào)度是有系統(tǒng)開銷的,所以不是越多越好。)
accept-count:
當(dāng)調(diào)用Web服務(wù)的HTTP請求數(shù)達(dá)到tomcat的最大線程數(shù)時,還有新的HTTP請求到來,這時tomcat會將該請求放在等待隊列中,這個acceptCount就是指能夠接受的最大等待數(shù),默認(rèn)100。
如果等待隊列也被放滿了,這個時候再來新的請求就會被tomcat拒絕(connection refused),隊列也做緩沖池用,但也不能無限長,不但消耗內(nèi)存,而且出隊入隊也消耗CPU。
max-connections:
這個參數(shù)是指在同一時間,tomcat能夠接受的最大連接數(shù)。一般這個值要大于(max-threads)+(accept-count)。
tomcat的最大線程數(shù),最大排隊數(shù)多少合適
1、Tomcat默認(rèn)的HTTP實現(xiàn)是采用阻塞式的Socket通信,每個請求都需要創(chuàng)建一個線程處理,當(dāng)一個進(jìn)程有500個線程在跑的話,那性能已經(jīng)是很低很低了。Tomcat 默認(rèn)配置的最大請求數(shù)是150,也就是說同時支持150個并發(fā)。
2、SpringBoot內(nèi)置Tomcat,在默認(rèn)設(shè)置中,Tomcat的最大線程數(shù)是 200,最大連接數(shù)是 10000。支持的并發(fā)量是指連接數(shù)。Tomcat有兩種處理連接的模式,一種是 BIO,一個線程只處理一個連接,另一種就是 NIO,一個線程處理多個連接。
3、啟動tomcat。進(jìn)入apache-tomcat-0.0.M3下的bin目錄,雙擊startup.bat 在瀏覽器中的輸入10.1:8080,回車。查看tomcat是否啟動成功??吹绞煜さ男∝?,啟動成功了!查看tomcat服務(wù)器的最大連接數(shù)。
4、在tomcat配置文件server.xml中的Connector /配置中,和連接數(shù)相關(guān)的參數(shù)有:maxThreads=150 表示最多同時處理150個連接,Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創(chuàng)建的最大的線程數(shù)。默認(rèn)值200。
5、maxSpareThreads:最大空閑線程數(shù),如果超過這個值,會關(guān)閉無用的線程。acceptCount:當(dāng)處理請求超過此值時,將后來請求放到隊列中等待。
6、 最大線程數(shù)設(shè)置多少合適和tomcat的運行環(huán)境有關(guān)的,比如硬件,內(nèi)存等等,適當(dāng)可以給tomcat的運行最大分配的內(nèi)存加大點。另外,用一些工具: 比較ab, loadrunner做做壓力測試。
2. Tomcat經(jīng)驗值
max-threads線程數(shù)的經(jīng)驗值為:
1核2g內(nèi)存,線程數(shù)經(jīng)驗值200;
4核8g內(nèi)存,線程數(shù)經(jīng)驗值800。
4核8g內(nèi)存,建議值:
server: tomcat: max-connections: 10000 accept-count: 1000 max-threads: 800 min-spare-threads: 100
3. 其它參數(shù)詳解
- server.tomcat.max-connections: 8192
服務(wù)器在任何給定時間接受和處理的最大連接數(shù)。 一旦達(dá)到限制,操作系統(tǒng)仍然可以根據(jù)“acceptCount”屬性接受連接。
- server.tomcat.accept-count: 100
當(dāng)所有可能的請求處理線程都在使用時,傳入連接請求會被放進(jìn)隊列中等待,等待隊列的最大隊列長度。
- server.tomcat.threads.max: 200
服務(wù)器在給定時間能接受的連接數(shù)為server.tomcat.max-connections, 但并不是同時在工作,最大工作線程數(shù)。
- server.tomcat.threads.min-spare: 10
有最大的工作線程數(shù), 就有最小工作線程數(shù)。
- server.tomcat.uri-encoding: UTF-8
用于解碼 URI 的字符編碼。
- server.tomcat.max-http-form-post-size: 2MB
任何 HTTP POST請求中表單內(nèi)容的最大大小。理論上POST請求的大小是無限制的,但是tomcat設(shè)定了請求大小為兩兆,如要取消限制,則應(yīng)該將值設(shè)為 -1。
- server.tomcat.max-swallow-size: 2MB
請求正文的大小。
- server.tomcat.connection-timeout: 60000ms
連接器在接受連接后將等待呈現(xiàn)請求 URI 行的時間。即socket調(diào)用read()等待讀取的時間,如果在設(shè)置的時間內(nèi)沒有請求,則會主動斷開連接
- server.tomcat.keep-alive-timeout: (Duration)
在連接關(guān)閉之前等待另一個 HTTP 請求的時間。默認(rèn)和 connectionTimeout的值一樣。 設(shè)置為 -1 時不會超時。
- server.tomcat.max-keep-alive-requests: 100
Maximum number of HTTP requests that can be pipelined before the connection is closed. When set to 0 or 1, keep-alive and pipelining are disabled. When set to -1, an unlimited number of pipelined or keep-alive requests are allowed.
在連接關(guān)閉之前可以通過管道傳輸?shù)淖畲?HTTP 請求數(shù)。 當(dāng)設(shè)置為 0 或 1 時,長連接和管道被禁用,可以避免tomcat產(chǎn)生大量的TIME_WAIT連接,從而從一定程度上避免tomcat假死。 當(dāng)設(shè)置為 -1 時,允許無限數(shù)量的管道或長連接請求。
即表示該連接最大支持的請求數(shù)。超過該請求數(shù)的連接也將被關(guān)閉(此時就會返回一個Connection: close頭給客戶端)
其他一些不常用的設(shè)置
# 是否緩沖輸出,使其僅定期刷新。 server.tomcat.accesslog.buffered: true # 是否檢查日志文件是否存在,以便在外部進(jìn)程重命名它時可以重新創(chuàng)建它。 server.tomcat.accesslog.check-exists: false # 是否僅在“ServletRequest.getAttribute(conditionIf)”不產(chǎn)生 null 時才啟用請求的日志記錄。 server.tomcat.accesslog.condition-if: String # 是否僅在“ServletRequest.getAttribute(conditionUnless)”產(chǎn)生 null 時才啟用請求記錄。 server.tomcat.accesslog.condition-unless: String # 創(chuàng)建日志文件的目錄。 可以是絕對的或相對于 Tomcat 基本目錄。 server.tomcat.accesslog.directory: logs # 啟用訪問日志。 server.tomcat.accesslog.enabled: false # 日志文件使用的字符集。 默認(rèn)為系統(tǒng)默認(rèn)字符集。 server.tomcat.accesslog.encoding: String # 放置在日志文件名中的日期格式。 server.tomcat.accesslog.file-date-format: .yyyy-MM-dd # 是否使用 RFC 5952 定義的 IPv6 規(guī)范表示格式。 server.tomcat.accesslog.ipv6-canonical: false # 用于格式化日志條目和日志文件名后綴中的時間戳的語言環(huán)境。 默認(rèn)為 Java 進(jìn)程的默認(rèn)語言環(huán)境。 server.tomcat.accesslog.locale: String # 刪除訪問日志文件之前保留的天數(shù)。 server.tomcat.accesslog.max-days: -1 # 訪問日志的格式模式。 server.tomcat.accesslog.pattern: common # 日志文件名前綴。 server.tomcat.accesslog.prefix: access_log # 是否推遲在文件名中包含日期戳,直到輪換時間。 server.tomcat.accesslog.rename-on-rotate: false # 為請求使用的 IP 地址、主機名、協(xié)議和端口設(shè)置請求屬性。 server.tomcat.accesslog.request-attributes-enabled: false # 是否啟用訪問日志輪換。 server.tomcat.accesslog.rotate: true # 日志文件名后綴。 server.tomcat.accesslog.suffix: .log # 逗號分隔的附加模式列表,匹配 jar 以忽略 TLD 掃描。 特殊的“?” 和 '*' 字符可以在模式中使用,以分別匹配一個和一個字符以及零個或多個字符。 server.tomcat.additional-tld-skip-patterns: List<String> # 調(diào)用 backgroundProcess 方法之間的延遲。 如果未指定持續(xù)時間后綴,則將使用秒。 server.tomcat.background-processor-delay: 10s # Tomcat 基目錄。 如果未指定,則使用臨時目錄。 server.tomcat.basedir: File # 是否應(yīng)該啟用 Tomcat 的 MBean Registry。 server.tomcat.mbeanregistry.enabled: false # 將保留在緩存中并在后續(xù)請求中重用的最大空閑處理器數(shù)。 當(dāng)設(shè)置為 -1 時,緩存將不受限制,理論上的最大大小等于最大連接數(shù)。 server.tomcat.processor-cache: 200 # 是否應(yīng)通過將 / 附加到路徑來重定向?qū)ι舷挛母恼埱蟆?使用在代理處終止的 SSL 時,此屬性應(yīng)設(shè)置為 false。 server.tomcat.redirect-context-root: true # URI 路徑中應(yīng)允許的其他未編碼字符的逗號分隔列表。 只允許使用“< > [ \ ] ^ ` { | }”。 server.tomcat.relaxed-path-chars: List<Character> # URI 查詢字符串中應(yīng)允許的其他未編碼字符的逗號分隔列表。 只允許使用“< > [ \ ] ^ ` { | }”。 server.tomcat.relaxed-query-chars: List<Character> # 從中提取遠(yuǎn)程主機的 HTTP 表頭的名稱。 server.tomcat.remoteip.host-header: X-Forwarded-Host # 匹配要信任的代理的正則表達(dá)式。 server.tomcat.remoteip.internal-proxies: 10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}|0:0:0:0:0:0:0:1|::1 # 用于覆蓋原始端口值的 HTTP 標(biāo)頭的名稱。 server.tomcat.remoteip.port-header: X-Forwarded-Port # 包含傳入?yún)f(xié)議的標(biāo)頭,通常命名為“X-Forwarded-Proto”。 server.tomcat.remoteip.protocol-header: X-Forwarded-Proto # 指示傳入請求是否使用 SSL 的協(xié)議頭的值. server.tomcat.remoteip.protocol-header-https-value: https # 從中提取遠(yuǎn)程 IP 的 HTTP 表頭的名稱。 例如,`X-FORWARDED-FOR`。 server.tomcat.remoteip.remote-ip-header: X-FORWARDED-FOR # 此 Web 應(yīng)用程序是否允許靜態(tài)資源緩存。 server.tomcat.resource.allow-caching: true # 靜態(tài)資源緩存的生存時間。 server.tomcat.resource.cache-ttl: Duration # 通過調(diào)用 sendRedirect 生成的 HTTP 1.1 和更高版本的位置標(biāo)頭將使用相對重定向還是絕對重定向。 server.tomcat.use-relative-redirects: false
到此這篇關(guān)于SpringBoot內(nèi)置tomcat參數(shù)調(diào)優(yōu)的實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot tomcat參數(shù)調(diào)優(yōu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java多線程并發(fā)編程(互斥鎖Reentrant Lock)
這篇文章主要介紹了ReentrantLock 互斥鎖,在同一時間只能被一個線程所占有,在被持有后并未釋放之前,其他線程若想獲得該鎖只能等待或放棄,需要的朋友可以參考下2017-05-05Android開發(fā)中Socket通信的基本實現(xiàn)方法講解
這篇文章主要介紹了Android開發(fā)中Socket通信的基本實現(xiàn)方法講解,是安卓上移動互聯(lián)網(wǎng)程序開發(fā)的基礎(chǔ),需要的朋友可以參考下2015-12-12Java中的位運算符號解讀(&、|、^、~、<<、>>、>>>)
這篇文章主要介紹了Java中的位運算符號(&、|、^、~、<<、>>、>>>),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08Java?深入理解創(chuàng)建型設(shè)計模式之原型模式
原型(Prototype)模式的定義如下:用一個已經(jīng)創(chuàng)建的實例作為原型,通過復(fù)制該原型對象來創(chuàng)建一個和原型相同或相似的新對象。在這里,原型實例指定了要創(chuàng)建的對象的種類。用這種方式創(chuàng)建對象非常高效,根本無須知道對象創(chuàng)建的細(xì)節(jié)2022-02-02Spring?Boot?RestController接口輸出到終端的操作代碼
這篇文章主要介紹了Spring?Boot?RestController接口如何輸出到終端,使用?HttpServletResponse?類,可以在使用curl執(zhí)行?Spring?Boot?REST接口的同時,在控制臺輸出一些信息,給運維人員知道當(dāng)前命令執(zhí)行的狀態(tài),感興趣的朋友跟隨小編一起看看吧2023-09-09spring-Kafka中的@KafkaListener深入源碼解讀
本文主要通過深入了解源碼,梳理從spring啟動到真正監(jiān)聽kafka消息的這套流程,從spring啟動開始處理@KafkaListener,本文結(jié)合實例流程圖給大家講解的非常詳細(xì),需要的朋友參考下2023-02-02SpringBoot+JWT實現(xiàn)注冊、登錄、狀態(tài)續(xù)簽流程分析
這篇文章主要介紹了SpringBoot+JWT實現(xiàn)注冊、登錄、狀態(tài)續(xù)簽【登錄保持】,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06