Spring Cloud 升级之路 - 2020.0.x - 2. 使用 Undertow 作为我们的 Web 服务容器 (3)

我们设置我们 Undertow 的 buffer size 为 TCP Socket Buffer 的默认值,即 16 KB。Undertow 的 Builder 里面,如果内存大于 128 MB,buffer size 为 16 KB 减去 20 字节(为协议头预留)。所以,我们使用默认的即可

application.yml 配置:

server.undertow: # 是否分配的直接内存(NIO直接分配的堆外内存),这里开启,所以java启动参数需要配置下直接内存大小,减少不必要的GC # 在内存大于 128 MB 时,默认就是使用直接内存的 directBuffers: true # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作 # 如果每次需要 ByteBuffer 的时候都去申请,对于堆内存的 ByteBuffer 需要走 JVM 内存分配流程(TLAB -> 堆),对于直接内存则需要走系统调用,这样效率是很低下的。 # 所以,一般都会引入内存池。在这里就是 `BufferPool`。 # 目前,UnderTow 中只有一种 `DefaultByteBufferPool`,其他的实现目前没有用。 # 这个 DefaultByteBufferPool 相对于 netty 的 ByteBufArena 来说,非常简单,类似于 JVM TLAB 的机制 # 对于 bufferSize,最好和你系统的 TCP Socket Buffer 配置一样 # `/proc/sys/net/ipv4/tcp_rmem` (对于读取) # `/proc/sys/net/ipv4/tcp_wmem` (对于写入) # 在内存大于 128 MB 时,bufferSize 为 16 KB 减去 20 字节,这 20 字节用于协议头 buffer-size: 16384 - 20 Undertow Worker 配置

Worker 配置其实就是 XNIO 的核心配置,主要需要配置的即 io 线程池以及 worker 线程池大小。

默认情况下,io 线程大小为可用 CPU 数量 * 2,即读线程个数为可用 CPU 数量,写线程个数也为可用 CPU 数量。worker 线程池大小为 io 线程大小 * 8.

微服务应用由于涉及的阻塞操作比较多,所以可以将 worker 线程池大小调大一些。我们的应用设置为 io 线程大小 * 32.

application.yml 配置:

server.undertow.threads: # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个读线程和一个写线程 io: 16 # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程 # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8 worker: 128 Spring Boot 中的 Undertow 配置

Spring Boot 中对于 Undertow 相关配置的抽象是 ServerProperties 这个类。目前 Undertow 涉及的所有配置以及说明如下(不包括 accesslog 相关的,accesslog 会在下一节详细分析):

server: undertow: # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作 # 如果每次需要 ByteBuffer 的时候都去申请,对于堆内存的 ByteBuffer 需要走 JVM 内存分配流程(TLAB -> 堆),对于直接内存则需要走系统调用,这样效率是很低下的。 # 所以,一般都会引入内存池。在这里就是 `BufferPool`。 # 目前,UnderTow 中只有一种 `DefaultByteBufferPool`,其他的实现目前没有用。 # 这个 DefaultByteBufferPool 相对于 netty 的 ByteBufArena 来说,非常简单,类似于 JVM TLAB 的机制 # 对于 bufferSize,最好和你系统的 TCP Socket Buffer 配置一样 # `/proc/sys/net/ipv4/tcp_rmem` (对于读取) # `/proc/sys/net/ipv4/tcp_wmem` (对于写入) # 在内存大于 128 MB 时,bufferSize 为 16 KB 减去 20 字节,这 20 字节用于协议头 buffer-size: 16364 # 是否分配的直接内存(NIO直接分配的堆外内存),这里开启,所以java启动参数需要配置下直接内存大小,减少不必要的GC # 在内存大于 128 MB 时,默认就是使用直接内存的 directBuffers: true threads: # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个读线程和一个写线程 io: 4 # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程 # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8 worker: 128 # http post body 大小,默认为 -1B ,即不限制 max-http-post-size: -1B # 是否在启动时创建 filter,默认为 true,不用修改 eager-filter-init: true # 限制路径参数数量,默认为 1000 max-parameters: 1000 # 限制 http header 数量,默认为 200 max-headers: 200 # 限制 http header 中 cookies 的键值对数量,默认为 200 max-cookies: 200 # 是否允许 / 与 %2F 转义。/ 是 URL 保留字,除非你的应用明确需要,否则不要开启这个转义,默认为 false allow-encoded-slash: false # 是否允许 URL 解码,默认为 true,除了 %2F 其他的都会处理 decode-url: true # url 字符编码集,默认是 utf-8 url-charset: utf-8 # 响应的 http header 是否会加上 'Connection: keep-alive',默认为 true always-set-keep-alive: true # 请求超时,默认是不超时,我们的微服务因为可能有长时间的定时任务,所以不做服务端超时,都用客户端超时,所以我们保持这个默认配置 no-request-timeout: -1 # 是否在跳转的时候保持 path,默认是关闭的,一般不用配置 preserve-path-on-forward: false options: # spring boot 没有抽象的 xnio 相关配置在这里配置,对应 org.xnio.Options 类 socket: SSL_ENABLED: false # spring boot 没有抽象的 undertow 相关配置在这里配置,对应 io.undertow.UndertowOptions 类 server: ALLOW_UNKNOWN_PROTOCOLS: false

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfsdd.html