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
到此这篇关于SpringBoot内置tomcat参数调优的实现的文章就介绍到这了,更多相关SpringBoot tomcat参数调优内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!