TOMCAT优化,提高并发能力

很多时候,明明自己的服务器配置很高,可是在高并发时的性能并不好,这个时候就要考虑是不是TOMCAT服务器的

性能限制了并发,如果你还在烦恼服务器的性能低下,时不时的报连接失败connection refused。那就请往下看,客官您请:

.tomcat的server.xml的默认最大连接数是200,即maxThreads="200",请求等待连接数为100,即acceptCount="100"。

这两个值如何起作用,请看下面三种情况

情况1:接受一个请求,此时tomcat起动的线程数没有到达maxThreads,tomcat会起动一个线程来处理此请求。

情况2:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,tomcat会把此请求放入等待队列,等待空闲线程。

情况3:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,等待队列中的请求个数也达到了acceptCount,此时tomcat会直接拒绝此次请求,返回connection refused

一般的服务器操作都包括量方面:1计算(主要消耗cpu),2等待(io、数据库等)

第一种极端情况,如果我们的操作是纯粹的计算,那么系统响应时间的主要限制就是cpu的运算能力,此时maxThreads应该尽量设的小,降低同一时间内争抢cpu的线程个数,可以提高计算效率,提高系统的整体处理能力。

第二种极端情况,如果我们的操作纯粹是IO或者数据库,那么响应时间的主要限制就变为等待外部资源,此时maxThreads应该尽量设的大,这样才能提高同时处理请求的个数,从而提高系统整体的处理能力。此情况下因为tomcat同时处理的请求量会比较大,所以需要关注一下tomcat的虚拟机内存设置和linux的open file限制。

1.1 . 首先我们将tomcat的线程池打开:<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="250"/>将这串代码取消注释,一般网站的单台服务器并发线程最好控制在500左右,通过负载均衡去缓解单台服务器压力,所以不需要设太高,当然自己测试的你可以设置1000,来提高性能。


在如图添加executor="tomcatThreadPool"来启用线程池。acceptCount就设为默认值,想要更高并发的可以将acceptCount设为和maxThreads设为相同值。

2.  可能有的同学看到我的图还在疑问,图中的protocol为什么不是HTTP/1.1,表扬一下观察的很仔细,这个就是我接下来要将的点,

protocol:协议类型,可选类型有四种,分别为BIO(阻塞型IO),NIO,NIO2和APR。

        (1)BIO:BIO(Blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。BIO配置采用默认即可。

        (2)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)更好的并发运行性能。要让Tomcat以nio模式来运行也比较简单,我们只需要protocol类型修改为:

Java代码   收藏代码
  1. //NIO  
  2. protocol="org.apache.coyote.http11.Http11NioProtocol"  
  3. //NIO2  
  4. protocol="org.apache.coyote.http11.Http11Nio2Protocol"  

        即可。

        (3)APR:APR(Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。你可以简单地理解为:Tomcat将以JNI的形式调用 Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高 Tomcat对静态文件的处理性能。 

        与配置 NIO运行模式一样,也需要将对应的 Connector节点的 protocol属性值改为:

Java代码   收藏代码
  1. protocol="org.apache.coyote.http11.Http11AprProtocol"
  2. 注意:APR需要自己安装。

因此改为NIO或者APR,可以提高并发性能。

3.<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->将AJP注释了,

 

4.在tomcat中设置JVM参数

  修改bin/catalina.bat文件设置参数(注释后第一行),增加  

复制代码
  set JAVA_OPTS=-Dfile.encoding=UTF-8 
  -server 
  -Xms1024m 
  -Xmx2048m 
  -XX:NewSize=512m 
  -XX:MaxNewSize=1024m 
  -XX:PermSize=256m 
  -XX:MaxPerPermSize=356m 
  -XX:NewRatio=2 
  -XX:MaxTenuringThreshold=50 
  -XX:+DisableExplicitGC
复制代码

   -Xms:设置JVM初始内存大小(默认是物理内存的1/64)

   -Xmx:设置JVM可以使用的最大内存(默认是物理内存的1/4,建议:物理内存80%)

   -Xmn:设置JVM最小内存(128-256m就够了,一般不设置)

   默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、

-Xmx相等以避免在每次GC 后调整堆的大小。  

   在较大型的应用项目中,默认的内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误“java.lang.OutOfMemoryError:Java heap space”,从而

导致客户端显示500错误。  

  -XX:PermSize :为JVM启动时Perm的内存大小  

  -XX:MaxPermSize :为最大可占用的Perm内存大小(默认为32M) 

  -XX:MaxNewSize,默认为16M


  PermGen space的全称是Permanent Generationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到

PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的

话,就很可能出现“java.lang.OutOfMemoryError:PermGen space”错误。

对于WEB项目,jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小,为了避免调整),你可以使用更多的参数配置。如果你的WEBAPP下都用了大量的第三

方jar, 其大小超过了jvm默认的大小,那么就会产生此错误信息了。


其它参数:

  -XX:NewSize :默认为2M,此值设大可调大新对象区,减少FullGC次数

  -XX:NewRatio :改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8)

  -XX:SurvivorRatio :改变Eden对象空间和残存空间的尺寸比例,意思是Eden对象空间的尺寸比残存空间大survivorRatio+2倍(缺省值是10)

  -XX:userParNewGC 可用来设置并行收集【多CPU】

  -XX:ParallelGCThreads 可用来增加并行度【多CPU】

  -XXUseParallelGC 设置后可以使用并行清除收集器【多CPU】

5. 当你对项目进行压测时最好将响应时间控制在5秒以下,根据这个来设置tomcat的最大连接数。

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值