精华内容
下载资源
问答
  • Tomcat调优教程

    2021-01-07 17:31:25
    Tomcat调优参数 主要调优参数 在做Tomcat的调优时,最重要是就是Connector(连接器)的调优了(少数情况下,也可能会配置Executor) 下面贴出一段server.xml中的配置: <Executor name="tomcatThreadPool" name...

    TIPS
    本文基于Tomcat 9.0编写,理论兼容Tomcat 8.x及更高版本。

    Tomcat调优参数

    主要调优参数

    在做Tomcat的调优时,最重要是就是Connector(连接器)的调优了(少数情况下,也可能会配置Executor)

    下面贴出一段server.xml中的配置:

    <Executor name="tomcatThreadPool"
      namePrefix="catalina-exec-"
      maxThreads="150"
      minSpareThreads="4"/>
    
    <Connector port="8080"
      protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443"
      executor="tomcatThreadPool"/>
    

    一个文件中可以有多个Connector以及多个Executor,其中:

    • Connector:负责接收客户端的请求以及向客户端回送响应的消息
    • Executor:指定线程池,从而在多个Connector(主要)及其他组件之间共享

    TIPS
    对执行原理感兴趣的童鞋可以参阅下这篇文章,写得相当棒:https://blog.csdn.net/zzzgd_666/article/details/88740198 。由于本文重点在于“调优”,所以就不赘述了。

    Connector常用属性

    Connector负责接收客户端的请求以及向客户端回送响应的消息。Tomcat 9.0有三类Connector:

    • HTTP/1.1(HTTP Connector)
    • HTTP/2(HTTP2 Upgrade Protocol)(Tomcat 8.5引入)
    • AJP(AJP Connector)

    但不管哪种Connector,工作过程都是类似的:

    • 每个请求都需要1个线程去处理
    • 如果接收到的并发请求 > 当前处理请求的线程所能处理的数量,则创建其他线程去处理,直到达到maxThreads为止
    • 如果线程数达到maxThreads设置的值后,依然接收到更多的请求,那么请求将会堆积在Connector创建的server socket中(即accept队列),直到达到acceptCount的值为止。如果堆积的请求数目达到acceptCount后,依然受到更多的请求,那么直接返回connection refused

    常用属性如下:

    TIPS

    • 加粗的表示Tomcat调优常用的参数
    • 这里只列出了Connector常用属性,要想阅读完整属性,可使用如下方式:
      • 方式一、访问 http://tomcat.apache.org/tomcat-9.0-doc/config/http.html ,将9.0修改为你的Tomcat版本即可,比如想看Tomcat 8的文档,可将9.0改为8.0;
      • 方式二、下载Tomcat并启动,访问 /docs/config/http.html 路径即可。例如:http://localhost:8080/docs/config/http.html
    • minSpareThreads:始终保持运行状态的线程数,默认值10。即便超过了最大空闲时间(maxIdleTime),也不会被回收。如果配置了Executor,将忽略此属性

    • maxThreads:Connector创建来处理请求的最大线程数,此参数决定了可以同时处理的请求的最大数量,默认200。如果配置了Executor,将忽略此属性。超过则放入请求队列中进行排队。

    • maxConnections:Tomcat在任意时间接收和处理的最大连接数。当连接数达到maxConnections时,仍可基于acceptCount的配置接受连接,但并不会处理,直到Tomcat接收的连接数小于maxConnections。
      默认值与Connector使用的协议有关:

      • NIO的默认值是10000
      • APR的默认值是8192
      • BIO的默认值为maxThreads(如果配置了Executor,则默认值是Executor的maxThreads)
      • 在Windows下,APR/native的maxConnections值会自动调整为设置值以下最大的1024的整数倍;如设置为2000,则最大值实际是1024。如果设置为-1,则连接数不受限制。
    • connectionTimeout:网络连接超时时间,单位毫秒,默认60000。设为0表示永不超时,一般不建议。除非将disableUploadTimeout设置为false,否则读取request body时也会使用该超时。

    • acceptCount:当最大线程数(maxThreads)被使用完时,可以放入请求队列的队列长度,默认100。一旦队列满了,就会返回connection refused。因此,如果设置过大,后面进入的请求等待时间会很长;如果设置过小,后面进入的请求立马返回connection refused。一般可设置成和maxThreads相同,但具体还需根据自己的应用实际访问峰值和平均值来权衡。

    • enableLookups:是否启用DNS查找功能。如果设为true,会用request.getRemoteHost()执行DNS lookup,从而返回远程客户端的主机名。设为false则跳过DNS lookup,并以字符串形式返回IP地址,从而提高性能,默认false,生产环境建议保持关闭。

    • compression:是否开启GZIP压缩。取值off(禁用)、on(打开,压缩文本数据),force(强制压缩所有格式)、数字(表示数据量达到该值就GZIP传输)。

    • port:指定Tomcat监听的端口

    • protocol:为Connector设置使用什么协议处理入口流量,默认值 HTTP/1.1 ,使用此值的话,对于Tomcat 8及更高版本,会自动根据当前情况,使用基于NIOConnector或基于APR的Connector;对Tomcat 7及更低版本会自动根据情况使用基于BIO的Connector或基于APR的Connector。如果不想自动切换,也可人工指定协议(从Tomcat 8开始,一般无需人工设置):

    // BIO,这种模式下,使用传统的I/O操作(即java.io包及其子包),性能较差。
    protocol="org.apache.coyote.http11.Http11Protocol"
    
    // NIO,使用NIO操作(即java.nio包及其子包),比传统I/O拥有更好的并发性能
    protocol="org.apache.coyote.http11.Http11NioProtocol"
    
    // NIO2,使用NIO2操作(NIO2是JDK 7引入的特性),Tomcat 8引入
    protocol="org.apache.coyote.http11.Http11Nio2Protocol"
    
    // APR,使用APR操作。APR即Apache Portable Runtime,这是一个Apache HTTP服务器的支持库。你可以认为:此模式下,Tomcat将以JNI的形式调用 Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而提高Tomcat对静态文件的处理性能
    protocol="org.apache.coyote.http11.Http11AprProtocol"  
    

    下图展示了不同Connector之间的区别:
    在这里插入图片描述

    • connectionUploadTimeout:指定上传时的超时。disableUploadTimeout需设置成false才有效

    • disableUploadTimeout:设置为true,上传超时使用connectionTimeout,设置成false,上传超时使用connectionUploadTimeout。默认true

    • redirectPort:表示安全通信(https)转发端口

    • executor:指定executor名称。如果设置了此属性,则Connector将使用该Executor执行程序。如果不设置executor属性,则Connector将使用内部私有的Executor来提供线程池。该属性主要用来实现在多个Connector及其他组件之间共享线程池。

    TIPS
    压缩带来的好处是减少带宽,但缺点在于增加了服务器的CPU开销。就笔者个人的经验,很少直接用Tomcat的GZIP功能,更多使用NGINX的GZIP。

    maxConnectionsmaxThreadsacceptCount之间的关系

    我们把Tomcat想象成是一个餐厅,请求就像是去就餐的顾客。这个餐厅非常火爆,当处理不过来的时候,就会排号。

    • acceptCount
      可以类比为餐厅的排号处能够容纳排号的最大数量,排号的数量不是无限制的,一旦达到上限,就说已经客满(直接返回connection refused)

    • maxConnections
      可以类比为餐厅的大堂的餐桌数量,也就是可以就餐的桌数。

      • 如果当前连接数尚未达到maxConnection,说明还有空闲的餐桌,直接上桌即可。
      • 如果所有餐桌都已经坐满,但是排号人数尚未达到 acceptCount,那么就排个号,等着叫号(此时,尽管还能接受请求,但是不会处理你的请求,除非有桌子空闲了)
      • 如果取号的人数已经达到acceptCount,则取号失败,直接拒绝服务(直接返回connection refused)
    • maxThreads
      可以类比为厨师的个数。厨师一开始只有10个(最少minSpareThreads个),如果发现忙不过来的时候,就会增加几个厨师,一致增加到maxThreads个厨师。如果还是不够,那就只能慢慢等着上菜了。这就像是你去吃饭,有时候上一道菜都吃完了,下一道菜还没有上。只不过,在计算机的世界,厨师的数量也不能无止境地增加下去。因为线程数目只要超过CPU核心数,就会存在CPU切换的开销,线程数越多,切换开销越大,所以说maxThreads设置也不能太大。

    Executor常用属性

    定义线程池,从而在多个Connector(主要)及其他组件之间共享。Executor必须实现org.apache.catalina.Executor接口。

    常用属性如下:

    TIPS
    这里只列出了Connector常用属性,,要想阅读完整属性,可使用如下方式:

    • 方式一、访问 http://tomcat.apache.org/tomcat-9.0-doc/config/executor.html ,将9.0修改为你的Tomcat版本即可,比如想看Tomcat 8的文档,可将9.0改为8.0
    • 方式二、下载Tomcat并启动,访问 /docs/config/executor.html 路径即可。例如:http://localhost:8080/docs/config/executor.html
    • className:Executor的实现类。必须实现org.apache.catalina.Executor接口。默认值为org.apache.catalina.core.StandardThreadExecutor

    • name:Executor名称,必填且必须唯一

    • threadPriority:指定线程的优先级,默认5(Thread.NORM_PRIORITY)

    • daemon:是否为守护线程,默认true

    • namePrefix:指定Executor创建的线程的名称前缀。线程名称格式为namePrefix+threadNumber

    • maxThreads:活动线程的最大数量,默认200

    • minSpareThreads:使用保持活动状态的最小线程数(空闲和活动),默认25

    • maxIdleTime:线程最大空闲时间,单位毫秒,默认60000(1分钟)。达到该时间后就会把该线程关闭(当然如果当前活动线程数 < minSpareThreads不会关闭)

    • maxQueueSize:拒绝执行之前可以排队等待执行的任务数量,默认Integer.MAX_VALUE

    • prestartminSpareThreads:在启动Executor时是否就启动minSpareThreads个线程,默认false

    • threadRenewalDelay:如果配置了ThreadLocalLeakPreventionListener,它将会通知Executor有关上下文停止的信息。一旦上下文停止后,线程池中的线程将会被更新。为了避免同时更新线程,可用此属性设置更新的延迟。默认1000,单位毫秒,如果设成负数,则线程不会被更新。

    其他调优参数

    Host

    Host表示虚拟主机。

    server.xml

    <Host name="localhost" autoDeploy="true">
    </Host>            
    

    这里只列出了Host的调优属性,,要想阅读完整属性,可使用如下方式:

    • 方式一、访问 http://tomcat.apache.org/tomcat-9.0-doc/config/host.html ,将9.0修改为你的Tomcat版本即可,比如想看Tomcat 8的文档,可将9.0改为8.0
    • 方式二、下载Tomcat并启动,访问 /docs/config/host.html 路径即可。例如:http://localhost:8080/docs/config/host.html
    • autoDeploy:是否要让Tomcat周期性检查新的或更新了的Web应用程序。如果设为true,则Tomcat会定期检查appBase和xmlBase目录,并自动部署。默认true。由于autoDeploy=true时,会启用一个定时任务,如果没有“自动部署”的需求,可将其设为false。

    Spring Boot/Spring Cloud项目支持的调优参数

    server:
      # 等价于Connector.connectionTimeout
      connection-timeout: 60s
      tomcat:
        # 等价于Connector.acceptCount
        accept-count: 100
        # 等价于Connector.maxConnections
        max-connections: 10000
        # 等价于Connector.maxThreads
        max-threads: 200
        # 等价于Connector.minSpareThreads
        min-spare-threads: 10
      # TIPS:压缩带来的好处是减少带宽,但缺点在于增加了服务器的CPU开销。就笔者个人的经验,很少直接用Tomcat的GZIP功能,更多使用NGINX的GZIP。
      compression:
        # 是否开启GZIP,默认关闭
        enabled: false
        # 执行压缩所需的最小响应大小,默认2KB
        min-response-size: 2KB
        # 想要GZIP的格式,默认"text/html", "text/xml", "text/plain",
    			"text/css", "text/javascript", "application/javascript", "application/json",
    			"application/xml"
        mime-types: "text/html", "text/xml"
    

    其他调优

    Tomcat Session调优

    一、JSP与Session

    如果使用JSP的话,如果业务允许,考虑考虑加上以下内容:

    <%@ page session="false" %>
    

    高并发场景下,可能会导致内存溢出。

    二、为Session设置合理的超时

    超时时间不宜过长,否则也可能会造成内存上的压力。

    • 对于传统Tomcat项目,只需在应用的 web.xml 中添加如下内容:
    <!-- 配置Session失效时间,单位分钟 -->  
    <session-config>  
            <session-timeout>30</session-timeout>  
    </session-config> 
    
    • 对于Spring Boot项目,通过如下配置设置Session即可。
    server:
      servlet:
        session:
          timeout: 30m
    
    展开全文
  • TOMCAT调优

    2021-06-17 13:31:57
    tomcat是我们在web开发中应用较为广泛的web应用服务器,其即可以实现html等静态文件的访问(web服务器),又实现了servlet能处理动态web请求(web容器),但是

            tomcat是我们在web开发中应用较为广泛的web应用服务器,之所以使用其作为web应用服务器是因为其即可以实现html等静态文件的访问(web服务器),又实现了servlet能处理动态web请求(web容器),这里与nginx有一个地方不同,nginx可以转发请求,也可以实现静态文件访问,但是其并不可以作为servlet容器,通常情况下,我们的我们服务在一定的硬件资源的前提下需要提高应用可支持的并发量就需要做一些优化,下面就简单的谈谈tomcat在现实生产中的相关调优,这种文章在网上很多,个人也是根据平时涉及的和了解的做个总结。

           并发优化:

            1.硬件资源

                如果条件允许可以适当增加服务器的硬件资源,毕竟相对于参数配置,增加硬件资源更简单

             2.参数优化

                 修改JVM相关配置linux修改/bin/catalina.sh,win下修改bin/catalina.bat

                 (linux)JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"

                 (win)set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m

        参数介绍

        -server 启用jdk的server版本

        -Xms java虚拟机初始化堆的最小内存

        -Xmx java虚拟机可使用堆的最大内存(一般和Xms一样大,这样这样因为最大和最小一样大,GC不会扩展内存空间,从而减小一本开支)

        -XX:PermSize java虚拟机永久代大小

        -XX:MaxPermSize java虚拟机永久代最大值

        可以使用jps 查看java本地进程等和jmap查看JVM物理内存占用情况等,或者visualVm来查看划分的内存区域大小

            3.连接(并发)优化

               Connector优化:Connector是连接器,负责接收客户的请求,以及向客户端回送响应消息,默认情况下tomcat支持200线程访问,如果超出200则其他线程将是等待状态甚至是超时。

                找到conf下的server.xml,找到<Connector />,贴出配置

                <Connector port="8080"  protocol="HTTP/1.1" maxThreads="1000" minSpareThreads="100"    acceptCount="1000" maxConnections="1000" connectionTimeout="20000"       maxHttpHeaderSize="8192"  tcpNoDelay="true" compression="on"    compressionMinSize="2048" disableUploadTimeout="true" redirectPort="8443"     enableLookups="false" URIEncoding="UTF-8" />

                参数解释:

                 maxThreads:连接器创建处理请求线程的最大数目,处理同事请求的最大数目,默认值为200。

                 minSpareThreads:线程的最小运行数目,这些始终保持运行。如果未指定,默认值为10。

                 acceptCount:最大队列长度。一般与maxThreads相同,默认为100。

                 maxConnections:在任何给定的时间内,服务器将接受和处理的最大连接数。当这个数字已经达到时,服务器将接受但不处理,等待进一步连接。NIO与NIO2的默认值为10000,APR默认值为8192。

                 connectionTimeout:当请求已经被接受,但未被处理,也就是等待中的超时时间。单位为毫秒,版本不同默认值可能存在不同,一般为20000,这个值可能影响你的正常请求的处理,比如一个请求处理时间超过20S就会出问题。

                 maxHttpHeaderSize:请求和响应的HTTP头的最大大小,以字节为单位指定。如果没有指定,这个属性被设置为8192(8 KB),过大会导致请求流量增大。

                 tcpNoDelay:如果为true,服务器socket会设置TCP_NO_DELAY选项,在大多数情况下可以提高性能。缺省情况下设为true,也就是你不设置它也是true。

                  compression:是否启用gzip压缩,默认为关闭状态。这个参数的可接受值为“off”(不使用压缩),“on”(压缩文本数据),“force”(在所有的情况下强制压缩),压缩有助于减小网络资源占用。

                  compressionMinSize:如果compression="on",则启用此项。被压缩前数据的最小值,也就是超过这个值后才被压缩。如果没有指定,这个属性默认为“2048”(2K),单位为byte。

                  disableUploadTimeout:这个标志允许servlet Container在一个servlet执行的时候,使用一个不同的,更长的连接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上传的时候更长的超时时间。如果没有指定,设为false。

                  enableLookups:关闭DNS反向查询,这个个人理解意思是服务器会记录访客的ip的信息,会通过域名等或者直接拿到IP,其会占用一定的带宽资源,但是,我没有理解这里的记录是服务器的记录,还是我们的应用中记录(比如useragent的信息),有谁知道的可以告知下,有空自己测试下。

           4. IO优化

                Tomcat 连接器的三种方式: bio、nio 和 apr,三种方式性能差别很大,apr 的性能最优, bio 的性能最差。而 Tomcat 7 使用的 Connector  默认就启用的 Apr 协议,但需要系统安装 Apr 库,否则就会使用 bio 方式。

                1:同步阻塞IO(JAVA BIO) 同步并阻塞,服务器实现模式为一个连接一个线程(one connection one thread 想想都觉得恐怖,线程可是非常宝贵的资源),当然可以通过线程池机制改善.
                2:JAVA NIO:又分为同步非阻塞IO,异步阻塞IO 与BIO最大的区别one request one thread.可以复用同一个线程处理多个connection(多路复用).
                3:异步非阻塞IO(Java NIO2又叫AIO) 主要与NIO的区别主要是操作系统的底层区别.可以做个比喻:比作快递,NIO就是网购后要自己到官网查下快递是否已经到了(可能是多次),然后自己去取快递;AIO就是快递员送货上门了(不用关注快递进度)。
                BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解.
                NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持.
                AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持.

                设置方法:protocol

            5.开启线程池

              

               相关参数说明:

                 name:线程池名称,用于 Connector中指定。
                 namePrefix:所创建的每个线程的名称前缀,一个单独的线程名称为                                        namePrefix+threadNumber。
                 maxThreads:池中最大线程数。
                 minSpareThreads:活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
                 maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。
                 maxQueueSize:在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改,否则会有请求不会被处理的情况发生。
                 prestartminSpareThreads:启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动。
                 threadPriority:线程池中线程优先级,默认值为5,值从1到10。
                 className:线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。如果想使用自定义线程池首先需要实现 org.apache.catalina.Executor接口。

            6.APR和tomcat native

               APR可以极大的提高tomcat的性能,主要的使用提高io

               一般默认是开启apr的listener的,但是我们的connect中还是需要修改protocol,有一点特别重要,上面提到过,开启apr需要安装其依赖包

    protocol="org.apache.coyote.http11.Http11AprProtocol" 

    PS:现在大多数开发都是使用微服务,而springboot内置了tomcat,但并不代表其不可以优化,大致思想和外部的tomcat是一致的,只是方式不同而已推荐可以看这篇文章https://www.jianshu.com/p/4ee2628b1cb5

    展开全文
  • tomcat调优1

    2020-12-19 10:19:44
    高并发环境下,我知道优化配置tomcat,对连接数和线程池作...它的作用可是tomcat的核心,在tomcat的配置文件server.xml中写到过:Connector的主要功能是接收连接请求,创建request和response对象用于和请求端交换数据

    高并发环境下,我知道优化配置tomcat,对连接数和线程池作修改,最重要的是connector的协议Http Connector使用NIO,而不是默认的AJP Connector,当时也没有仔细研究其原理。现在来为以上这些设置做一下剖析。

    要了解这些,不能避开tomcat最重要的一个功能,就是connector连接器。

    它的作用可是tomcat的核心,在tomcat的配置文件server.xml中写到过:Connector的主要功能是接收连接请求,创建request和response对象用于和请求端交换数据;然后分配线程给engine(servlet容器)来处理请求,并把request和response对象传递给engine引擎,当engine处理完请求后,也会通过Connector将响应返回给客户端。

    现在终于知道其原理了,而且也知道了request和response二大对象是由谁创建的。

    可以说servlet容器处理请求,是需要Connector连接器进行调度和控制的,Connector连接器是tomcat处理请求的主干,因此对Connector的配置和使用,对tomcat的性能有着决定性的作用,我们就聊一聊Connector连接器的配置选项,连接协议,连接数,线程池 。

    先谈谈连接协议,tomcat的连接协议主要有二种:HTTP Connector 和 AJP Connector(默认),我们主要讨论HTTP Connector

    一、BIO、NIO、APR

    1、Connector的protocol

    Connector在处理HTTP请求时,会使用不同的protocol。不同的Tomcat版本支持的protocol不同,其中最典型的protocol包括BIO、NIO和APR(Tomcat7中支持这3种,Tomcat8增加了对NIO2的支持,而到了Tomcat8.5和Tomcat9.0,则去掉了对BIO的支持)。

    BIO是Blocking IO,顾名思义是阻塞的IO;NIO是Non-blocking IO,则是非阻塞的IO。而APR是Apache Portable Runtime,是Apache可移植运行库,利用本地库可以实现高可扩展性、高性能;Apr是在Tomcat上运行高并发应用的首选模式,但是需要安装apr、apr-utils、tomcat-native等包。(之前没有用过APR,看来高并发下要使用此协议啊)

    2、如何指定protocol

    Connector使用哪种protocol,可以通过元素中的protocol属性进行指定,也可以使用默认值。

    指定的protocol取值及对应的协议如下:

    HTTP/1.1:默认值,使用的协议与Tomcat版本有关

    org.apache.coyote.http11.Http11Protocol:BIO

    org.apache.coyote.http11.Http11NioProtocol:NIO

    org.apache.coyote.http11.Http11Nio2Protocol:NIO2

    org.apache.coyote.http11.Http11AprProtocol:APR

    如果没有指定protocol,则使用默认值HTTP/1.1,其含义如下:在Tomcat7中,自动选取使用BIO或APR(如果找到APR需要的本地库,则使用APR,否则使用BIO);在Tomcat8中,自动选取使用NIO或APR(如果找到APR需要的本地库,则使用APR,否则使用NIO)。

    3、BIO/NIO有何不同

    无论是BIO,还是NIO,Connector处理请求的大致流程是一样的:

    在accept队列中接收连接(当客户端向服务器发送请求时,如果客户端与OS完成三次握手建立了连接,则OS将该连接放入accept队列);在连接中获取请求的数据,生成request;调用servlet容器处理请求;返回response。为了便于后面的说明,首先明确一下连接与请求的关系:连接是TCP层面的(传输层),对应socket;请求是HTTP层面的(应用层),必须依赖于TCP的连接实现;一个TCP连接中可能传输多个HTTP请求。

    在BIO实现的Connector中,处理请求的主要实体是JIoEndpoint对象。JIoEndpoint维护了Acceptor和Worker:Acceptor接收socket,然后从Worker线程池中找出空闲的线程处理socket,如果worker线程池没有空闲线程,则Acceptor将阻塞。其中Worker是Tomcat自带的线程池,如果通过配置了其他线程池,原理与Worker类似。

    在NIO实现的Connector中,处理请求的主要实体是NIoEndpoint对象。NIoEndpoint中除了包含Acceptor和Worker外,还是用了Poller,处理流程如下图所示(图片来源:http://gearever.iteye.com/blog/1844203)。

    Acceptor接收socket后,不是直接使用Worker中的线程处理请求,而是先将请求发送给了Poller,而Poller是实现NIO的关键。Acceptor向Poller发送请求通过队列实现,使用了典型的生产者-消费者模式。在Poller中,维护了一个Selector对象;当Poller从队列中取出socket后,注册到该Selector中;然后通过遍历Selector,找出其中可读的socket,并使用Worker中的线程处理相应请求。与BIO类似,Worker也可以被自定义的线程池代替。

    通过上述过程可以看出,在NIoEndpoint处理请求的过程中,无论是Acceptor接收socket,还是线程处理请求,使用的仍然是阻塞方式;但在“读取socket并交给Worker中的线程”的这个过程中,使用非阻塞的NIO实现,这是NIO模式与BIO模式的最主要区别(其他区别对性能影响较小,暂时略去不提)。而这个区别,在并发量较大的情形下可以带来Tomcat效率的显著提升:

    目前大多数HTTP请求使用的是长连接(HTTP/1.1默认keep-alive为true),而长连接意味着,一个TCP的socket在当前请求结束后,如果没有新的请求到来,socket不会立马释放,而是等timeout后再释放。如果使用BIO,“读取socket并交给Worker中的线程”这个过程是阻塞的,也就意味着在socket等待下一个请求或等待释放的过程中,处理这个socket的工作线程会一直被占用,无法释放;因此Tomcat可以同时处理的socket数目不能超过最大线程数,性能受到了极大限制。而使用NIO,“读取socket并交给Worker中的线程”这个过程是非阻塞的,当socket在等待下一个请求或等待释放时,并不会占用工作线程,因此Tomcat可以同时处理的socket数目远大于最大线程数,并发性能大大提高。

    二、3个参数:acceptCount、maxConnections、maxThreads

    再回顾一下Tomcat处理请求的过程:在accept队列中接收连接(当客户端向服务器发送请求时,如果客户端与OS完成三次握手建立了连接,则OS将该连接放入accept队列);在连接中获取请求的数据,生成request;调用servlet容器处理请求;返回response。

    相对应的,Connector中的几个参数功能如下:

    1、acceptCount

    accept队列的长度;当accept队列中连接的个数达到acceptCount时,队列满,进来的请求一律被拒绝。默认值是100。

    2、maxConnections

    Tomcat在任意时刻接收和处理的最大连接数。当Tomcat接收的连接数达到maxConnections时,Acceptor线程不会读取accept队列中的连接;这时accept队列中的线程会一直阻塞着,直到Tomcat接收的连接数小于maxConnections。如果设置为-1,则连接数不受限制。

    默认值与连接器使用的协议有关:NIO的默认值是10000,APR/native的默认值是8192,而BIO的默认值为maxThreads(如果配置了Executor,则默认值是Executor的maxThreads)。

    在windows下,APR/native的maxConnections值会自动调整为设置值以下最大的1024的整数倍;如设置为2000,则最大值实际是1024。

    3、maxThreads

    请求处理线程的最大数量。默认值是200(Tomcat7和8都是的)。如果该Connector绑定了Executor,这个值会被忽略,因为该Connector将使用绑定的Executor,而不是内置的线程池来执行任务。

    maxThreads规定的是最大的线程数目,并不是实际running的CPU数量;实际上,maxThreads的大小比CPU核心数量要大得多。这是因为,处理请求的线程真正用于计算的时间可能很少,大多数时间可能在阻塞,如等待数据库返回数据、等待硬盘读写数据等。因此,在某一时刻,只有少数的线程真正的在使用物理CPU,大多数线程都在等待;因此线程数远大于物理核心数才是合理的。

    换句话说,Tomcat通过使用比CPU核心数量多得多的线程数,可以使CPU忙碌起来,大大提高CPU的利用率。

    4、参数设置

    (1)maxThreads的设置既与应用的特点有关,也与服务器的CPU核心数量有关。通过前面介绍可以知道,maxThreads数量应该远大于CPU核心数量;而且CPU核心数越大,maxThreads应该越大;应用中CPU越不密集(IO越密集),maxThreads应该越大,以便能够充分利用CPU。当然,maxThreads的值并不是越大越好,如果maxThreads过大,那么CPU会花费大量的时间用于线程的切换,整体效率会降低。

    (2)maxConnections的设置与Tomcat的运行模式有关。如果tomcat使用的是BIO,那么maxConnections的值应该与maxThreads一致;如果tomcat使用的是NIO,那么类似于Tomcat的默认值,maxConnections值应该远大于maxThreads。

    (3)通过前面的介绍可以知道,虽然tomcat同时可以处理的连接数目是maxConnections,但服务器中可以同时接收的连接数为maxConnections+acceptCount 。acceptCount的设置,与应用在连接过高情况下希望做出什么反应有关系。如果设置过大,后面进入的请求等待时间会很长;如果设置过小,后面进入的请求立马返回connection refused。

    三、线程池Executor

    Executor元素代表Tomcat中的线程池,可以由其他组件共享使用;要使用该线程池,组件需要通过executor属性指定该线程池。

    Executor是Service元素的内嵌元素。一般来说,使用线程池的是Connector组件;为了使Connector能使用线程池,Executor元素应该放在Connector前面。Executor与Connector的配置举例如下:

    Executor的主要属性包括:

    name:该线程池的标记

    maxThreads:线程池中最大活跃线程数,默认值200(Tomcat7和8都是)

    minSpareThreads:线程池中保持的最小线程数,最小值是25

    maxIdleTime:线程空闲的最大时间,当空闲超过该值时关闭线程(除非线程数小于minSpareThreads),单位是ms,默认值60000(1分钟)

    daemon:是否后台线程,默认值true

    threadPriority:线程优先级,默认值5

    namePrefix:线程名字的前缀,线程池中线程名字为:namePrefix+线程编号

    四、查看当前状态

    上面介绍了Tomcat连接数、线程数的概念以及如何设置,下面说明如何查看服务器中的连接数和线程数。

    查看服务器的状态,大致分为两种方案:(1)使用现成的工具,(2)直接使用Linux的命令查看。

    现成的工具,如JDK自带的jconsole工具可以方便的查看线程信息(此外还可以查看CPU、内存、类、JVM基本信息等),Tomcat自带的manager,收费工具New Relic等。下图是jconsole查看线程信息的界面:

    下面说一下如何通过Linux命令行,查看服务器中的连接数和线程数。

    1、连接数

    假设Tomcat接收http请求的端口是8083,则可以使用如下语句查看连接情况:

    netstat –nat | grep 8083

    结果如下所示:

    可以看出,有一个连接处于listen状态,监听请求;除此之外,还有4个已经建立的连接(ESTABLISHED)和2个等待关闭的连接(CLOSE_WAIT)。

    2、线程

    ps命令可以查看进程状态,如执行如下命令:

    ps –e | grep java

    结果如下图:

    可以看到,只打印了一个进程的信息;27989是线程id,java是指执行的java命令。这是因为启动一个tomcat,内部所有的工作都在这一个进程里完成,包括主线程、垃圾回收线程、Acceptor线程、请求处理线程等等。

    通过如下命令,可以看到该进程内有多少个线程;其中,nlwp含义是number of light-weight process。

    ps –o nlwp 27989

    可以看到,该进程内部有73个线程;但是73并没有排除处于idle状态的线程。要想获得真正在running的线程数量,可以通过以下语句完成:

    ps -eLo pid ,stat | grep 27989 | grep running | wc -l

    其中ps -eLo pid ,stat可以找出所有线程,并打印其所在的进程号和线程当前的状态;两个grep命令分别筛选进程号和线程状态;wc统计个数。其中,ps -eLo pid ,stat | grep 27989输出的结果如下:

    图中只截图了部分结果;Sl表示大多数线程都处于空闲状态。

    展开全文
  • tomcat调优有两种方式: 一种针对自身进行调优,一种是针对JVM进行调优。 参考博客:tomcat调优博客

    tomcat调优有两种方式:

            一种针对自身进行调优,一种是针对JVM进行调优。

    参考博客:tomcat调优博客

    展开全文
  • Tomcat 调优教程

    2021-01-28 22:42:41
    点击上方 IT牧场,选择置顶或者星标技术干货每日送达!TIPS本文基于Tomcat 9.0编写,理论兼容Tomcat 8.x及更高版本。本文来探讨Tomcat的调优。Tomcat调优...
  • Tomcat性能调优

    2021-03-03 12:45:30
    一、整体知识体系 二、调优实战 1、禁用ajp
  • [深度讲解]JVM调优\Tomcat调优

    多人点赞 热门讨论 2021-08-23 09:00:24
    性能调优 1、代码优化 所谓代码优化是指对程序代码进行等价(指不改变程序的运行结果)变换。等价的含义是使得变换后的代码运行结果与变换前代码运行结果相同。优化的含义是最终生成的目标代码(运行时间更短、占用...
  • 我们在使用springboot(版本:2.0.3.RELEASE)开发web项目时,大多数时候采用的是内置的Tomcat(当然也可以配置支持内置的jetty),内置Tomcat有什么好处呢? 1、方便微服务部署,减少繁杂的配置 2、方便项目启动,...
  • Java Web之Tomcat调优

    2021-02-12 21:26:21
    Tomcat调优是一个老话题,目的都是为了提高站点的吞吐和并发。这里面涉及到Tomcat本身参数的优化和JVM优化。近期在研究JVM的参数设置和Tomcat集群,所以进行了一下调优实践。需要说明的是:本文的配置肯定不是最好的...
  • tomcat 启动占用内存太多
  • Tomcat调优指南

    2020-12-19 05:00:31
    1概述本文档主要介绍了Tomcat的性能调优的原理和方法。可作为公司技术人员为客户Tomcat系统调优的技术指南,也可以提供给客户的技术人员作为他们性能调优的指导手册。2调优分类由于Tomcat的运行依赖于JVM,从虚拟机...
  • Tomcat本身这块的调优 Tomcat 7/8 的优化参数有点不一样,最好按下面的方式看一下官网这个文档是否还保留着这个参数 启动tomcat,访问该地址,下面要讲解的一些配置信息,在该文档下都有说明的: 文档:...
  • tomcat调优讲解

    2021-03-14 17:18:01
    Java性能优化原则:代码运算性能、内存回收、应用配置(影响Java程序主要原因是垃圾回收)代码层优化:避免过多循环嵌套、调用和复杂逻辑调优内容:1、增加最大连接数2、调整工作模式3、启用gzip压缩4、调整JVM内存...
  • tomcat调优(转)

    2021-03-14 15:49:12
    静态资源如果让tomcat处理的话tomcat的性能会被损耗很多,所以我们一般都是采用:nginx+tomcat实现动静分离,让 Tomcat 只负责 jsp 文件的解析工作,nginx实现静态资源的访问。 (springboot好像没法这样操作) 2....
  • tomcat调优

    2021-05-16 13:50:21
    tomcat调优 查看源码默认配置 Ctrl+N按名字搜索类 修改之后的配置 server: tomcat: # 等待队列 accept-count: 1000 # 最大连接数 max-connections: 20000 # 最大线程数,经验值默认1核200,如果是4核则800 # ...
  • 我们在使用springboot(版本:2.0.3.RELEASE)开发web项目时,大多数时候采用的是内置的Tomcat(当然也可以配置支持内置的jetty),内置Tomcat有什么好处呢? 1、方便微服务部署,减少繁杂的配置 2、方便项目启动,...
  • ###Tomcat配置调优测试 Jmeter压力测试工具 调优总结 初始堆值和最大堆内存内存越大,吞吐量就越高。 最好使用并行收集器,因为并行手机器速度比串行吞吐量高,速度快。 设置堆内存新生代的比例和老年代的比例最好为...
  • Linux下的Tomcat调优

    2021-05-09 06:15:17
    Liunx下Tomcat调优指南1 概述由于Tomcat的运行依赖于JVM,从虚拟机的角度我们把Tomcat的调整分为外部环境调优和自身调优两类来描述。2 调优方案1.1 外部环境调优1) 操作系统性能优化对于操作系统优化来说,是尽可能...
  • Tomcat 并发调优

    2020-12-21 01:33:10
    说白了,就是如何 在Tomcat中使用JNI的方式来读取文件以及进行网络传输。这个东西可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式 传输的话,也可以提升SSL的处理性能。 a. 安装 apr $ sudo ./...
  • Tomcat调优

    2021-05-13 19:37:05
    Tomcat之JVM内存查看 tomcat7的user配置 修改tomcat 的config文件夹下的tomcat-users.xml 文件 <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <!-- 访问Server Status和Manager App的角色 ...
  • MyEclipse,性能优化,MySQL调优,JVM调优,Tomcat调优MyEclipsemyeclipse.ini文件解决MyEclipse内存溢出(out of memory)问题优化MyEclipse速度(主要方法)性能优化MySQL调优JVM调优JVM内存区域方法区(线程共享)...
  • tomcat调优的几个方面

    2021-12-08 21:54:15
    数据库性能调优 Tomcat本地库 其它选项 第1步 – 提高JVM栈内存Increase JVM heap memory 你使用过tomcat的话,简单的说就是“内存溢出”. 通常情况下,这种问题出现在实际的生产环境中.产生这种问题的...
  • 今天在新环境里部署tomcat, 刚开始启动很快,关闭之后再启动,却发现启动日志打印到00:25:14.144 [localhost-startStop-1] INFO o.s.web.context.ContextLoader - Root WebApplicationContext: initialization ...
  • Tomcat安全以及Tomcat调优配置安全应用安全传输安全HTTPS介绍Tomcat支持HTTPS 配置安全 删除webapps目录下的所有文件,禁用tomcat管理界面; 注释或删除**tomcat-users.xml**文件内的所有用户权限; 更改关闭...
  • tomcat的缺省配置是不...tomcat的优化主要有三方面,分为系统优化,tomcat自身优化,java虚拟机(jvm)调优,此处主要讨论后两种。一、tomcat本身优化1 工作方式选择为了提升性能,首先就要对代码进行动静分离,让 To...
  • Tomcat 调优那些事

    2021-04-24 11:48:16
    Tomcat作为很多中小企业的Web应用服务器,因其轻量级,开源,易用,应用广泛等特性,我们实际工作中经常接触到,但有时基于此的我们的web网站可能会出现各种各样的性能问题,那我们如何对Tomcat性能调优呢?...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,800
精华内容 13,920
关键字:

tomcat调优方式