1. 为什么不进行Tomcat参数调优
有两个方案:进行Tomcat容器调优或者替换为性能更强的容器。可以进行Tomcat调优,但是Undertow容器在性能和内存上都优于Tomcat容器,因此直接选择Undertow容器并进行调优是更好的选择。
2. 在SpringBoot应用中如何优化Undertow性能
2.1. 线程池配置
在SpringBoot应用的application.properties
或application.yml
中,可以调整Undertow的线程池设置。包括IO线程和工作线程的设置。
server.undertow.io-threads
:设置IO线程数,负责处理非阻塞的网络IO。通常设置为与CPU核心数相等的值。它们会负责多个连接,不要设置过大,如果过大,启动项目会报错:打开文件数过多server.undertow.worker-threads
:阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程,它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
server.undertow.io-threads=8 server.undertow.worker-threads=128
2.2. 缓冲区和内存使用
server.undertow.buffer-size
:设置每个缓冲区的大小。以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理, 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可server.undertow.direct-buffers
:是否分配的直接内存(NIO直接分配的堆外内存)server.undertow.buffers-per-region
: 每个区分配的buffer数量,所以pool的大小是buffer-size * buffers-per-region
例如:
server.undertow.buffer-size=1024 server.undertow.direct-buffers=true
2.3. 连接和请求超时
server.undertow.max-http-post-size
:设置HTTP POST请求的最大内容大小,以适应可能的文件上传或大批量数据提交。server.undertow.no-request-timeout
:设置连接在不处理请求的情况下闲置的时间。
例如:
server.undertow.max-http-post-size=0 # 不限制大小,或根据实际情况调整 server.undertow.no-request-timeout=1800s # 例如,设置为30分钟
2.4. 禁用无关的设置
server.undertow.session-cookie-config
:设置会话cookie的配置,可以选择不使用cookie以减少HTTP响应的大小。server.undertow.accesslog.enabled
:根据需要启用或禁用访问日志。
例如:
server.undertow.session-cookie-config=none server.undertow.accesslog.enabled=false
2.5. 编程式配置
通过实现WebServerFactoryCustomizer<UndertowServletWebServerFactory>
接口来编程式地配置Undertow,可以更加灵活。
2.6. 启用HTTP/2
通过配置启用Undertow支持的HTTP/2,可以提高网络传输效率。
2.7 示例配置
在SpringBoot项目的application.properties
或application.yml
中配置:
# IO线程 server.undertow.io-threads=16 # 工作线程 server.undertow.worker-threads=256 # 缓冲区大小 server.undertow.buffer-size=1024 # 是否分配的直接内存(NIO直接分配的堆外内存) server.undertow.direct-buffers=true # 启用HTTP/2 server.undertow.enabled-http2=true