本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford

Undertow 的配置可以参考 Undertow 的 Builder,并且其中也有一些默认的配置参数:

Undertow

private Builder() {ioThreads = Math.max(Runtime.getRuntime().availableProcessors(), 2);workerThreads = ioThreads * 8;long maxMemory = Runtime.getRuntime().maxMemory();//smaller than 64mb of ram we use 512b buffersif (maxMemory < 64 * 1024 * 1024) {//use 512b buffersdirectBuffers = false;bufferSize = 512;} else if (maxMemory < 128 * 1024 * 1024) {//use 1k buffersdirectBuffers = true;bufferSize = 1024;} else {//use 16k buffers for best performance//as 16k is generally the max amount of data that can be sent in a single write() calldirectBuffers = true;bufferSize = 1024 * 16 - 20; //the 20 is to allow some space for protocol headers, see UNDERTOW-1209}}
  • ioThreads 大小为可用 CPU 数量 * 2,即 Undertow 的 XNIO 的读线程个数为可用 CPU 数量,写线程个数也为可用 CPU 数量。
  • workerThreads 大小为 ioThreads 数量 * 8.
  • 如果内存大小小于 64 MB,则不使用直接内存,bufferSize 为 512 字节
  • 如果内存大小大于 64 MB 小于 128 MB,则使用直接内存,bufferSize 为 1024 字节
  • 如果内存大小大于 128 MB,则使用直接内存,bufferSize 为 16 KB 减去 20 字节,这 20 字节用于协议头。

DefaultByteBufferPool 构造器:

public DefaultByteBufferPool(boolean direct, int bufferSize, int maximumPoolSize, int threadLocalCacheSize, int leakDecetionPercent) {this.direct = direct;this.bufferSize = bufferSize;this.maximumPoolSize = maximumPoolSize;this.threadLocalCacheSize = threadLocalCacheSize;this.leakDectionPercent = leakDecetionPercent;if(direct) {arrayBackedPool = new DefaultByteBufferPool(false, bufferSize, maximumPoolSize, 0, leakDecetionPercent);} else {arrayBackedPool = this;}
}

其中:

  • direct:是否使用直接内存,我们需要设置为 true,来使用直接内存。
  • bufferSize:每次申请的 buffer 大小,我们主要要考虑这个大小
  • maximumPoolSize:buffer 池最大大小,一般不用修改
  • threadLocalCacheSize:线程本地 buffer 池大小,一般不用修改
  • leakDecetionPercent:内存泄漏检查百分比,目前没啥卵用

对于 bufferSize,最好和你系统的 TCP Socket Buffer 配置一样。在我们的容器中,我们将微服务实例的容器内的 TCP Socket Buffer 的读写 buffer 大小成一模一样的配置(因为微服务之间调用,发送的请求也是另一个微服务接受,所以调整所有微服务容器的读写 buffer 大小一致,来优化性能,默认是根据系统内存来自动计算出来的)。

查看 Linux 系统 TCP Socket Buffer 的大小:

  • /proc/sys/net/ipv4/tcp_rmem (对于读取)
  • /proc/sys/net/ipv4/tcp_wmem (对于写入)

在我们的容器中,分别是:

bash-4.2# cat /proc/sys/net/ipv4/tcp_rmem
4096    16384   4194304
bash-4.2# cat /proc/sys/net/ipv4/tcp_wmem
4096    16384   4194304

从左到右三个值分别为:每个 TCP Socket 的读 Buffer 与写 Buffer 的大小的 最小值,默认值和最大值,单位是字节。

我们设置我们 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

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线程数*8worker: 128

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: truethreads:# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个读线程和一个写线程io: 4# 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程# 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8worker: 128# http post body 大小,默认为 -1B ,即不限制max-http-post-size: -1B# 是否在启动时创建 filter,默认为 true,不用修改eager-filter-init: true# 限制路径参数数量,默认为 1000max-parameters: 1000# 限制 http header 数量,默认为 200max-headers: 200# 限制 http header 中 cookies 的键值对数量,默认为 200max-cookies: 200# 是否允许 / 与 %2F 转义。/ 是 URL 保留字,除非你的应用明确需要,否则不要开启这个转义,默认为 falseallow-encoded-slash: false# 是否允许 URL 解码,默认为 true,除了 %2F 其他的都会处理decode-url: true# url 字符编码集,默认是 utf-8url-charset: utf-8# 响应的 http header 是否会加上 'Connection: keep-alive',默认为 truealways-set-keep-alive: true# 请求超时,默认是不超时,我们的微服务因为可能有长时间的定时任务,所以不做服务端超时,都用客户端超时,所以我们保持这个默认配置no-request-timeout: -1# 是否在跳转的时候保持 path,默认是关闭的,一般不用配置preserve-path-on-forward: falseoptions:# spring boot 没有抽象的 xnio 相关配置在这里配置,对应 org.xnio.Options 类socket:SSL_ENABLED: false# spring boot 没有抽象的 undertow 相关配置在这里配置,对应 io.undertow.UndertowOptions 类server:ALLOW_UNKNOWN_PROTOCOLS: false

Spring Boot 并没有将所有的 Undertow 与 XNIO 配置进行抽象,如果你想自定义一些相关配置,可以通过上面配置最后的 server.undertow.options 进行配置。server.undertow.options.socket 对应 XNIO 的相关配置,配置类是 org.xnio.Options;server.undertow.options.server 对应 Undertow 的相关配置,配置类是 io.undertow.UndertowOptions

我们这一节详细介绍了 Undertow 的核心配置,主要包括线程池以及 buffer 配置,以及关于 http 协议的一些配置。并且我们还介绍了这些配置在 spring boot 下该如何配置。下一节,我们将详细介绍如何配置 Undertow 的 accesslog。

微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer

SpringCloud升级之路2020.0.x版-13.UnderTow 核心配置相关推荐

  1. SpringCloud升级之路2020.0.x版-12.UnderTow 简介与内部原理

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 在我们的项目中,我 ...

  2. SpringCloud升级之路2020.0.x版-43.为何 SpringCloudGateway 中会有链路信息丢失

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在开始编写我们自己的日志 Filter 之前,还有一个问题我想在这里和大家分享,即在 Sp ...

  3. SpringCloud升级之路2020.0.x版-26.OpenFeign的组件

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 首先,我们给出官方文档中的组件结构图: [外链图片转存失败,源站可能有防盗链机制,建议将图 ...

  4. SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本流程讲解(3)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们继续分析上一节提到的 WebHandler.加入 Spring Cloud Sleut ...

  5. 2021-08-05SpringCloud升级之路2020.0.x版-5.所有项目的parent与spring-framework-common说明

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 源代码文件:htt ...

  6. Spring Cloud 升级之路 - 2020.0.x - 1. 背景知识、需求描述与公共依赖

    1. 背景知识.需求描述与公共依赖 1.1. 背景知识 & 需求描述 Spring Cloud 官方文档说了,它是一个完整的微服务体系,用户可以通过使用 Spring Cloud 快速搭建一个 ...

  7. note8 升级android9,三星note8 N9500一键ADB升级One UI 9.0内测版

    三星note8 N9500一键ADB升级One UI 9.0内测版是一款三星N9500 ADB一键升级9.0底包和刷机教程,三星 note8 安卓Pie,One UI .自己动手丰衣足食,抢不到官方资 ...

  8. 三星android安卓版本怎么升级,三星更改安卓9.0升级计划三款机型将可以升级到安卓9.0正式版...

    描述 近日有网友发现三星中国更新了安卓9.0系统升级公告,和本月初那个公告相比,最明显的变化是国行Galaxy S9.S9+以及Galaxy Note9的升级时间提前到2019年1月,而原本计划是今年 ...

  9. 从零开始的OpenGL之路(0)——OpenGL介绍与环境配置

    我个人的学习习惯是先了解这个东西是具体用来干什么的,再去学习怎么使用它.按照这个顺序,让我们先来看看OpenGL到底是干什么的. 首先,OpenGL一般被认为是一个API(应用程序编程接口),包含了一 ...

最新文章

  1. WEB SSH Ajaxterm客户端配置(1)
  2. python在线运行-Python在线练习运行平台
  3. jQueryMobile引入文件后样式无法正常显示
  4. mysql 主备及时_MySQL高可用(二)主备延时如何解决?
  5. jqgrid ajax reload,jqgrid“reloadGrid”动作后将数据重新加载到文本框
  6. rabbitmq技术的一些感悟(一)
  7. 漫谈忠诚:猪八戒为什么总想离队
  8. 第一章 Spring的简单剖析
  9. 几种JS倒计时代码 【转】
  10. idea在mac版怎么配置svn_idea配置svn的步骤
  11. 51单片机c语言实训报告总结,单片机实训心得体会
  12. 尚学堂高淇python课件代码_尚学堂高淇Python400集全套视频教程百度云网盘分享
  13. 机器学习(十五)回归算法之线性回归
  14. 致那些喜欢站在上帝视角的人
  15. 嵌入式linux之yocto(三)qemu
  16. jffs2_note
  17. 中科创达软件测试校招面试题 一面(技术)+二面(hr)
  18. Python语言学习笔记-001-Python 3.3.0的配置与Hello World
  19. 安卓开发选取城市列表
  20. 将一个任意整数插入到已排列的整型数组中,插入后,数组中的数仍保持有序...

热门文章

  1. iphone手机黑屏了 但是打电话过来是通的声音
  2. 事事皆有机缘,不争、不抢、不露。
  3. 鸿蒙大陆9.1正式版礼包,鸿蒙大陆4.1正式版攻略
  4. html中%3cp%3e中加空格,html中空白空格怎么打?
  5. python爬虫之xpath的使用
  6. Xftp中汉字文件夹名显示乱码解决方案
  7. 制作生鲜小程序 迷你生鲜小程序 生鲜商城 平邑做淘宝网店详情页
  8. 174_技巧_Power BI 动态格式(万|亿)
  9. 大数据发展前景:大数据未来竟是这样?
  10. 最短路径问题(Dijkstra算法)