精华内容
下载资源
问答
  • tomcat性能调优
    2022-02-04 20:54:52

    性能测试详解(三)Tomcat性能调优

    ​ tomcat是一款servlet容器。tomcat暂时选择绿色版的。

    ​ 服务器搭建tomcat之后,会把app的jar包放到webapps里面,重启tomcat,编译jar包就可以访问项目了。tomcat是应用服务器。

    ​ 启动时tomcat会检查它的环境。查看启动文件源码发现它启动的是catalina,这个文件是核心文件,conf是配置文件夹,在做性能调优的时候主要调优server.html文件。其中有性能的参数设定。

    1. 文件目录

    conf文件夹下。

    1. logging.properties

      tomcat在启动时有乱码的情况需要在logging.properties中修改日志输出的编码方式。

      把encoding的格式utf-8都换成gbk就ok了。

    logs文件夹下。

    1. catalina.log

      记录了启动信息的日志。

    2. localhost_access_log.时间.txt

      用户请求tomcat的访问日志。请求方式,http/https+状态码。

    3. localhost.time.txt

      web应用的内部程序日志。

    webapp文件下

    ​ tomcat下存放web系统的目录,它下面每个文件夹都是一个工程项目,自己的项目可以以文件夹的形式上传,也可以使用war包,jar包等。

    1. 如果使用war包,运行时会解析编译,会生成war包对应的文件夹。部署时一般一个tomcat管理一个项目,比较好操作。
    2. 在工作中会经常在webapps中部署新的版本

    work路径

    1. 运行过程中生成的文件,work路径会自动生成。

    2.server.xml

    2.0 文件内容 (后面分标签详解)

    \apache-tomcat-9.0.29-windows-x64\apache-tomcat-9.0.29\conf

    <?xml version="1.0" encoding="UTF-8"?>
    
    <Server port="8005" shutdown="SHUTDOWN">
      <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    
      <!--APR library loader. Documentation at /docs/apr.html -->
      <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
      <!-- Prevent memory leaks due to use of particular java/javax APIs-->
      <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
      <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
      <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    
      <!-- Global JNDI resources
           Documentation at /docs/jndi-resources-howto.html
      -->
      <GlobalNamingResources>
        <!-- Editable user database that can also be used by
             UserDatabaseRealm to authenticate users
        -->
        <Resource name="UserDatabase" auth="Container"
                  type="org.apache.catalina.UserDatabase"
                  description="User database that can be updated and saved"
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                  pathname="conf/tomcat-users.xml" />
      </GlobalNamingResources
      <Service name="Catalina">
    
    
        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    
    
        <!-- Define an AJP 1.3 Connector on port 8009 -->
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    
    
    
        <Engine name="Catalina" defaultHost="localhost">
    
    
          <Realm className="org.apache.catalina.realm.LockOutRealm">
    
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                   resourceName="UserDatabase"/>
          </Realm>
    
          <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
    
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log" suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    
          </Host>
        </Engine>
      </Service>
    </Server>
    
    

    文件源代码纯英文阅读比较困难的话,去看tomcat主页的configration页面内容,它的属性的意思可以找到。Chrom浏览器可以翻译成中文。

    http://localhost:8080/docs/config/server.html

    tomcat顺序性加载lib里面的jar,为了启动更快,开发会把tomcat做成嵌入式启动,用代码直接启动,如果是微服务的集群,需要启动的tomcat数量很大,所以做成了嵌入式。

    2.1 server.xml优化Connectors

    <Connector excutor="tomcatThreadPool"
               port="8080"
               protocol="org.apache.http11.Http11NioProtocol"
               connectionTimeout="20000"
               redirectPort="8443"
               acceptCount="100"
               compression="on"
               compressionMinSize="50"
               />
    
    1. 嵌入式部署

      此组件的特定实例监听服务器上特定tcp端口号上的链接,可以定义端口号,比如把8080改成8081。在一个服务器上配置多个tomcat,每个不同的tomcat配置不同的端口号才可以正常访问。不过这与性能没有关系。

    2. Protocal:bio\nio\nio2\apr

      与性能有关系的是 Connector标签的protacol,tomact基于怎么的网络协议去接收

      四种传输形态

      1. bio是同步阻塞型的交互方式。把请求排队,同一时间只能处理一个请求,当要用数据库的读写操作可能需要2秒,那后面的请求就堵塞了,响应时间被无限延长
      2. nio是同步非阻塞的传输,类似云文件的多人编辑,文件运行中不操作文件,生成一个管道,生成一个buffer缓存区,缓存区操作完后再修改实际文件。一般默认为nio。伪异步的实现。
      3. Nio2是异步非阻塞。同步是线性的,从请求到响应都是同步。异步的话,等待环节取消了,有一个缓冲区,发起请求后完成特定的操作后持续接收大量请求。吞吐量大。
      4. Apr系统级别的异步,apr是高并发大吞吐量数据形态的首选方式。应用访问度不频繁的话直接用nio就可以了,linux环境推荐用nio,nio2不太好用。系统访问量很大用apr,但是linux系统下使用apr要安装相关apr的包(关联的库),windows不用安装。
    3. compression=“on”,把请求和数据进行压缩,把空间缩小。compressionMinSize,如果为“on”,则此属性可用于指定压缩输出之前的最小数据量。

    4. acceptCount=“100”,当我的线程池满了以后,后续进来的请求如何处理,acceptCount为最大的等待数。超出的就拒绝掉,因为处理不过来了。暂时可抽象理解为排队的最大人数。

    2.2 server.xml优化线程池 Executer 线程与请求的配置。

    ​ 要考虑到服务端硬件资源的环境。资源也要避免浪费。

        <Executor name="tomcatThreadPool" 
                  namePrefix="catalina-exec-" ## 每个线程在启动时会有一个名字,取“catalina-exec-”前缀
    			 maxThreads="150"  ## 线程池的最大数量
                  minSpareThreads="4" ## Executor执行时,创建的线程数
                  maxIdleTime="60000" ## 60秒 一个线程的最大存活时间,以毫秒为单位
                  
                  prestartminSpareThreads="true"
                  
                  maxQueueSize="100" ## 最大线程等待数。 与线程挂钩。
                  />
    
    1. namePrefix 每个线程在启动时会有一个名字,取“catalina-exec-”前缀
      1. catalina-exec-1
      2. catalina-exec-2
      3. catalina-exec-3
    2. maxThreads 是线程池的最大数量。支撑最大线程的运行数。根据实际业务走。
    3. minSpareThreads Executor执行时,创建的线程数,线程是一个一个创建的,默认启动线程池的时候,先创建一批默认的线程数,来处理请求。
    4. maxIdleTime 一个线程的最大存活时间,以毫秒为单位,有些线程因为没有请求,没有任务的下发,线程进入了空闲状态,一直运行会消耗很多资源,所以就释放掉。
    5. prestartminSpareThreads 是否启动minSpareThreads,决定它是否生效,没有的话默认为false。
    6. maxQueueSize=“100” 最大线程等待数。

    tomcat的内存与jvm的内存机制是关联的。无限放大线程池的大小时,服务端内存也会放大。

    tomcat在运行时默认做了自动重载的

    2.3 自动重载 (关闭自动重载)

    ​ java代码更新后tomcat会自动重载。自动加载的过程可能会产生隐患,容易造成内存溢出,因为需要重载class文件更新,自动去读取。所以需要关闭自动重载

          <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
     <!-- 修改为 false-->         
    	  <Host name="localhost"  appBase="webapps"
                unpackWARs="flase" autoDeploy="flase">          
    
    1. autoDeploy 是自动部署。

    tomcat会关联jvm

    在 **bin\catalina.bat(windows系统)**中进行配置 ,JAVA_OPTS,去配置JVM的使用内存、初始化内存和最大内存等。可以准确定位到JVM的准确的内存值。(具体内容关注之后的JVM部分)tomcat与jvm需要协调。

    ​ CPU占用比越高,线程运行越多,系统表现越慢。测试的是什么业务,结合具体业务。合理调节系统的资源。结合实际业务场景,硬件资源来制定调优方案。不同场景下调优方向不同。比如nio,apr,可以根据试错来积累经验。5-7年的经验可能对于性能测试工程师是十分关键的。

    ​ 对于开发人员,tomcat的调优,懂tomcat源码,底层逻辑,交互实现等一系列内容,从代码底层了解tomcat的运行机制。

    ​ 对测试工程师来说,了解tomcat的配置,实现资源的最大化利用,最有效的执行,配置如何去调整。

    ​ 不同的角度对性能的概念是不一样的。

    3. 问题

    1. 在不同肉机上压测同一个服务,吞吐量相差特别大,可能的原因有哪些?

    1. 网络问题
    2. 测试脚本
    3. 服务端是否出现了问题
    更多相关内容
  • Tomcat性能调优

    2021-03-03 12:45:30
    一、整体知识体系 二、调优实战 1、禁用ajp

    一、整体知识体系

    二、调优实战

    1、禁用ajp

    对于tomcat10已经默认禁用了,但是对于10以下的版本需要手工禁用,ajp的漏洞大家可以自行去“国家信息安全共享平台"查看

    2、启用线程池

    (1)每个线程池都是一个线程,所以打开线程池可以提高性能

      (2)  修改配置文件: conf/server.xml 中的<Executor> 注释打开

    打开线程池

     

     

    连接器指定线程池

     

    三、Tomcat运行模式

    BIO:tomcat7之前默认的阻塞模式,性能低下(accept和read方法会阻塞),没有经过任何优化处理和支持,8.5版本以后已经抛弃该模式

    NIO:同步非阻塞模式(解决了accept和read的阻塞问题,NIO模式下调用read方法一定会读到数据),tomcat内部实现了reactor线程模型,性能较高

    NIO2:纯异步模式,tomcat内部实现了preactor线程模型

    APR:安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度提高了性能

     

    四、性能测试

    本例是使用jmeter对应用服务器登录接口进行测试

    未禁用AJP协议,未用线程池之前,并发场景下异常率较高,吞吐量很低,相应较长

    禁用AJP之后,吞吐量有较大提高,但是异常率快速增长,多次测试,相差不是很大

    加入NIO线程池后,异常率下降到0,吞吐量比原来快了6-8倍

    附测试使用的server.xml截图:

     

    五、Tomcat线程线程详解

    1 main线程

    (1) main线程是Tomcat的主要线程,其主要作用是通过启动包来对容器点火

    (2) main的作用是把容器组件拉起来,然后阻塞在8005端口,等待关闭

    2 localhost-startstop线程(Tomcat8)

    (1) Tomcat采用层级异步启动,对于每一层级的组件都是采用startstop线程进行启动

    (2) 当组件启动完成之后,那么该线程就退出了,生命周期仅仅限于此

    3 AsyncFileHandleWriterandleWriter线程

    主要作用是对接日志框架

    4 ContainerBackgroundProcessor线程(Tomcat8)

    (1) 主要负责实时扫描Tomcat容器的变化,在一些时刻触发某些事件,例如在热部署开启时reload工程等

    (2) 扫描容器时按照层级递归扫描

    5 Catalina-Utility 线程 (Tomcat9)

    将Tomcat8中的ContainerBackground线程和startstop线程合二为一了

    6 Accept线程

    (1)Tomcat前端最外层的线程,负责统一接受socket请求

    (2)Acceptor处理完之后的线程在nio 和 bio模式之间略有差异

    其中,NIO的效率比BIO高是因为acceptor线程和exec线程之间多了一个pull线程在轮询,已经就绪的这些socket通道全部返回给你;pull线程里面调用的是IO多路复用,其意思就是每一个socket都会有数据,不会发生阻塞

    7 ClientPoller线程(默认2个)

    (1) nio模式中的特有线程,reactor模式的实现者

    (2) 具体负责接收acceptor线程交接过来的事件,对事件轮询后交接给exec线程处理

    8 exec线程

    (1)Tomcat的主要工作线程,默认开启10个,接收poller线程丢过来的IO事件

    (2)主要工作是http协议解析,攒出Request和response,然后调用Tomcat后端的容器

    9 NioBlockingSelector.BlockPoller线程(默认2个)

    负责Servlet的输入和输出

    10 AsyncTimeOut线程(Tomcat8)

    主要作用检测异步request请求,触发超时,并将该请求再转发到工作线程池处理

    11 其他线程

    六 线程的分类

    左侧是辅助线程,右边的4个线程是tomcat中最繁忙的4个线程,也是tomcat最重要的4个线程

    展开全文
  • Tomcat详解(十)——Tomcat性能调优

    千次阅读 2022-03-04 16:13:27
    今天继续给大家介绍Linux运维相关知识,本文主要内容是Tomcat性能调优。 一、Tomcat性能调优简介 二、Tomcat进程参数调优 三、Tomcat的JVM调优

    今天继续给大家介绍Linux运维相关知识,本文主要内容是Tomcat性能调优。

    一、Tomcat性能调优简介

    在生产环境中,Tomcat在部署时,如果采用默认配置,那么其性能则不会完全发挥出来,。我们应该根据业务环境和服务器硬件去合理的配置Tomcat的各项参数,对Tomcat进行性能上的优化,以提升Tomcat在并发量和响应时间等方面的性能。
    总得来看,进行优化以大略的归结为以下四个方面:
    1、Linux内核的优化
    2、服务器资源配置的优化
    3、Tomcat参数优化
    4、配置负载集群优化

    二、Tomcat进程参数调优

    在Tomcat的账户配置文件中,connector元素中有一些Tomcat进程方面的参数,如下所示:
    在这里插入图片描述
    在这里,有以下5个参数经常在Tomcat调优中使用到。
    1、connectionTimeout
    该参数指定了Tomcat的超时时间,单位为毫秒。
    2、maxThreads
    该参数指定了Tomcat的最大线程数,默认为200,一般服务器可以设置为5000。
    3、minSpareThreads
    该参数指定了Tomcat的最小空闲线程数。
    4、acceptCount
    该参数指定了当Tomcat启动进程的数量达到maxThreads参数规定的最大值时,Tomcat队列中允许存储的请求个数,该参数默认为100,一般服务器可以设置为10000。
    5、enableLooksup
    该参数指定Tomcat是否进行DNS查询,一般设置为false,不进行DNS查询以加快处理响应速度。

    三、Tomcat的JVM调优

    除了更改上述参数外,我们还可以进行JVM方面的调优,打开tomcat的bin目录下的catalina.sh文件,在文件的最后添加如下内容:

    CATALINA_OPTS="$CATALINA_OPTS -Xms512M -Xmx1024M -Xmn100M -XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=82 -DLOCALE=UTF-16LE  -DRAMDISK=/ -DUSE_RAM_DISK=ture-DRAM_DISK=true -Djava.rmi.server.hostname=192.168.111.128 -Dcom.sun.management.jmxremote.port=10000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
    

    上述配置,与JVM的相关堆栈配置有关,涉及到JVM以及程序运行方面的知识,在这里就不过多赘述了,有兴趣的同学可以学习JAVA方面的知识,也可以持续关注我的博客,关于这部分内容也将在后期予以介绍!
    原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

    展开全文
  • 3. Tomcat 性能调优3.1 Tomcat 性能测试3.2 Tomcat 性能优化3.2.1Tomcat配置调优1.禁用AJP连接2.Connector 连接器的选择3.Executor线程池调整3.2.2 JVM参数调优1) JVM内存参数2) GC策略3.2.3 Tomcat架构调优动静...

    目录

    • 3. Tomcat 性能调优3.1 Tomcat 性能测试3.2 Tomcat 性能优化3.2.1Tomcat配置调优1.禁用AJP连接2.Connector 连接器的选择3.Executor线程池调整3.2.2 JVM参数调优1) JVM内存参数2) GC策略3.2.3 Tomcat架构调优动静分离:Tomcat集群:修改Tomcat默认端口号tomcat中部署项目的方式

    3. Tomcat 性能调优

    性能优化的三个指标

    降低响应时间 :   
    
    提高系统吞吐量(QPS) :  QPS (每秒请求量)     T(事务) PS (每秒处理事务的数量) 
    
    提高服务的可用性:    
    

    性能优化的原则

    具体情况具体分析
    积少成多
    

    性能分析工具

    JConsole  jvm性能监控平台:  主要监控 内存和CPU的情况
    
    JMeter 分布式性能测试工具:   响应时间、吞吐量、错误率
    

    性能优化测试指标

    正确率、CPU占有率、QPS、JVM
    

    3.1 Tomcat 性能测试

    我们使用JMeter来进行测试:

    3.2 Tomcat 性能优化

    3.2.1Tomcat配置调优

    1.禁用AJP连接

    默认状态下,Tomcat会启动AJP服务,占用8009端口。
    
    AJP是什么?有什么作用呢?
    
    AJP(Apache JServer Protocol) 是为Tomcat与HTTP服务器之间通信而定制的协议,能提供较高的通信速度和效率。
    
    Tomcat虽然是一个javaWeb服务器,可以对静态资源进行解析,但它最主要的作用是提供Servlet 和 Jsp容器,对静态资源的解析肯定不如一些专业的Http服务器 如:apache、nginx 。所以通常生产环境会把Tomcat和其他http服务器搭配使用, 所有请求都访问http服务器,如果访问的资源是Servlet或Jsp则http服务器将请求交由Tomcat处理,如果静态资源 http服务器直接处理, ajp就是apache服务器和tomcat服务器通信的主要协议,nginx 和 浏览器是不支持这个协议的,所以如果你不使用Tomcat和Apache服务器整合的话,这个AJP协议服务是没必要开启的。
    

    ajp就是下面这行代码来配置,主要注释它就可以禁用AJP

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    

    2.Connector 连接器的选择

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

    BIO:

    一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。

    Tomcat7或以下,在Linux系统中默认使用这种方式。

    NIO:

    利用Java的异步IO处理,可以通过少量的线程处理大量的请求。

    Tomcat8在Linux系统中默认使用这种方式。

    Tomcat7必须修改Connector配置来启动:

    APR:

    即Apache Portable Runtime,从操作系统层面解决io阻塞问题。

    Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。

    Linux如果安装了apr和native,Tomcat直接启动就支持apr。

    tomcat8 提供了nio2,效率要比nio快些,所以如果是tomcat8之前的版本推荐使用nio ,如果是tomcat8及之后的版本使用nio2

    APR( Apache Portable Runtime) 提供卓越的伸缩性,更强的性能以及跟原生服务器技术更好的集成。

    如果使用APR要保证1.配置文件中引入了APR的监听 2.服务器上安装APR的相关软件

    linux配置APR:

    安装依赖

    yum install apr-devel yum install openssl-devel yum install gcc yum install make

    安装APR包

    进入 apache-tomcat-8.5.39/bin 执行命令 tar -xzvf tomcat-native.tar.gz

    输入命令 cd
    tomcat-native-1.2.21-src/native/

    进入到native文件夹下

    执行命令 ./configure && make && make install

    安装后会出现这个界面,表示安装成功,并给出了安装后的目录位置

    通过上图我们可以看到 我们还需要配置两个环境变量

    输入命令使环境变量生效 source /etc/profile

    修改server.xml 配置

    启动tomcat查看日志

    进入到 /logs目录 执行命令 tail -f -n 200 catalina.out

    <Connector  executor="tomcatThreadPool"
                port="8080"
                protocol="org.apache.coyote.http11.Http11Nio2Protocol"
                connectionTimeout="20000"
    		    redirectPort="8443"/>
    

    Connector参数解释

    URIEncoding:指定 Tomcat 容器的 URL 编码格式,语言编码格式这块倒不如其它 WEB 服务器软件配置方便,需要分别指定。
    

    面试可以说:设置连接超时时间,当后台出现问题,连接可以及时断掉

    connnectionTimeout: 网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒(30秒),可根据检测实际情况,适当修改。

    enableLookups: 是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为 false。
    
    disableUploadTimeout:上传时是否使用超时机制。
    
    connectionUploadTimeout:上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
    
    acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个。
    
    keepAliveTimeout:长连接最大保持时间(毫秒),表示在下次请求过来之前,Tomcat 保持该连接多久,默认是使用 connectionTimeout 时间,-1 为不限制超时。
    
    maxKeepAliveRequests:表示在服务器关闭之前,该连接最大支持的请求数。超过该请求数的连接也将被关闭,1表示禁用,-1表示不限制个数,默认100个,一般设置在100~200之间。
    

    面试可以说压缩:连接器参数开启响应数据压缩

    compression:是否对响应的数据进行 GZIP 压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一般可以减小1/3左右,节省带宽。
    
    compressionMinSize:表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是2048KB。
    
    compressableMimeType:压缩类型,指定对哪些类型的文件进行数据压缩。
    
    noCompressionUserAgents="gozilla, traviata": 对于以下的浏览器,不启用压缩。
    

    参考配置

    连接器的具体参考配置: 
    <Connector executor="tomcatThreadPool"
                   port="8080" protocol="HTTP/1.1"
                   URIEncoding="UTF-8"
                   connectionTimeout="30000"
                   enableLookups="false"
                   disableUploadTimeout="false"
                   connectionUploadTimeout="150000"
                   acceptCount="300"
                   keepAliveTimeout="120000"
                   maxKeepAliveRequests="1"
                   compression="on"
                   compressionMinSize="2048"         compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" redirectPort="8443" />
    

    3.Executor线程池调整

    默认配置下,Tomcat 会为每个连接器创建一个绑定的线程池(最大线程数 200),服务启动时,默认创建了 5 个空闲线程随时等待用户请求

    默认情况:

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>
    

    修改连接池:

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="100" maxSpareThreads="50" maxIdleTime="60000"/>
    
    机器比较好情况:最小线程数不超过<100,最大线程数不超过<500
    

    然后,修改<Connector …>节点,增加 executor 属性,调整为

    <Connector  executor="tomcatThreadPool"
                port="8080"
                protocol="org.apache.coyote.http11.Http11Nio2Protocol"
                connectionTimeout="20000"
    		    redirectPort="8443"/>
    

    Executor参数解释:

    maxThreads,最大并发数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断
    minSpareThreads,Tomcat 初始化时创建的线程数,默认设置 25
    prestartminSpareThreads,在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
    maxQueueSize,最大的等待队列数,超过则拒绝请求

    3.2.2 JVM参数调优

    Tomcat是一款Java应用,那么JVM的配置便与其运行性能密切相关,而JVM优化的重点则集中在内存分配和GC策略的调整上,因为内存会直接影响服务的运行效率和吞吐量,JVM垃圾回收机制则会不同程度地导致程序运行中断。可以根据应用程序的特点,选择不同的垃圾回收策略,调整JVM垃圾回收策略,可以极大减少垃圾回收次数,提升垃圾回收效率,改善程序运行性能。

    1) JVM内存参数

    参数

    参数作用

    优化建议

    -server

    启动Server,以服务端模式运行

    服务端模式建议开启

    -Xms

    最小堆内存

    建议与-Xmx设置相同

    -Xmx

    最大堆内存

    建议设置为可用内存的80%

    -XX:MetaspaceSize

    元空间初始值

    -XX:MaxMetaspaceSize

    元空间最大内存

    默认无限

    -XX:NewSize

    新生代初始值

    -XX:MaxNewSize

    新生代最大内存

    默认16M

    -XX:NewRatio

    年轻代和老年代大小比值,取值为整数,默认为2

    不建议修改

    -XX:SurvivorRatio

    Eden区与Survivor幸存者区大小的比值,取值为整数,默认为8

    不建议修改

    -Xms:Java虚拟机初始化时堆的最小内存,一般与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能;

    可以利用JDK自带的工具进行验证,这些工具都在/bin目录下:
    1)jps:用来显示本地的java进程,以及进程号,进程启动的路径等。
    2)jmap:观察运行中的JVM 物理内存的占用情况,包括Heap size , Perm size等。
    进入命令行模式后,进入JAVA_HOME/bin目录下,然后输入jps命令:
    
    free -m 命令查看当前服务器的可用内存
    
    JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m  -XX:SurvivorRatio=8"
    

    2) GC策略

    JVM垃圾回收性能有以下两个主要的指标:

    • 吞吐量:工作时间(排除GC时间)占总时间的百分比, 工作时间并不仅是程序运行的时间,还包含内存分配时间。
    • 暂停时间:测试时间段内,由垃圾回收导致的应用程序停止响应次数/时间。

    不同的应用程序, 对于垃圾回收会有不同的需求。 JVM 会根据运行的平台、服务器资源配置情况选择合适的垃圾收集器、堆内存大小及运行时编译器。如无法满足需求, 参考以下准则:

    A. 程序数据量较小,选择串行收集器。

    B. 应用运行在单核处理器上且没有暂停时间要求, 可交由JVM自行选择或选择串行收集器。

    C. 如果考虑应用程序的峰值性能, 没有暂停时间要求, 可以选择并行收集器。

    D. 如果应用程序的响应时间比整体吞吐量更重要, 可以选择并发收集器。

    查看Tomcat中的默认的垃圾收集器:

    1). 在tomcat/bin/catalina.sh的配置中, 加入如下配置

    JAVA_OPTS=" -Djava.rmi.server.hostname=192.168.18.129 -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.rmi.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
    

    2). 打开 jconsole , 查看远程的tomcat的概要信息

    连接远程tomcat

    GC参数:

    参数

    描述

    -XX:+UseSerialGC

    启用串行收集器

    -XX:+UseParallelGC

    启用并行垃圾收集器,配置了该选项,那么 -XX:+UseParallelOldGC默认启用

    -XX:+UseParallelOldGC

    FullGC 采用并行收集,默认禁用。如果设置了 -XX:+UseParallelGC则自动启用

    -XX:+UseParNewGC

    年轻代采用并行收集器,如果设置了 -XX:+UseConcMarkSweepGC选项,自动启用

    -XX:+ParallelGCThreads

    年轻代及老年代垃圾回收使用的线程数。默认值依赖于JVM使用的CPU个数

    -XX:+UseConcMarkSweepGC

    并发垃圾收集器 对于老年代,启用CMS垃圾收集器。 当并行收集器无法满足应用的延迟需求是,推荐使用CMS或G1收集器。
    启用该选项后, -XX:+UseParNewGC 自动启用。

    -XX:+UseG1GC

    启用G1收集器。 G1是服务器类型的收集器, 用于多核、大内存的机器。它在保持高吞吐量的情况下,高概率满足GC暂停时间的目标。

    我们也可以在测试的时候,将JVM参数调整之后,将GC的信息打印出来,便于为我们进行参数调整提供依据,具体参数如下:

    选项

    描述

    -XX:+PrintGC

    打印每次GC的信息

    -XX:+PrintGCApplicationConcurrentTime

    打印最后一次暂停之后所经过的时间, 即响应并发执行的时间

    -XX:+PrintGCApplicationStoppedTime

    打印GC时应用暂停时间

    -XX:+PrintGCDateStamps

    打印每次GC的日期戳

    -XX:+PrintGCDetails

    打印每次GC的详细信息

    -XX:+PrintGCTaskTimeStamps

    打印每个GC工作线程任务的时间戳

    -XX:+PrintGCTimeStamps

    打印每次GC的时间戳

    在bin/catalina.sh的脚本中 , 追加如下配置 :

    JAVA_OPTS="-XX:+UseConcMarkSweepGC  -XX:+PrintGCDetails"
    
    64位系统 centos 6.4 内存8G服务器 
    -server 
    -Xms6000M  
    -Xmx6000M   
    -Xmn500M    
    -XX:MetaspaceSize=500M    
    -XX:MaxMetaspaceSize=500M 
    -XX:SurvivorRatio=65536  
    -XX:MaxTenuringThreshold=0
    -Xnoclassgc
    -XX:+DisableExplicitGC
    -XX:+UseParNewGC    
    -XX:+UseConcMarkSweepGC    
    -XX:+UseCMSCompactAtFullCollection   
    -XX:CMSFullGCsBeforeCompaction=0 
    -XX:CMSInitiatingOccupancyFraction=80       
    -XX:+PrintClassHistogram  
    -XX:+PrintGCDetails  
    -XX:+PrintGCTimeStamps  
    -XX:+PrintHeapAtGC   
    -Xloggc:log/gc.log
    

    3.2.3 Tomcat架构调优

    前面我们已经通过系统、jvm、和tomcat自身大大提升的tomcat的性能,但tomcat的性能是有极限的,Tomcat理论支持500左右并发,所以接下来我们会聊聊在如何合理使用tomcat上,实际上也就是架构的 层面聊聊如果优化。这里面我们主要讨论两个优化思路:动静分离Tomcat集群

    就需要搭建Tomcat的集群,而目前比较流程的做法就是通过Nginx来实现Tomcat集群的负载均衡。

    动静分离:

    Tomcat主要处理servlet、jsp占优势,项目中静态资源(图片、视频、.CSS、.html、.js)访问,耗费请求连接,把静态资源放在Nginx服务器中,静态请求不经过Tomcat,不占并发数。
    
    Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。
    
    优点:
    1、可以高并发连接
    官方测试Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数。
    
    2、内存消耗少
    Nginx+PHP(FastCGI)服务器,
    在3万并发连接下,开启10个Nginx进程消耗150MB内存,15MB*10=150MB,
    开启的64个PHP-CGI进程消耗1280内存,20MB*64=1280MB,加上系统自身消耗的内存,
    总共消耗不到2GB的内存。
     
    3、成本低廉
    购买F5BIG-IP、NetScaler等硬件负载均衡交换机,需要十多万到几十万人民币,而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费试用,并且可用于商业用途。
    
    4、配置文件非常简单
    网络和程序一样通俗易懂,即使,非专用系统管理员也能看懂。
    
    5、内置的健康检查功能
    如果NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。
    
    6、节省带宽
    支持GZIP压缩,可以添加浏览器本地缓存的Header头。
    
    7、稳定性高
    用于反向代理,宕机的概率微乎其微。
    
    8、支持热部署
    Nginx支持热部署,它的自动特别容易,并且,几乎可以7天*24小时不间断的运行,即使,运行数个月也不需要重新启动,还能够在不间断服务的情况下,对软件版本进行升级。
    
    

    Nginx反向代理配置:

    Tomcat集群:

    修改Tomcat默认端口号

    tomcat默认的端口号(缺省端口),怎么修改

    tomcat默认的端口是8080

    修改Server.xml中 Connector的port属性即可,

    如果同一个tomcat要启动多个tomcat ,还需要修改Server里面的port端口 以及Connector AJP协议的port端口

    <Server port="8006" shutdown="SHUTDOWN">
    
    <Connector  port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" redirectPort="8443" />
    
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />	  
    

    tomcat中部署项目的方式

    部署的三种方案:

    1.直接将web项目 或 war包 拷贝至webapps目录下即可:

    2.在配置文件Server.xml中找到标签,在里面 加上下面一句:

    <Context docBase="项目的路径" path="虚拟目录" />
    

    3.conf/Catalina/localhost 创建 xxx.xml文件,在文件中指定项目路径,该项目的访问路径 即文件的名字

     <Context docBase="项目的路径" />
    

    PS:ROOT文件夹内是根目录下的项目,访问该项目不需要加虚拟目录

    tomcat中运行的生产项目,出现问题如何排查?

    出现问题首先去tomcat的logs目录下,查看日志文件中有没有什么错误信息。

    catalina.201X-XX-XX.log记录启动时日志信息

    localhost.201X-XX-XX.log记录各个webapp下项目的日志信息

    tail -f fileName    
    #会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
    

    如:日志中发现


    java.lang.StackOverflowError异常,这个是栈内存溢出

    可能在哪些地方发生内存泄漏了,如果通过异常能够找到溢出的发生地,则优化对应代码。

    如果没有发现,则可以通过 JvisualVM 等工具监控Tomcat的运行情况

    学习更多JAVA知识与技巧,关注与私信博主(学习)免费学习领取JAVA 课件,源码,安装包,还有最新

    大厂面试资料等等等

    展开全文
  • tomcat 性能调优

    万次阅读 多人点赞 2018-11-20 15:05:18
    总体架构 主要的组件 执行过程 tomcat 调优 1.禁用 ajp 协议 2.启用nio模式(提升原有的吞吐量36%) 3.开启链接池 硬件指标,业务指标 4.优化连接器
  • Tomcat性能调优方案

    2014-08-25 13:41:32
    一、操作系统调优 二、Java虚拟机调优 三、Apache集成Tomcat 四、Apache和Tomcat集群 五、Tomcat自身优化 六、APR库使用
  • 前面咱们对Tomcat有了一个大体的认知,...咱学习tomcat最主要的目的是可以根据情况对tomcat进行专门的配置,让其发挥更优的性能,更好的为我们工作。本文就通过实际配置演示来看一下tomcat的各种优化以及优化后的效果。
  • Tomcat性能调优(windows)

    千次阅读 2020-04-09 10:42:11
    1、目录: a、基础调优 b、JVM 优化 c、高级调优 2、基础调优: 2.1、tomcat的各版本的优化...2.2、配置tomcat管理员账户(查看 Tomcat 的运行状态),编辑 /opt/tomcat7/bin/conf/tomcat-users.xml 文件,在里面添...
  • Tomcat性能调优方案[参考].pdf
  • Tomcat 线程查看工具: https://blog.csdn.net/jrainbow/article/details/49026365   16G内存 Tomcat并发优化、内存配置、垃圾回收、宕机预防https://blog.csdn.net/u010133338/article/details/81142902  ...
  • 二、Tomcat 性能调优

    2022-04-16 20:21:20
    Tomcat 支持四种 IO 线程模型 Tomcat Connector 并发参数 Tomcat 类加载机制 Tomcat 类加载顺序 ClassLoader 异常
  • 使用visualvm工具进行tomcat性能调优和性能监控.docx
  • tomcat性能调优总结

    2011-07-29 15:05:09
    在Tomcat和应用程序进行了压力测试后,如果您对应用程序的性能结果不太满意,就可以采取一些性能调整措施了,当然了前提是应用程序没有问题,tomcat性能调优总结,欢迎下载
  • tomcat优化的我用到的几个点: 1.内存优化 2.线程优化 docs/config/http.html maxConnections acceptCount(配置的太大是没有意义的) maxThreads minSpareThreads 最小空闲的工作线程(不能设置的太小) 4.配置...
  • 高级技术分水岭之Tomcat调优
  • 优化提高tomcat性能.Tomcat参数调优 大家也许经常会遇到面试时问你会不会TOMCAT性能调优技术,现在奉上
  • Tomcat 性能调优

    2021-06-29 22:27:29
    总体架构主要的组件执行过程tomcat 调优内存优化并发优化缓存优化IO优化开启线程池添加Listener组件优化APRTomcat Native配置 性能测试(工具)1.Jmeter 可参考该博主 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,358
精华内容 12,143
关键字:

tomcat性能调优