SpringBoot内置tomcat参数调优
1. 默认配置
可通过org.springframework.boot.autoconfigure.web.ServerProperties查看,其中包括属性tomcat、jetty、undertow三种服务器的设置,默认启用tomcat。
# tomcat 8
server:
tomcat:
max-connections: 10000 #最大连接数,默认为10000
accept-count: 100 # 最大连接等待数,默认100
max-threads: 200 #最大工作线程数,默认200
min-spare-threads: 10 #最小工作线程数,默认10
# tomcat 9
server:
tomcat:
max-connections: 8192
accept-count: 100
threads:
max: 200
min-spare: 10
详解:maxConnections、maxThreads、acceptCount
每一次HTTP请求到达Web服务器,Web服务器都会创建一个线程来处理该请求
min-spare-threads:
最小备用线程数,tomcat启动时的初始化的线程数,默认10。(适当增大一些,以便应对突然增长的访问量)
max-threads:
Tomcat可创建的最大工作线程数,默认200, 每一个线程处理一个请求,超过这个请求数后,客户端请求只能排队,等有线程释放才能处理。(4核8g内存,线程数800,一般是 核数*200 。操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。)
accept-count:
当调用Web服务的HTTP请求数达到tomcat的最大线程数时,还有新的HTTP请求到来,这时tomcat会将该请求放在等待队列中,这个acceptCount就是指能够接受的最大等待数,默认100。
如果等待队列也被放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused),队列也做缓冲池用,但也不能无限长,不但消耗内存,而且出队入队也消耗CPU。
max-connections:
这个参数是指在同一时间,tomcat能够接受的最大连接数。一般这个值要大于(max-threads)+(accept-count)。
tomcat的最大线程数,最大排队数多少合适
1、Tomcat默认的HTTP实现是采用阻塞式的Socket通信,每个请求都需要创建一个线程处理,当一个进程有500个线程在跑的话,那性能已经是很低很低了。Tomcat 默认配置的最大请求数是150,也就是说同时支持150个并发。
2、SpringBoot内置Tomcat,在默认设置中,Tomcat的最大线程数是 200,最大连接数是 10000。支持的并发量是指连接数。Tomcat有两种处理连接的模式,一种是 BIO,一个线程只处理一个连接,另一种就是 NIO,一个线程处理多个连接。
3、启动tomcat。进入apache-tomcat-0.0.M3下的bin目录,双击startup.bat 在浏览器中的输入10.1:8080,回车。查看tomcat是否启动成功。看到熟悉的小猫,启动成功了!查看tomcat服务器的最大连接数。
4、在tomcat配置文件server.xml中的Connector /配置中,和连接数相关的参数有:maxThreads=150 表示最多同时处理150个连接,Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。
5、maxSpareThreads:最大空闲线程数,如果超过这个值,会关闭无用的线程。acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。
6、 最大线程数设置多少合适和tomcat的运行环境有关的,比如硬件,内存等等,适当可以给tomcat的运行最大分配的内存加大点。另外,用一些工具: 比较ab, loadrunner做做压力测试。
2. Tomcat经验值
max-threads线程数的经验值为:
1核2g内存,线程数经验值200;
4核8g内存,线程数经验值800。
4核8g内存,建议值:
server:
tomcat:
max-connections: 10000
accept-count: 1000
max-threads: 800
min-spare-threads: 100
3. 其它参数详解
- server.tomcat.max-connections: 8192
服务器在任何给定时间接受和处理的最大连接数。 一旦达到限制,操作系统仍然可以根据“acceptCount”属性接受连接。
- server.tomcat.accept-count: 100
当所有可能的请求处理线程都在使用时,传入连接请求会被放进队列中等待,等待队列的最大队列长度。
- server.tomcat.threads.max: 200
服务器在给定时间能接受的连接数为server.tomcat.max-connections, 但并不是同时在工作,最大工作线程数。
- server.tomcat.threads.min-spare: 10
有最大的工作线程数, 就有最小工作线程数。
- server.tomcat.uri-encoding: UTF-8
用于解码 URI 的字符编码。
- server.tomcat.max-http-form-post-size: 2MB
任何 HTTP POST请求中表单内容的最大大小。理论上POST请求的大小是无限制的,但是tomcat设定了请求大小为两兆,如要取消限制,则应该将值设为 -1。
- server.tomcat.max-swallow-size: 2MB
请求正文的大小。
- server.tomcat.connection-timeout: 60000ms
连接器在接受连接后将等待呈现请求 URI 行的时间。即socket调用read()等待读取的时间,如果在设置的时间内没有请求,则会主动断开连接
- server.tomcat.keep-alive-timeout: (Duration)
在连接关闭之前等待另一个 HTTP 请求的时间。默认和 connectionTimeout的值一样。 设置为 -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.
在连接关闭之前可以通过管道传输的最大 HTTP 请求数。 当设置为 0 或 1 时,长连接和管道被禁用,可以避免tomcat产生大量的TIME_WAIT连接,从而从一定程度上避免tomcat假死。 当设置为 -1 时,允许无限数量的管道或长连接请求。
即表示该连接最大支持的请求数。超过该请求数的连接也将被关闭(此时就会返回一个Connection: close头给客户端)
其他一些不常用的设置
# 是否缓冲输出,使其仅定期刷新。
server.tomcat.accesslog.buffered: true
# 是否检查日志文件是否存在,以便在外部进程重命名它时可以重新创建它。
server.tomcat.accesslog.check-exists: false
# 是否仅在“ServletRequest.getAttribute(conditionIf)”不产生 null 时才启用请求的日志记录。
server.tomcat.accesslog.condition-if: String
# 是否仅在“ServletRequest.getAttribute(conditionUnless)”产生 null 时才启用请求记录。
server.tomcat.accesslog.condition-unless: String
# 创建日志文件的目录。 可以是绝对的或相对于 Tomcat 基本目录。
server.tomcat.accesslog.directory: logs
# 启用访问日志。
server.tomcat.accesslog.enabled: false
# 日志文件使用的字符集。 默认为系统默认字符集。
server.tomcat.accesslog.encoding: String
# 放置在日志文件名中的日期格式。
server.tomcat.accesslog.file-date-format: .yyyy-MM-dd
# 是否使用 RFC 5952 定义的 IPv6 规范表示格式。
server.tomcat.accesslog.ipv6-canonical: false
# 用于格式化日志条目和日志文件名后缀中的时间戳的语言环境。 默认为 Java 进程的默认语言环境。
server.tomcat.accesslog.locale: String
# 删除访问日志文件之前保留的天数。
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 地址、主机名、协议和端口设置请求属性。
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>
# 调用 backgroundProcess 方法之间的延迟。 如果未指定持续时间后缀,则将使用秒。
server.tomcat.background-processor-delay: 10s
# Tomcat 基目录。 如果未指定,则使用临时目录。
server.tomcat.basedir: File
# 是否应该启用 Tomcat 的 MBean Registry。
server.tomcat.mbeanregistry.enabled: false
# 将保留在缓存中并在后续请求中重用的最大空闲处理器数。 当设置为 -1 时,缓存将不受限制,理论上的最大大小等于最大连接数。
server.tomcat.processor-cache: 200
# 是否应通过将 / 附加到路径来重定向对上下文根的请求。 使用在代理处终止的 SSL 时,此属性应设置为 false。
server.tomcat.redirect-context-root: true
# URI 路径中应允许的其他未编码字符的逗号分隔列表。 只允许使用“< > [ \ ] ^ ` { | }”。
server.tomcat.relaxed-path-chars: List<Character>
# URI 查询字符串中应允许的其他未编码字符的逗号分隔列表。 只允许使用“< > [ \ ] ^ ` { | }”。
server.tomcat.relaxed-query-chars: List<Character>
# 从中提取远程主机的 HTTP 表头的名称。
server.tomcat.remoteip.host-header: X-Forwarded-Host
# 匹配要信任的代理的正则表达式。
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 标头的名称。
server.tomcat.remoteip.port-header: X-Forwarded-Port
# 包含传入协议的标头,通常命名为“X-Forwarded-Proto”。
server.tomcat.remoteip.protocol-header: X-Forwarded-Proto
# 指示传入请求是否使用 SSL 的协议头的值.
server.tomcat.remoteip.protocol-header-https-value: https
# 从中提取远程 IP 的 HTTP 表头的名称。 例如,`X-FORWARDED-FOR`。
server.tomcat.remoteip.remote-ip-header: X-FORWARDED-FOR
# 此 Web 应用程序是否允许静态资源缓存。
server.tomcat.resource.allow-caching: true
# 静态资源缓存的生存时间。
server.tomcat.resource.cache-ttl: Duration
# 通过调用 sendRedirect 生成的 HTTP 1.1 和更高版本的位置标头将使用相对重定向还是绝对重定向。
server.tomcat.use-relative-redirects: false