精华内容
下载资源
问答
  • undertow参数配置
    千次阅读
    2020-09-22 08:54:51
    # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
    # 不要设置过大,如果过大,启动项目会报错:打开文件数过多
    #server.undertow.io-threads=32
    # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
    # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
    #server.undertow.worker-threads=2000
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    # 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
    server.undertow.buffer-size=1024
    # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
    server.undertow.buffers-per-region=1024
    # 是否分配的直接内存(NIO直接分配的堆外内存)
    server.undertow.direct-buffers=true

     

    更多相关内容
  • Spring Boot 内嵌容器Undertow参数设置

    万次阅读 2017-12-26 20:50:15
    配置项:# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程,不要设置过大,如果过大,启动项目会报错:打开文件数过多server.undertow.io-threads=16# 阻塞任务线程池, 当...

    配置项:

    # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
    # 不要设置过大,如果过大,启动项目会报错:打开文件数过多
    
    server.undertow.io-threads=16
    
    # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
    # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
    
    server.undertow.worker-threads=256
    
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    # 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
    
    server.undertow.buffer-size=1024
    
    # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
    
    server.undertow.buffers-per-region=1024
    
    # 是否分配的直接内存(NIO直接分配的堆外内存)
    
    server.undertow.direct-buffers=true

    来看看源代码:

    https://github.com/undertow-io/undertow/blob/master/core/src/main/java/io/undertow/Undertow.java

    ioThreads = Math.max(Runtime.getRuntime().availableProcessors(), 2);
    
    workerThreads = ioThreads * 8;
    
    //smaller than 64mb of ram we use 512b buffers
    if (maxMemory < 64 * 1024 * 1024) {
        //use 512b buffers
        directBuffers = false;
        bufferSize = 512;
    } else if (maxMemory < 128 * 1024 * 1024) {
        //use 1k buffers
        directBuffers = 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() call
        directBuffers = true;
        bufferSize = 1024 * 16 - 20; //the 20 is to allow some space for protocol headers, see UNDERTOW-1209
    }

    很显然,Undertow认为它的运用场景是在IO密集型的系统应用中,并且认为多核机器是一个比较容易满足的点,Undertow初始化假想应用的阻塞系数在0.8~0.9之间,所以阻塞线程数直接乘了个8,当然,如果对应用较精确的估测阻塞系数,可以配置上去,

    展开全文
  • Undertow配置可以参考 Undertow 的 Builder,并且其中也有一些默认的配置参数Undertow private Builder() { ioThreads = Math.max(Runtime.getRuntime().availableProcessors(), 2); wo..

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

    image

    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 buffers
        if (maxMemory < 64 * 1024 * 1024) {
            //use 512b buffers
            directBuffers = false;
            bufferSize = 512;
        } else if (maxMemory < 128 * 1024 * 1024) {
            //use 1k buffers
            directBuffers = 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() call
            directBuffers = 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 字节用于协议头。

    image

    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
    

    image

    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
    

    image

    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
    

    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

    展开全文
  • starter-undertowartifactId> <exclusions> <exclusion> <artifactId>undertow-websockets-jsrartifactId> <groupId>io.undertowgroupId> exclusion> exclusions> dependency> 配置修改 server: undertow: # 默认...

    maven依赖修改

    去除 tomcat

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    	<version>2.3.6.RELEASE</version>
    	<exclusions>
    		<exclusion>
    			<artifactId>spring-boot-starter-tomcat</artifactId>
    			<groupId>org.springframework.boot</groupId>
    		</exclusion>
    	</exclusions>
    </dependency>
    

    添加 Undertow

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-undertow</artifactId>
        <exclusions>
            <exclusion>
                <artifactId>undertow-websockets-jsr</artifactId>
                <groupId>io.undertow</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    

    配置修改

    server:
      undertow:
        # 默认设置每个CPU核心一个线程 比如 四核的服务器  则配置4
        io-threads: 4
        # 默认值是IO线程数 * 8   高并发的服务可以根据并发情况调大一些
        worker-threads: 256
    
    展开全文
  • SpringBoot的WEB容器使用及配置 注:可查看org.springframework.boot.autoconfigure.web.ServerProperties类 SpringBoot项目中使用Tomcat容器 SpringBoot项目中默认使用的嵌入式Web容器为Tomcat,Maven配置如下即可...
  • 大家好,这篇文章我们来介绍下动态线程池框架(DynamicTp)的adapter模块,上篇文章也大概介绍过了,该模块主要是用来适配一些第三方组件的线程池管理,让第三方组件内置的线程池也能享受到动态参数调整,监控告警...
  • Spring boot 弃用tomcat 作为内嵌服务器,转用undertowconfigurations {compile.exclude module: “spring-boot-starter-tomcat”}compile “org.springframework.boot:spring-boot-starter-undertow:$...
  • undertow,jetty和tomcat可以说是javaweb项目当下最火的三款服务器,tomcat是apache下的一款重量级的服务器,不用多说历史悠久,经得起实践的考验。然而:当下微服务兴起,spring boot ,spring cloud 越来越热的情况...
  • JFinal-Undertow 配置文件工作原理

    千次阅读 2020-06-17 11:53:12
    目录 1. 默认配置文件 2. 生产版本配置文件 3. 配置项默认值 4.web 资源加载路径配置 1. 默认配置文件 ...首先要从 UndertowServer 说起,UndertowServer 有多个创建... * 尝试使用 "undertow.txt" 以及 "undertow..
  • Undertow

    2021-03-13 01:20:18
    Spring Boot 内嵌容器Undertow参数设置配置项:# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程# 不要设置过大,如果过大,启动项目会报错:打开文件数过多server....
  • 本系列代码地址:... server: undertow: # access log相关配置 accesslog: # 存放目录,默认为 logs dir: ./log # 是否开启 enabled: true # 格式,各种占位符后面会详细说明 pat..
  • Spring Boot 2.0 教程 | 配置 Undertow 容器

    千次阅读 2019-02-25 20:18:21
    欢迎关注微信公众号: 小哈学Java ...本节中,您将学习如何在 Spring Boot 中配置 Undertow 容器。配置之前,您需要知道的是,Tomcat, Jetty, Undertow 作为三大主流 Servelt 容器,Undertow 的性能要...
  • SpringWeb容器优化之undertow

    千次阅读 2020-05-14 17:04:04
    tomcate一直是java web亲赖的servlet容器,但是近段时间才发现,undertow...# undertow容器配置 server: undertow: accesslog: enabled: false dir: logs io-threads: 4 worker-threads: 32 max-http-post-siz.
  • 很多时候项目的日志只保存了一个文件,时间长了往往十几个G,看着就让人头大,查起来很慢很慢,所以要及时进行日志的切割,其实方式比较简单,现成的插件包,springboot里面配置几下就好了。 pom <parent> ...
  • undertow 随着Java EE 7的到来以及处理诸如Web ... 在长期致力于JBoss Web服务器(Apache Tomcat的一个分支)之后,新版本的应用程序服务器现在基于名为Undertow的新Web服务器。 Undertow是一种基于Java的灵活,...
  • Undertow Undertow是一个Java开发的灵活的高性能Web服务器,提供包括阻塞和基于NIO的非阻塞机制。Undertow是红帽公司的开源产品,是Wildfly默认的Web服务器。 SpringBoot2中可以将Web服务器切换到Undertow来提高应用...
  • 实验项目 SpringBoot 版本为 2.3.5.RELEASE如若担心其他版本是否适用本方案,请查看文章 兼容性 章节一、概述来到这里的朋友,你一定遇见了中文参数乱码的问题。你是否有以下症状:项目已设置了 server.servlet....
  • 上一节我们讲述了如何使用 Undertow 作为我们的 Web 服务容器,本小节我们来分析使用 Undertow 的另一个问题,也就是如何配置 accesslog,以及 accesslog 的各种占位符。 accesslog 相关配置 server: undertow: # ...
  • 然后在application.properties or application.yml中配置参数 转自 https://blog.csdn.net/rickiyeat/article/details/78906366   # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认...
  • 类似netty的池化内存管理server.undertow.buffer-size=1024# 是否分配的直接内存server.undertow.direct-buffers=true# 是否启用SSLserver.undertow.https.enabled=false复制代码 Spring Boot配置Jetty容器 GitHub...
  • 服务间调用时,使用post请求传递parameters,超出最大默认值1000 ...// undertow容器 以及 undertow配置方法 @Bean public UndertowEmbeddedServletContainerFactory undertowEmbeddedServletContainerFactory() {
  • 在我们的项目中,我们没有采用默认的 Tomcat 容器,而是使用了 UnderTow 作为我们的容器。其实性能上的差异并没有那么明显,但是使用 UnderTow 我们可以利用直接内存作为网络传输的 buffer,减少业务的 GC,优化业务...
  • undertow服务器分析 即将发布的JBoss Application Server版本将不再使用Tomcat作为集成的Web服务器,而是将其替换为undertowundertow的体系结构基于可通过Builder API动态添加到服务器的处理程序。 这种方法...
  • 解决方式 spring: servlet: multipart: max-request-size: 100MB 分析过程 前提 某天突然发现来了这样得一个需求, 将图片变为base64 ,有两个服务,一个是a服务,一个是b...Undertow 能接受得请求体得大小 feig
  • springboot中配置https并配置http转https 1.制作证书 第一步:进入jdk的bin目录下 第二步:keytool -genkey -alias undertowhttps -keyalg RSA -keysize 2048 -keystore E:/httpsKey.p12 -validity 365 一路下一步...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,353
精华内容 1,741
热门标签
关键字:

undertow参数配置