精华内容
下载资源
问答
  • tomcat集群

    2013-01-17 17:31:03
    据说tomcat最高支持500并发,集群显得很有必要,将大量请求分发到多个tomcat来处理。 tomcat集群涉及两个问题:  1.请求分发,自动将请求分发到不同的tomcat  2.session同步(session复制) 一、请求分发...

    据说tomcat最高支持500并发,集群显得很有必要,将大量请求分发到多个tomcat来处理。

    tomcat集群涉及两个问题:

              1.请求分发,自动将请求分发到不同的tomcat  

              2.session同步(session复制)


    一、请求分发

    请求分发可以通过apache 或者 nginx来实现。(此例用nginx)

    进入nginx/conf目录, 复制nginx.conf 为 nginx.conf.bak 留作备份,编辑nginx。

    a.在 http  > server > location 下添加 proxy_pass    http://127.0.0.1;

    b.在 http > 下添加 

    upstream 127.0.0.1 {
             #weigth参数表示权值,权值越高被分配到的几率越大
             server 127.0.0.1:8080 weight=1;
             server 127.0.0.1:8081 weight=2;
         }
    完整配置文件见文末。

    二、session复制

    tomcat的session复制可参考tomcat文档 user guide 第18)

    我采用的是在tomcat/conf/web.xml 文件 web-app 节点下添加 <distributable/>

    tomcat/conf/server.xml     先修改两tomcat 服务端口,然后分别

     <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">      
     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>


    三、测试

    启动 两tomcat,启动nginx,新建测试页分别放到webapp/ROOT 下,然后访问。


    一些代码:

    nginx.conf配置

    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
    
        server {
            listen       90;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html;
                index  index.html index.htm test.jsp;
                proxy_pass    http://127.0.0.1;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    
        upstream 127.0.0.1 {
             #weigth参数表示权值,权值越高被分配到的几率越大
             server 127.0.0.1:8080 weight=1;
             server 127.0.0.1:8081 weight=2;
         }
    
    
    }
    

    nginx服务管理:

    D:\>cd Server
    D:\Server>cd nginx-1.3.8
    
    #停止服务
    D:\Server\nginx-1.3.8>nginx -s stop
    
    #测试环境
    D:\Server\nginx-1.3.8>nginx -t
    
    #启动服务
    D:\Server\nginx-1.3.8>nginx -c conf/nginx.conf
    暴力结束进程: taskkill -F -IM nginx.exe


    还有一点问题,就是不同主机上tomcat session复制的问题,留待下次研究。




    展开全文
  • Tomcat7性能调优

    2018-11-16 14:21:00
    并发量高时,线程数较多,浪费资源。Tomcat7默认使用这种方式。 ●NIO:利用Java的非阻塞IO处理,通过线程池处理大量的请求。 Tomcat8默认采用这种方式。 ●APR:从操作系统层面解决io阻塞问题,性能最高Tomcat7...

    1.1 tomcat的三种运行模式:

      ●BIO:一个请求处理一个线程。并发量高时,线程数较多,浪费资源。Tomcat7默认使用这种方式。
      ●NIO:利用Java的非阻塞IO处理,通过线程池处理大量的请求。 Tomcat8默认采用这种方式。
      ●APR:从操作系统层面解决io阻塞问题,性能最高。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式;Linux如果安装了apr和native,Tomcat直接启动就支持apr。(安装方法:http://www.cnblogs.com/nb-blog/p/5278502.html)

    1.2 三种运行模式性能对比:

      

     1.3 NIO性能调优:

    1.3.1 在conf/tomcat-users.xml文件末尾添加用户,账号密码都叫tomcat

    <role rolename="manager"/>
    <role rolename="manager-gui"/>
    <role rolename="admin"/>
    <role rolename="admin-gui"/>
    <user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>

    1.3.2 进入管理页面,可以看到tomcat7默认是bio运行模式

      

    1.3.3 编辑conf/server.xml,将protocol="HTTP/1.1"修改为org.apache.coyote.http11.Http11NioProtocol

      

    1.3.4 设置tomcat线程池

      

    1.3.5.1 优化线程池参数并指定线程池

      

    1.3.5.2 上面我们就已经配置好了nio模型,下面可以通过自定义属性来优化它

      

    【连接池参数】
    maxThreads :   最大连接
    minSpareThreads : 最小连接
    maxQueueSize : 连接超时时间单位毫秒
    prestartminSpareThreads :是否在启动时就生成minSpareThreads个线程
    threadPriority : 执行程序中线程的线程优先级默认为5(线程的值)
    daemon : 是否为守护线程 默认为true
    namePrefix : 线程的名称前缀。单个线程的线程名将是namePrefix+threadNumber
    maxIdleTime : 空闲线程等待时间单位毫秒
    threadRenewalDelay : 重建线程的时间间隔; 为了避免线程同时重建,默认每隔1000ms重建一个线程,设置为负则不重建

    【连接器参数 connector】
    SSLEnabled : 如果要打开SSL握手/加密/解密,请设置true。默认值是false。
    maxPostSize : 上传文件最大大小, 默认是2mb
    URIEncoding : 指定字符编码 能解决get请求乱码问题,默认ISO-8859-1。
    acceptCount : 当所有处理线程都在使用时,新的请求会排队,默认超过100会拒绝。
    acceptorThreadCount :用于接受连接的线程的数量。在一个服务器上一般为1不可能超过2,默认值是 1。
    maxConnections :最大并发量,超过这个范围服务器就不再接收请求。NIO的默认值是10000。APR /native的默认值是8192。如果设置的值-1,maxConnections功能被禁用

    1.3.6 上面就已经将nio优化配置完了,我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,我们还可以禁用AJP连接器来继续优化。

      

    1.3.7 重启测试:可以看到最大连接是500,默认连接为5,并且是nio运行模式。

      

    转载于:https://www.cnblogs.com/wlwl/p/9969090.html

    展开全文
  • Tomcat 8 性能优化

    2019-12-11 11:28:28
    而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高并发最大,...

    本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。

    目的
    通过Tomcat性能优化可以提高网站的并发能力。

    Tomcat服务器在JavaEE项目中使用率非常高,所以在生产环境对Tomcat的优化也变得非常重要了。

    对于Tomcat的优化,主要是从2个方面入手,一是Tomcat自身的配置,另一个是Tomcat所运行的jvm虚拟机的调优。

    服务器资源
    服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。硬件我们不说了,这个方面是钱越多越好是吧。

    一、Tomcat配置优化

    Linux环境安装运行Tomcat8
    具体的安装步骤可以参考Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项

    如果需要登录系统,必须配置tomcat用户,在安装完Tomcat后,进行如下操作

    在/conf/tomcat-users.xml文件中的标签里面添加如下内容

    <role rolename="manager"/>
    <role rolename="manager-gui"/>
    <role rolename="admin"/>
    <role rolename="admin-gui"/>
    <user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>
    

    如果是tomcat7,配置了tomcat用户就可以登录系统了,但是tomcat8中不行,还需要修改另一个配置文件,否则访问不了,提示403,打开webapps/manager/META-INF/context.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    <Context antiResourceLocking="false" privileged="true" >
      <!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
             allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
      <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
    </Context>
    

    打开浏览器进行访问10.172.0.202:8080
    在这里插入图片描述
    点击“Server Status”,输入用户名、密码进行登录,tomcat/tomcat
    在这里插入图片描述
    登录之后可以看到服务器状态等信息,主要包括服务器信息,JVM,ajp和http信息
    在这里插入图片描述
    二、AJP连接
    在服务状态页面中可以看到,默认状态下会启用AJP服务,并且占用8009端口。
    在这里插入图片描述
    什么是AJP

    AJP(Apache JServer Protocol)
    AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。
    在这里插入图片描述
    我们一般是使用Nginx+Tomcat的架构,所以用不着AJP协议,把AJP连接器禁用。
    修改conf下的server.xml文件,将AJP服务禁用掉即可。

    <!-- 禁用AJP连接 -->
    <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
    

    重启tomcat,查看效果。可以看到AJP服务已经不存在了。
    在这里插入图片描述
    三、执行器(线程池)
    在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。

    修改server.xml文件:

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/>
    
    <!--
    参数说明:
    maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 1000,根据硬件设施和业务来判断
    minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25
    prestartminSpareThreads: 在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
    maxQueueSize,最大的等待队列数,超过则拒绝请求
    -->
    
    <!--在Connector中设置executor属性指向上面的执行器-->
    <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    

    保存退出,重启tomcat,查看效果。
    在这里插入图片描述

    在页面中显示最大线程数为-1,这个是正常的,仅仅是显示的问题,实际使用的是指定的值。如果配置了一个Executor,则该属性的任何值将被正确记录,但是它将被显示为-1

    四、3种运行模式
    tomcat的运行模式有3种:

    bio
    性能非常低下,没有经过任何优化处理和支持

    nio
    nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8默认使用nio运行模式。

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

    对于每种协议,Tomcat都提供了对应的I/O方式的实现,而且Tomcat官方还提供了在每种协议下每种I/O实现方案的差异, HTTP协议下的处理方式如下表,详情可查看Tomcat官网说明
    在这里插入图片描述
    设置nio2:

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

    在这里插入图片描述
    可以看到已经设置为nio2了。

    五、部署测试用的web项目
    为了方便测试性能,我们将部署一个java web项目,这个项目本身和本博客没有什么关系,仅仅用于测试。

    注意:这里在测试时,我们使用一个新的tomcat,进行测试,后面再对其进行优化调整,再测试。

    查看服务器信息
    说明一下我的测试服务器配置,不同的服务器配置对Tomcat的性能会有所影响。
    在这里插入图片描述

    查看Linux版本

    查看Linux版本:cat /etc/centos-release

    查看CPU个数

    查看逻辑cpu个数:cat /proc/cpuinfo | grep “processor” | wc -l

    查看物理cpu个数:cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l

    查看每个物理cpu的核数cores:cat /proc/cpuinfo | grep “cpu cores”

    如果所有物理cpu的cores个数加起来小于逻辑cpu的个数,则该cpu使用了超线程技术。查看每个物理cpu中逻辑cpu的个数:cat /proc/cpuinfo | grep “siblings”

    查看内存使用情况

    查看内存占用情况:free -m

    参数说明

    Mem:内存的使用情况总览表。

    total:机器总的物理内存 单位为:M

    used:用掉的内存。

    free:空闲的物理内存。

    [root@localhost ~]# cat /etc/centos-release
    CentOS Linux release 7.2.1511 (Core)
    
    [root@localhost ~]# cat /proc/cpuinfo | grep "processor" | wc -l
    4
    [root@localhost ~]# cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
    4
    
    [root@localhost ~]# cat /proc/cpuinfo | grep "cpu cores"
    cpu cores       : 1
    cpu cores       : 1
    cpu cores       : 1
    cpu cores       : 1
    
    [root@localhost ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:           7825         850        6241           9         733        6714
    Swap:          8063           0        8063
    

    六、部署web应用
    上传war包到linux服务器,然后进行部署

    我的web应用的名字叫tomcat-optimization,主要是提供了一个查询用户列表的接口,该接口会去阿里云数据库查询用户列表,没有任务业务逻辑的处理。

    # 删除tomcat的/webapps/ROOT目录的所有文件
    cd /webapps/ROOT
    rm -rf *
    
    # 上传war包到tomcat的/webapps/ROOT,然后解压
    jar -xvf tomcat-optimization.war
    rm -rf tomcat-optimization.war
    
    # 进入tomcat的/bin目录重启tomcat
    cd /bin
    ./shutdown.sh
    ./startup.sh
    

    访问接口地址: http://10.172.0.202:8080/user/listUser

    [{
    	"id": 1,
    	"account": "lilei",
    	"password": "123456",
    	"userName": "李雷",
    	"gender": 1,
    	"age": 15,
    	"birthday": "2001-01-01 01:01:38",
    	"createTime": "2016-03-01 19:09:55"
    }, {
    	"id": 2,
    	"account": "hanmeimei",
    	"password": "123456",
    	"userName": "韩梅梅",
    	"gender": 0,
    	"age": 14,
    	"birthday": "2002-01-01 01:01:38",
    	"createTime": "2016-03-01 19:09:55"
    }, {
    	"id": 3,
    	"account": "lucy",
    	"password": "123456",
    	"userName": "露西",
    	"gender": 0,
    	"age": 13,
    	"birthday": "2003-01-01 01:01:38",
    	"createTime": "2016-03-01 19:09:55"
    }]
    

    七、使用Apache JMeter进行性能测试
    Apache JMeter是Apache组织开发的基于Java的压力测试工具。 我们借助于此工具进行测试,将测试出tomcat的吞吐量等信息。

    下载安装
    下载地址:http://jmeter.apache.org/download_jmeter.cgi

    在这里插入图片描述

    注意:这里需要先安装好jdk8及其以上版本的环境,可以参考JDK安装与环境变量配置

    直接将下载好的zip压缩包进行解压即可。
    在这里插入图片描述

    进入bin目录,找到jmeter.bat文件,双机打开即可启动。

    在这里插入图片描述

    JMeter启动页面

    在这里插入图片描述

    JMeter主页面

    在这里插入图片描述

    修改语言
    默认的主题是黑色风格的主题并且语言是英语,这样不太方便使用,所以需要修改下语言。

    设置语言为简体中文。
    在这里插入图片描述
    修改语言完成的界面
    在这里插入图片描述

    创建接口的测试用例
    测试接口之前需要调整Windows环境配置,不然会报如下错误

    JMeter java.net.BindException: Address already in use: connect
    

    出现原因:
    TCP/IP连接数不够或TIME_WAIT中存在很多链接,导致吞吐量低。

    解决方案:
    从问题的原因分析,有两种解决方案,一是增加预留给TCP/IP服务的临时端口的数量,二是加快被占用端口的释放速度。

    解决办法:
    1、打开注册表:regedit
    2、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters
    3、新建 DWORD值,name:TCPTimedWaitDelay,value:30(十进制) –> 设置为30秒,默认是240秒
    4、新建 DWORD值,name:MaxUserPort,value:65534(十进制) –> 设置最大连接数65534
    5、重启系统

    第一步:设置测试计划的名称

    在这里插入图片描述

    第二步:添加线程组,使用线程模拟用户的并发

    在这里插入图片描述
    在这里插入图片描述

    1000个线程,每个线程循环10次,也就是tomcat会接收到10000个请求。

    第三步:添加http请求
    在这里插入图片描述

    设置http请求

    在这里插入图片描述

    第四步:添加请求监控
    在这里插入图片描述

    启动与进行接口测试
    在这里插入图片描述

    查看测试报告
    在聚合报告中,重点看吞吐量。

    在这里插入图片描述

    八、调整Tomcat参数进行优化
    通过上面测试可以看出,tomcat在不做任何调整时,吞吐量为697次/秒。这个吞吐量跟接口的业务逻辑关系很大,如果业务逻辑复杂,需要比较长时间计算的,可能吞吐量只有几十次/秒,我这里测试的时候没有添加任务业务逻辑,才会出现吞吐量为697次/秒的情况。这里的吞吐量最好是经过多次测试取平均值,因为单次测试具有一定的随机性

    禁用AJP连接
    修改conf下的server.xml文件,将AJP服务禁用掉即可。

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

    在这里插入图片描述
    这里经过9次测试,测试结果如下704 730 736 728 730 727 714 708 735 平均是723

    可以看到,禁用AJP服务后,吞吐量会有所提升。

    当然了,测试不一定准确,需要多测试几次才能看出是否有提升。

    设置线程池
    通过设置线程池,调整线程池相关的参数进行测试tomcat的性能。有关线程池更多更详细的配置参考Tomcat官网提供的配置详解

    最大线程数为150,初始为4

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="150" minSpareThreads="4" prestartminSpareThreads="true"/>
    
    <!--在Connector中设置executor属性指向上面的执行器-->
    <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    

    经过9次测试,测试结果如下705 725 702 729 733 738 735 728 平均是724

    最大线程数为500,初始为50

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"/>
    
    <!--在Connector中设置executor属性指向上面的执行器-->
    <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    

    测试结果:733 724 718 728 734 721 720 723 平均725

    吞吐量为725次/秒,性能有所提升。

    最大线程数为1000,初始为200

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="1000" minSpareThreads="200" prestartminSpareThreads="true"/>
    
    <!--在Connector中设置executor属性指向上面的执行器-->
    <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    

    吞吐量为732,性能有所提升。

    测试结果 737 729 730 738 735 726 725 740 平均732

    最大线程数为5000,初始为1000
    是否是线程数最多,速度越快呢? 我们来测试下。

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="5000" minSpareThreads="1000" prestartminSpareThreads="true"/>
    <!--在Connector中设置executor属性指向上面的执行器-->
    <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    

    测试结果 727 733 728 725 738 729 737 735 739 平均732

    可以看到,虽然最大线程已经设置到5000,但是实际测试效果并不理想,并且平均的响应时间也边长了,所以单纯靠提升线程数量是不能一直得到性能提升的。

    设置最大等待队列数
    默认情况下,请求发送到tomcat,如果tomcat正忙,那么该请求会一直等待。这样虽然可以保证每个请求都能请求到,但是请求时间就会边长。

    有些时候,我们也不一定要求请求一定等待,可以设置最大等待队列大小,如果超过就不等待了。这样虽然有些请求是失败的,但是请求时间会虽短。典型的应用:12306。

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="500" minSpareThreads="100" prestartminSpareThreads="true" maxQueueSize="100"/>
    
    <!--在Connector中设置executor属性指向上面的执行器-->
    <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    

    测试结果:

    • 平均响应时间:0.438秒,响应时间明显缩短
    • 错误率:43.07%,错误率超过40%,也可以理解,最大线程为500,测试的并发为1000
    • 吞吐量:1359次/秒,吞吐量明显提升

    结论:响应时间、吞吐量这2个指标需要找到平衡才能达到更好的性能。

    设置nio2的运行模式
    将最大线程设置为500进行测试:

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="500" minSpareThreads="100" prestartminSpareThreads="true"/>
    
    <!-- 设置nio2 -->
    <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    

    从测试结果可以看到,平均响应时间有缩短,吞吐量有提升,可以得出结论:nio2的性能要高于nio。

    参数说明与最佳实践
    具体参数参考官网说明(https://tomcat.apache.org/tomcat-8.5-doc/config/executor.html)

    在这里插入图片描述
    此最佳配置仅供参考
    执行器参数说明(加粗是重点)

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="800" minSpareThreads="100" maxQueueSize="100"                                 prestartminSpareThreads="true"/>
    

    连接器参数说明
    可以看到除了这几个基本配置外并无特殊功能,所以我们需要对 Connector 进行扩展。

    其中Connector 支持参数属性可以参考Tomcat官方网站,本文就只介绍些常用的。

    通用属性(加粗是重点)
    在这里插入图片描述
    标准实现(加粗是重点)
    除了上面列出的常见的连接器属性,标准的HTTP连接器(BIO,NIO和APR/native)都支持以下属性。

    在这里插入图片描述
    连接器最佳实践
    此最佳配置仅供参考

    <Connector executor="tomcatThreadPool" port="8080" 						                            protocol="org.apache.coyote.http11.Http11Nio2Protocol" 
               connectionTimeout="20000" redirectPort="8443" 
               enableLookups="false" maxPostSize="10485760" URIEncoding="UTF-8" 	                    acceptCount="100" acceptorThreadCount="2" disableUploadTimeout="true"                    maxConnections="10000" SSLEnabled="false"/>
    

    九、调整JVM参数进行优化
    接下来,通过设置jvm参数进行优化,为了测试一致性,依然将最大线程数设置为500,启用nio2运行模式

    设置并行垃圾回收器
    在/bin/catalina.sh文件第一行添加如下参数,gc日志输出到/logs/gc.log

    #年轻代、老年代均使用并行收集器,初始堆内存64M,最大堆内存512M
    JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
    

    在这里插入图片描述
    测试结果与默认的JVM参数结果接近。

    查看gc日志文件
    将gc.log文件上传到gceasy.io查看gc中是否存在问题。上传文件后需要等待一段时间,需要耐心等待。
    在这里插入图片描述
    问题一:系统所消耗的时间大于用户时间

    在这里插入图片描述
    如果在报告中显示System Time greater than User Time,系统所消耗的时间大于用户时间,这反应出的服务器的性能存在瓶颈,调度CPU等资源所消耗的时间要长一些。

    问题二:线程暂停时间有点长
    在这里插入图片描述

    可以关键指标中可以看出,吞吐量表现不错,但是gc时,线程的暂停时间稍有点长。

    问题三:GC总次数过多

    在这里插入图片描述

    通过GC的统计可以看出:

    年轻代的gc有100次,次数有点多,说明年轻代设置的大小不合适,需要调整
    FullGC有7次,说明堆内存的大小不合适,需要调整
    问题四:年轻代内存不足导致GC
    在这里插入图片描述

    从GC原因的可以看出,年轻代大小设置不合理,导致了多次GC。

    调整年轻代大小
    调整jvm配置参数

    JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms128m -Xmx1024m -XX:NewSize=64m -XX:MaxNewSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
    

    将初始堆大小设置为128m,最大为1024m,初始年轻代大小64m,年轻代最大256m
    在这里插入图片描述

    从测试结果来看,吞吐量以及响应时间均有提升。

    查看gc日志

    在这里插入图片描述

    可以看到GC次数要明显减少,说明调整是有效的。

    在这里插入图片描述

    GC次数有所减少

    在这里插入图片描述

    设置G1垃圾回收器

    #设置了最大停顿时间100毫秒,初始堆内存128m,最大堆内存1024m
    JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
    

    测试结果
    在这里插入图片描述

    可以看到,吞吐量有所提升,评价响应时间也有所缩短。
    在这里插入图片描述

    G1集合阶段统计

    在这里插入图片描述

    十、JVM配置最佳实践
    此最佳配置仅供参考

    JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10-XX:NewRatio=2 -XX:+DisableExplicitGC"
    

    参数说明:

    file.encoding 默认文件编码

    -Xmx1024m 设置JVM最大可用内存为1024MB

    -Xms1024m 设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

    -XX:NewSize 设置年轻代大小

    -XX:MaxNewSize 设置最大的年轻代大小

    -XX:PermSize 设置永久代大小

    -XX:MaxPermSize 设置最大永久代大小

    -XX:NewRatio=4 设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5

    -XX:MaxTenuringThreshold=0 设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

    -XX:+DisableExplicitGC 这个将会忽略手动调用GC的代码使得System.gc()的调用就会变成一个空调用,完全不会触发任何GC。

    总结
    通过上述的测试,可以总结出,对tomcat性能优化就是需要不断的进行调整参数,然后测试结果,可能会调优也可能会调差,这时就需要借助于gc的可视化工具来看gc的情况。再帮我我们做出决策应该调整哪些参数。

    再次重申本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。

    原文链接:https://blog.csdn.net/thinkwon/article/details/102744033

    展开全文
  • 授人以鱼不如授人以渔本博客的目的不在于给出最佳配置,而是...最好是测试使用率最高并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。目的通过Tomcat性能优化可以提高网站的并发...

    授人以鱼不如授人以渔

    本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。

    目的

    通过Tomcat性能优化可以提高网站的并发能力。

    Tomcat服务器在JavaEE项目中使用率非常高,所以在生产环境对Tomcat的优化也变得非常重要了。

    对于Tomcat的优化,主要是从2个方面入手,一是Tomcat自身的配置,另一个是Tomcat所运行的jvm虚拟机的调优。

    服务器资源

    服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。硬件我们不说了,这个方面是钱越多越好是吧。

    Tomcat配置优化

    Linux环境安装运行Tomcat8

    具体的安装步骤可以参考Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项

    如果需要登录系统,必须配置tomcat用户,在安装完Tomcat后,进行如下操作

    /conf/tomcat-users.xml文件中的标签里面添加如下内容

    如果是tomcat7,配置了tomcat用户就可以登录系统了,但是tomcat8中不行,还需要修改另一个配置文件,否则访问不了,提示403,打开webapps/manager/META-INF/context.xml文件

    <?xml version="1.0" encoding="UTF-8"?>

    打开浏览器进行访问10.172.0.202:8080

    0dd915d96753ddf2155dc783b4ce1473.png

    点击“Server Status”,输入用户名、密码进行登录,tomcat/tomcat

    5eb30d1330fbbafcadc1aadfb0ba79e3.png

    登录之后可以看到服务器状态等信息,主要包括服务器信息,JVM,ajp和http信息

    9cfe245b8b6067d11f7102d610759c82.png

    AJP连接

    在服务状态页面中可以看到,默认状态下会启用AJP服务,并且占用8009端口。

    af6686257fa3e1612277ecdeee745365.png

    什么是AJP

    AJP(Apache JServer Protocol)
    AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。

    61017250e7520d4074c16da1ebc2f130.png

    我们一般是使用Nginx+Tomcat的架构,所以用不着AJP协议,把AJP连接器禁用。

    修改conf下的server.xml文件,将AJP服务禁用掉即可。

    edf343d2f02e05184a0b4996365876b4.png

    重启tomcat,查看效果。可以看到AJP服务已经不存在了。

    d4b62b0c52afd78b44298093159b5f50.png

    执行器(线程池)

    在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。

    修改server.xml文件:

    maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/>connectionTimeout="20000"redirectPort="8443" />

    保存退出,重启tomcat,查看效果。

    c4d161ae1dd404237a3bf9622e9e9fb2.png

    在页面中显示最大线程数为-1,这个是正常的,仅仅是显示的问题,实际使用的是指定的值。如果配置了一个Executor,则该属性的任何值将被正确记录,但是它将被显示为-1

    3种运行模式

    tomcat的运行模式有3种:

    bio
    性能非常低下,没有经过任何优化处理和支持

    nio
    nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8默认使用nio运行模式

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

    对于每种协议,Tomcat都提供了对应的I/O方式的实现,而且Tomcat官方还提供了在每种协议下每种I/O实现方案的差异, HTTP协议下的处理方式如下表,详情可查看Tomcat官网说明

    68128c11cafdae88ab50dbbe2422fb42.png

    推荐使用nio,在tomcat8中有最新的nio2,速度更快,建议使用nio2

    设置nio2:

    connectionTimeout="20000"redirectPort="8443" />

    9d48a00c6a2883ff115628234d8daa7f.png

    可以看到已经设置为nio2了。

    部署测试用的web项目

    为了方便测试性能,我们将部署一个java web项目,这个项目本身和本博客没有什么关系,仅仅用于测试。

    注意:这里在测试时,我们使用一个新的tomcat,进行测试,后面再对其进行优化调整,再测试。

    查看服务器信息

    说明一下我的测试服务器配置,不同的服务器配置对Tomcat的性能会有所影响。

    a7a89f7ec9666e6be8d44f4ec92e9867.png

    CentOS7服务器环境信息查看命令

    查看Linux版本

    查看Linux版本:cat /etc/centos-release

    查看CPU个数

    查看逻辑cpu个数:cat /proc/cpuinfo | grep “processor” | wc -l

    查看物理cpu个数:cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l

    查看每个物理cpu的核数cores:cat /proc/cpuinfo | grep “cpu cores”

    如果所有物理cpu的cores个数加起来小于逻辑cpu的个数,则该cpu使用了超线程技术。查看每个物理cpu中逻辑cpu的个数:cat /proc/cpuinfo | grep “siblings”

    查看内存使用情况

    查看内存占用情况:free -m

    参数说明

    Mem:内存的使用情况总览表。

    total:机器总的物理内存 单位为:M

    used:用掉的内存。

    free:空闲的物理内存。

    [root@localhost ~]# cat /etc/centos-releaseCentOS Linux release 7.2.1511 (Core)[root@localhost ~]# cat /proc/cpuinfo | grep "processor" | wc -l4[root@localhost ~]# cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l4[root@localhost ~]# cat /proc/cpuinfo | grep "cpu cores"cpu cores       : 1cpu cores       : 1cpu cores       : 1cpu cores       : 1[root@localhost ~]# free -m              total        used        free      shared  buff/cache   availableMem:           7825         850        6241           9         733        6714Swap:          8063           0        8063

    部署web应用

    上传war包到linux服务器,然后进行部署

    我的web应用的名字叫tomcat-optimization,主要是提供了一个查询用户列表的接口,该接口会去阿里云数据库查询用户列表,没有任务业务逻辑的处理

    # 删除tomcat的/webapps/ROOT目录的所有文件cd /webapps/ROOTrm -rf *# 上传war包到tomcat的/webapps/ROOT,然后解压jar -xvf tomcat-optimization.warrm -rf tomcat-optimization.war# 进入tomcat的/bin目录重启tomcatcd /bin./shutdown.sh./startup.sh

    访问接口地址:http://10.172.0.202:8080/user/listUser

    [{"id": 1,"account": "lilei","password": "123456","userName": "李雷","gender": 1,"age": 15,"birthday": "2001-01-01 01:01:38","createTime": "2016-03-01 19:09:55"}, {"id": 2,"account": "hanmeimei","password": "123456","userName": "韩梅梅","gender": 0,"age": 14,"birthday": "2002-01-01 01:01:38","createTime": "2016-03-01 19:09:55"}, {"id": 3,"account": "lucy","password": "123456","userName": "露西","gender": 0,"age": 13,"birthday": "2003-01-01 01:01:38","createTime": "2016-03-01 19:09:55"}]

    使用Apache JMeter进行性能测试

    Apache JMeter是Apache组织开发的基于Java的压力测试工具。我们借助于此工具进行测试,将测试出tomcat的吞吐量等信息。

    下载安装

    下载地址:http://jmeter.apache.org/download_jmeter.cgi

    a1df92a8b7b4ecd61c350b55d22f2d65.png

    注意:这里需要先安装好jdk8及其以上版本的环境,可以参考JDK安装与环境变量配置

    直接将下载好的zip压缩包进行解压即可。

    547e65bbed01ce53d1e563dbfca8bbef.png

    进入bin目录,找到jmeter.bat文件,双机打开即可启动。

    7efda9e572583d11af09648a5e734ce5.png

    JMeter启动页面

    f089f6fcf6de7eaf087cf96406239b41.png

    JMeter主页面

    4a711f03b1161109b6e7e760e6778f30.png

    修改语言

    默认的主题是黑色风格的主题并且语言是英语,这样不太方便使用,所以需要修改下语言。

    设置语言为简体中文。

    2fa62a6f1a7b2be944aa7965febf5f4b.png

    修改语言完成的界面

    e33d7b1bbea6bb4b3290f0b55e9fe0df.png

    创建接口的测试用例

    测试接口之前需要调整Windows环境配置,不然会报如下错误

    JMeter java.net.BindException: Address already in use: connect

    出现原因
    TCP/IP连接数不够或TIME_WAIT中存在很多链接,导致吞吐量低。

    解决方案
    从问题的原因分析,有两种解决方案,一是增加预留给TCP/IP服务的临时端口的数量,二是加快被占用端口的释放速度。

    解决办法
    1、打开注册表:regedit
    2、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters
    3、新建 DWORD值,name:TCPTimedWaitDelay,value:30(十进制) –> 设置为30秒,默认是240秒
    4、新建 DWORD值,name:MaxUserPort,value:65534(十进制) –> 设置最大连接数65534
    5、重启系统

    第一步:设置测试计划的名称

    9bd0e32ba5052efe308f86c084257d0d.png

    第二步:添加线程组,使用线程模拟用户的并发

    45b42a1430f10283f59f01c10585956e.png

    bf10efa4a7e4ba1fe86c0e43370de33c.png

    1000个线程,每个线程循环10次,也就是tomcat会接收到10000个请求。

    第三步:添加http请求

    c4277d78dc5e8358fbbb1b7980053292.png

    设置http请求

    6d218a63607bafad7bdba31fbe6222d1.png

    第四步:添加请求监控

    a6c58548de91216d59e32d224e71491b.png

    启动与进行接口测试

    a103b5b2b85e81d5a2dee2ccec12bde6.png

    查看测试报告

    在聚合报告中,重点看吞吐量。

    5b6933376bbbb45ddeecb5524e5ac5ca.png

    调整Tomcat参数进行优化

    通过上面测试可以看出,tomcat在不做任何调整时,吞吐量为697次/秒。这个吞吐量跟接口的业务逻辑关系很大,如果业务逻辑复杂,需要比较长时间计算的,可能吞吐量只有几十次/秒,我这里测试的时候没有添加任务业务逻辑,才会出现吞吐量为697次/秒的情况。这里的吞吐量最好是经过多次测试取平均值,因为单次测试具有一定的随机性

    禁用AJP连接

    修改conf下的server.xml文件,将AJP服务禁用掉即可。

    edf343d2f02e05184a0b4996365876b4.png

    97c86ac5a3ef0315e3f6e10c63abc020.png

    这里经过9次测试,测试结果如下704 730 736 728 730 727 714 708 735 平均是723

    可以看到,禁用AJP服务后,吞吐量会有所提升。

    当然了,测试不一定准确,需要多测试几次才能看出是否有提升。

    设置线程池

    通过设置线程池,调整线程池相关的参数进行测试tomcat的性能。有关线程池更多更详细的配置参考Tomcat官网提供的配置详解

    最大线程数为150,初始为4

    maxThreads="150" minSpareThreads="4" prestartminSpareThreads="true"/>connectionTimeout="20000"redirectPort="8443" />

    a443e7ffe49712f9a705c285e9091750.png

    经过9次测试,测试结果如下705 725 702 729 733 738 735 728 平均是724

    最大线程数为500,初始为50

    maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"/>connectionTimeout="20000"redirectPort="8443" />

    测试结果:733 724 718 728 734 721 720 723 平均725

    吞吐量为725次/秒,性能有所提升。

    最大线程数为1000,初始为200

    maxThreads="1000" minSpareThreads="200" prestartminSpareThreads="true"/>connectionTimeout="20000"redirectPort="8443" />

    吞吐量为732,性能有所提升。

    测试结果 737 729 730 738 735 726 725 740 平均732

    最大线程数为5000,初始为1000

    是否是线程数最多,速度越快呢?我们来测试下。

    maxThreads="5000" minSpareThreads="1000" prestartminSpareThreads="true"/>connectionTimeout="20000"redirectPort="8443" />

    测试结果 727 733 728 725 738 729 737 735 739 平均732

    可以看到,虽然最大线程已经设置到5000,但是实际测试效果并不理想,并且平均的响应时间也边长了,所以单纯靠提升线程数量是不能一直得到性能提升的。

    设置最大等待队列数

    默认情况下,请求发送到tomcat,如果tomcat正忙,那么该请求会一直等待。这样虽然可以保证每个请求都能请求到,但是请求时间就会边长。

    有些时候,我们也不一定要求请求一定等待,可以设置最大等待队列大小,如果超过就不等待了。这样虽然有些请求是失败的,但是请求时间会虽短。典型的应用:12306。

    maxThreads="500" minSpareThreads="100" prestartminSpareThreads="true" maxQueueSize="100"/>connectionTimeout="20000"redirectPort="8443" />

    30f98aa07cb0fb58832eb110521b9e2a.png

    测试结果:

    • 平均响应时间:0.438秒,响应时间明显缩短

    • 错误率:43.07%,错误率超过40%,也可以理解,最大线程为500,测试的并发为1000

    • 吞吐量:1359次/秒,吞吐量明显提升

    结论:响应时间、吞吐量这2个指标需要找到平衡才能达到更好的性能。

    设置nio2的运行模式

    将最大线程设置为500进行测试:

    maxThreads="500" minSpareThreads="100" prestartminSpareThreads="true"/>connectionTimeout="20000"redirectPort="8443" />

    从测试结果可以看到,平均响应时间有缩短,吞吐量有提升,可以得出结论:nio2的性能要高于nio。

    参数说明与最佳实践

    具体参数参考官网说明

    执行器参数说明(加粗是重点)

    de4d30653e9684a9319fcea86063194e.png

    执行器最佳实践

    此最佳配置仅供参考

    maxThreads="800" minSpareThreads="100" maxQueueSize="100"                                 prestartminSpareThreads="true"/>

    连接器参数说明

    可以看到除了这几个基本配置外并无特殊功能,所以我们需要对 Connector 进行扩展。

    其中Connector 支持参数属性可以参考Tomcat官方网站,本文就只介绍些常用的。

    通用属性(加粗是重点)

    1ae75e5572572e866ad204e7cee9a903.png

    302c5b075e84eafc9c008aff39d04b07.png

    2f2fc4357e212caa724c606da41552b2.png

    标准实现(加粗是重点)

    除了上面列出的常见的连接器属性,标准的HTTP连接器(BIO,NIO和APR/native)都支持以下属性。

    1b63b556f2a3611a5e85a02ac0a64210.png

    be18ea32a0f10e16a4132cd4649fc718.png

    afc518c5408ec5bc5722f9100db4c658.png

    28128eacdd45cf7dc9cfece60867d176.png

    连接器最佳实践

    此最佳配置仅供参考

    connectionTimeout="20000" redirectPort="8443"enableLookups="false" maxPostSize="10485760" URIEncoding="UTF-8"                       acceptCount="100" acceptorThreadCount="2" disableUploadTimeout="true"                    maxConnections="10000" SSLEnabled="false"/>

    调整JVM参数进行优化

    接下来,通过设置jvm参数进行优化,为了测试一致性,依然将最大线程数设置为500,启用nio2运行模式

    设置并行垃圾回收器

    在/bin/catalina.sh文件第一行添加如下参数,gc日志输出到/logs/gc.log

    #年轻代、老年代均使用并行收集器,初始堆内存64M,最大堆内存512MJAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

    6145fcb239fe9c9b4fef9fbedc51e4a6.png

    测试结果与默认的JVM参数结果接近。

    查看gc日志文件

    将gc.log文件上传到gceasy.io查看gc中是否存在问题。上传文件后需要等待一段时间,需要耐心等待。

    53412e72d09a44dd9b7ead0b0cc52cdf.png

    问题一:系统所消耗的时间大于用户时间

    c674ecae9393169818c1f5b3de5966b5.png

    如果在报告中显示System Time greater than User Time,系统所消耗的时间大于用户时间,这反应出的服务器的性能存在瓶颈,调度CPU等资源所消耗的时间要长一些。

    问题二:线程暂停时间有点长

    2b7383b3f806d41a6d7c1a766d18ed11.png

    可以关键指标中可以看出,吞吐量表现不错,但是gc时,线程的暂停时间稍有点长。

    问题三:GC总次数过多

    be29ec3e321f13840277235ff372cd1c.png

    通过GC的统计可以看出:

    • 年轻代的gc有100次,次数有点多,说明年轻代设置的大小不合适,需要调整

    • FullGC有7次,说明堆内存的大小不合适,需要调整

    问题四:年轻代内存不足导致GC

    8538fcd0e0ec6c6bbe9e8d9d5ebe954d.png

    从GC原因的可以看出,年轻代大小设置不合理,导致了多次GC。

    调整年轻代大小

    调整jvm配置参数

    JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms128m -Xmx1024m -XX:NewSize=64m -XX:MaxNewSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

    将初始堆大小设置为128m,最大为1024m,初始年轻代大小64m,年轻代最大256m

    0f4256a2018c98fec558affb20f0c05d.png

    从测试结果来看,吞吐量以及响应时间均有提升。

    查看gc日志

    173c6090fa81cd41b49ba9b319a8f9a5.png

    可以看到GC次数要明显减少,说明调整是有效的。

    039958baf7da6a4b65fe9ba67e8b59cb.png

    GC次数有所减少

    ef1362ec7e742f6e16a3813d646046b7.png

    设置G1垃圾回收器

    #设置了最大停顿时间100毫秒,初始堆内存128m,最大堆内存1024mJAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"

    测试结果

    caa0a741694b2b70c5eaa71266e3a66a.png

    可以看到,吞吐量有所提升,评价响应时间也有所缩短。

    a1c958e0172216b1b99228b7f94f66b6.png

    G1集合阶段统计

    af84d863dcbbf0e512a364b3441ac4e3.png

    JVM配置最佳实践

    此最佳配置仅供参考

    JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10-XX:NewRatio=2 -XX:+DisableExplicitGC"

    参数说明

    file.encoding 默认文件编码

    -Xmx1024m 设置JVM最大可用内存为1024MB

    -Xms1024m 设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

    -XX:NewSize 设置年轻代大小

    -XX:MaxNewSize 设置最大的年轻代大小

    -XX:PermSize 设置永久代大小

    -XX:MaxPermSize 设置最大永久代大小

    -XX:NewRatio=4 设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5

    -XX:MaxTenuringThreshold=0 设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

    -XX:+DisableExplicitGC 这个将会忽略手动调用GC的代码使得System.gc()的调用就会变成一个空调用,完全不会触发任何GC。

    总结

    通过上述的测试,可以总结出,对tomcat性能优化就是需要不断的进行调整参数,然后测试结果,可能会调优也可能会调差,这时就需要借助于gc的可视化工具来看gc的情况。再帮我我们做出决策应该调整哪些参数。

    再次重申本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数

    原文链接:

    https://thinkwon.blog.csdn.net/article/details/102744033

    展开全文
  • Tomcat8性能优化

    2019-10-28 11:48:00
    而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高并发最大,...
  • 而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高并发最大,...
  • 最强Tomcat8性能优化

    2020-10-10 09:08:33
    而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高并发最大,...
  • 而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高并发最大,...
  • 在线2000的tomcat

    2009-09-28 09:57:48
    在线用户离散1000-2000,数据库并发最高:500,每用户离散5秒-10分钟一次数据库操作,操作主要以Insert和Select为主,离散传输数据:0.5K-10K。WEB容器:tomcat5.5 若服务器不采用分布式,数据库和容器在一台机器...
  • 最近看了nginx以及tomcat的集群,通俗的做一下简单总结吧 nginx 是一个http服务器,是由俄罗斯人...单个tomcat最大支持的用户并发量默认是150,在测试过程中250左右开始会有性能的问题 举个栗子,有3台tomcat,...
  • 1. Tomcat介绍及配置 1.1 Tomcat介绍 [外链图片转存失败,源...单体的Tomcat一般支持200个并发量(常规的硬件),最高可支持500个并发(硬件要求比较高) 1.2 Tomcat安装与配置 直接到Tomcat官网目下进行下载【下载完成
  • 一. Apache服务器特点介绍 ...a、主要用于解析静态文本,并发性能高,侧重于HTTP服务;...d、是目前全球用户使用量最高的Web服务器。 二.Tomcat服务器特点介绍 Tomcat是由Java开发且符合JavaEE的Servlet规范
  • 首先要知道一个tomcat最多可以支持200~300的并发访问量,并发就是指某个时刻很多用户同时访问这个网站,例如一个电商网站访问量的高峰期一般在晚上,高的有上百上千万的并发量,这就叫高并发,设计网站架构的时候就...
  • 而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,...
  • 大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。这几个解决思路在一定程度上意味...
  • web服务器:apache (静态并发量最高2000) nginx tengine IIS 端口 全部为80! 中间件web容器: php: php-fpm(php端口9000) java: (tomcat端口8080。并发量到150就不行了)、jboss python: uwsgi(默认端口5000) .....
  • 静态服务之Apache

    2020-10-27 16:32:44
    静态服务之Apache与wiki部署 世上最重要的事,不在于我们...静态并发量最高2000) nginx tengine IIS 端口 全部为80!https为443端口 web中间件、web容器: php: php-fpm(php端口9000) java: (tomcat端口8080。并发量
  • Nginx

    2020-09-24 14:08:46
    tomcat的默认最大并发量是150; Nginx最高承受50,000以上的并发; 使用docker进行快速安装 1.docker-compose安装,需要先安装docker-compose再执行 docker-compose up -d yml文件信息如下: version: '3.1' ...
  • 如果并发量高于5w, 那么一台nginx扛不住 1. 通过划分域名, 分流主站的流量 down.qq.com 由down服务器集群去承担down业务的流量 games.qq.com 由games服务器集群去承担games业务的流量 2. 如果games.qq.com流量...
  • nginx 高并发,轻级别 tomcat 实质是容器(web容器、servlet容器、JS容器)资源占用少,灵活 IIS 微软万维网服务 二 Apache简介 开放源代码、跨平台应用 支持多种网页编程语言 模块化设计、运行稳定、良好的安全...
  • React学习笔记_利用cors实现ajax跨域_Tomcat 获取跨域Authorization React学习笔记_ReactRedux应用使用AsyncAwait React学习笔记_动态注入reducer React学习笔记_export和import总结 React学习笔记_安装...
  • 最全Hibernate 参考文档

    2018-08-29 09:51:51
    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

tomcat最高并发量