在 Spring 引导中增加 Tomcat 的连接超时
Increasing connection timeout for Tomcat in Spring Boot
如何增加超时,以便在处理响应之前,请求不会超时?
Tomcat Spring 引导中的设置:
server.tomcat.max-connections=2000
server.tomcat.max-threads=200
server.connection-timeout=1200000
在 15 秒的过程中,每秒请求数 constantUsersPerSec(20) during (15)
增加到 300,并且所有请求都得到处理,如下图所示,来自 gatling(蓝色)。
scn.inject(
constantUsersPerSec(20) during (15),
)
这是由于 max-connections = 2000
使用 200
工作线程处理了 300 个请求。
控制器是用 Spring MVC 编写的,其中 returns DeferredResult
进行异步请求处理,因此一旦响应被处理就会恢复响应。
但是即使 server.connection-timeout
设置为高数 1200000
也有很多 503 接近尾声(红色)
> status.find.in(200,304,201,202,203,204,205,206,207,208,209), b 78 (100.0%)
ut actually found 503
Gatling.conf 也设置为增加超时:
timeOut {
simulation = 8640000 # Absolute timeout, in seconds, of a simulation
}
ahc {
#keepAlive = true # Allow pooling HTTP connections (keep-alive header automatically added)
connectTimeout = 600000 # Timeout when establishing a connection
handshakeTimeout = 600000 # Timeout when performing TLS hashshake
pooledConnectionIdleTimeout = 600000 # Timeout when a connection stays unused in the pool
readTimeout = 600000 # Timeout when a used connection stays idle
#maxRetry = 2 # Number of times that a request should be tried again
requestTimeout = 600000
根据 Rcordoval -
的评论
Check this property: spring.mvc.async.request-timeout= # Amount of
time before asynchronous request handling times out
此设置有助于其余的 gatling 配置
spring.mvc.async.request-timeout=1200000
然而,根本原因是当请求大量涌入时,所有工作线程 (200) 都忙于上传打开的连接 (2000)(控制器将 MultipartFile 作为参数并返回 DeferredResult )
我认为 DeferredResult
在请求服务逻辑快而业务逻辑慢(在 forkjoin.commonPool 上运行)时表现出色。它不太适合 MultiPartFile 上传(阻塞和缓慢),当文件很大时更是如此,因为那时响应不会很快恢复(如上面的每秒响应图表所示,仅在几秒钟后响应开始恢复,因为打开连接是 2000 而工人只有 200)。如果工作人员增加,那么它无论如何都会削弱异步处理的优势。
在这种情况下,请求处理(上传和阻止)很慢,而业务逻辑很快。因此响应已准备就绪,但所有工作线程 (200) 都忙于服务越来越多的请求,导致响应无法恢复并因此超时。
可能需要在使用 DeferredResult 的异步处理中为 request serve
和 response resume
设置单独的池?
如何增加超时,以便在处理响应之前,请求不会超时?
Tomcat Spring 引导中的设置:
server.tomcat.max-connections=2000
server.tomcat.max-threads=200
server.connection-timeout=1200000
在 15 秒的过程中,每秒请求数 constantUsersPerSec(20) during (15)
增加到 300,并且所有请求都得到处理,如下图所示,来自 gatling(蓝色)。
scn.inject(
constantUsersPerSec(20) during (15),
)
这是由于 max-connections = 2000
使用 200
工作线程处理了 300 个请求。
控制器是用 Spring MVC 编写的,其中 returns DeferredResult
进行异步请求处理,因此一旦响应被处理就会恢复响应。
但是即使 server.connection-timeout
设置为高数 1200000
也有很多 503 接近尾声(红色)
> status.find.in(200,304,201,202,203,204,205,206,207,208,209), b 78 (100.0%)
ut actually found 503
Gatling.conf 也设置为增加超时:
timeOut {
simulation = 8640000 # Absolute timeout, in seconds, of a simulation
}
ahc {
#keepAlive = true # Allow pooling HTTP connections (keep-alive header automatically added)
connectTimeout = 600000 # Timeout when establishing a connection
handshakeTimeout = 600000 # Timeout when performing TLS hashshake
pooledConnectionIdleTimeout = 600000 # Timeout when a connection stays unused in the pool
readTimeout = 600000 # Timeout when a used connection stays idle
#maxRetry = 2 # Number of times that a request should be tried again
requestTimeout = 600000
根据 Rcordoval -
的评论Check this property: spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out
此设置有助于其余的 gatling 配置
spring.mvc.async.request-timeout=1200000
然而,根本原因是当请求大量涌入时,所有工作线程 (200) 都忙于上传打开的连接 (2000)(控制器将 MultipartFile 作为参数并返回 DeferredResult )
我认为 DeferredResult
在请求服务逻辑快而业务逻辑慢(在 forkjoin.commonPool 上运行)时表现出色。它不太适合 MultiPartFile 上传(阻塞和缓慢),当文件很大时更是如此,因为那时响应不会很快恢复(如上面的每秒响应图表所示,仅在几秒钟后响应开始恢复,因为打开连接是 2000 而工人只有 200)。如果工作人员增加,那么它无论如何都会削弱异步处理的优势。
在这种情况下,请求处理(上传和阻止)很慢,而业务逻辑很快。因此响应已准备就绪,但所有工作线程 (200) 都忙于服务越来越多的请求,导致响应无法恢复并因此超时。
可能需要在使用 DeferredResult 的异步处理中为 request serve
和 response resume
设置单独的池?