tomcat调优

tomcat调优

一般tomcat1.7默认都是bio模式,性能非常低,没有经过任何优化处理和支持,一个线程一个请求。缺点:并发量高时,线程数较多,浪费系统资源

而1.4之后支持NIO模式,比传统I/O操作(bio)更好的并发运行性能。利用Java的异步IO处理,可以通过少量的线程处理大量的请求

步骤:

1.安装APR

下载 apr-1.5.2.tar:http://archive.apache.org/dist/apr/apr-1.7.0.tar.gz ,这个版本亲测比较好点

yum -y install autoconf // 安装autoconf

yum -y install libtool // 安装libtool

yum -y install openssl openssl-devel // 安装openssl

tar xvzf apr-1.7.0.tar.gz // 解压apr-1.7.0.tar.gz

cd apr-1.7.0

./configure --prefix=/usr/apr // 指定安装到/usr/apr目录

这一步可能报错rm: cannot remove 'libtoolT': No such file or directory

打开configure文件

找到RM='$RM'修改为RM='$RM -f' 即可 这个文件内容很多,可以下载到本地查找更改后替换

make

make install

cd /usr/tomcat/apache-tomcat-7.0.59/bin // 切换目录,在tomcat/bin目录下找到tomcat-native.tar.gz;

tar xvzf tomcat-native.tar.gz // 解压tomcat-native.tar.gz

cd /usr/tomcat/apache-tomcat-7.0.59/bin/tomcat-native-1.1.32-src/jni/native // 切换目录

./configure --with-apr=/usr/apr --with-java-home=/usr/java/jdk1.7.0_72 --with-ssl=/usr/bin --prefix=/usr/apr // 指定之前安装的目录

make

make install

修改环境变量

vi /etc/profile

在最后增加
export LD_LIBRARY_PATH=/usr/apr/lib
source /etc/profile // 使配置生效

tomcat server.xml文件中修改

<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"

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

开启nio模式,重启

完成,网上有的说1.8不需配置默认支持,但是并没有,。。。有时间可以再尝试下

2.线程池开启

tomcat server.xml文件中

把Executor节点注释打开,同时在Connector中添加executor=Executor的name

在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能;线程池有很多参数可以配置调优,可以去了解下,以下只解释几个核心参数:

 

maxThreads,

最大线程数,tomcat能创建来处理请求的最大线程数

 

maxSpareTHreads,

最大空闲线程数,在最大空闲时间内活跃过,但现在处于空闲,若空闲时间大于最大空闲时间,则回收,小于则继续存活,等待被调度。

 

minSpareTHreads

最小空闲线程数,无论如何都会存活的最小线程数

 

acceptCount

最大等待队列数 ,请求并发大于tomcat线程池的处理能力,则被放入等待队列等待被处理。

 

maxIdleTime

最大空闲时间,超过这个空闲时间,且线程数大于最小空闲数的,都会被回收   

3.连接器

实际就是对 Connector 进行扩展

<Connector port="8080"protocol="HTTP/1.1" 

          connectionTimeout="20000" 

          redirectPort="8443" /> 

这是网上找的一个配置可以参考下,具体参数可以去了解下;

URIEncoding=”UTF-8”

使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞个mod_encoding,还要手工编译

maxSpareThreads

maxSpareThreads 的意思就是如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。

minSpareThreads

最小备用线程数,tomcat启动时的初始化的线程数。

enableLookups

这个功效和Apache中的HostnameLookups一样,设为关闭。

 connectionTimeout

connectionTimeout为网络连接超时时间毫秒数。

 maxThreads

maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。

 acceptCount

acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection

maxProcessors与minProcessors

在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最 大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。

通常Windows是1000个左右,Linux是2000个左右。

还有许多其他的参数不一一详解,可以主动去了解下
 

4.禁用APJ连接

AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接;我们是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用

5.jvm调优

堆栈概念:jvm内存分配

Tomcat 的启动参数位于tomcat的安装目录\bin目录下catalina.sh文件(Windows下catalina.bat)。

在文件结尾换行加入参数

export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

参数解读:

-server:

tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcat以 server模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量
-Xms–Xmx:

JVM内存设置,把Xms与Xmx两个值设成一样是最优的做法,在设这个最大内存即Xmx值时需先测试

在这里插入图片描述

出现jdk版本说明参数可用,否则

在这里插入图片描述

–Xmn

设置年轻代大小为512m。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8,大小可以根据自己系统实际使用情况配置,但注意符合设置规则

-Xss

设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,否则容易导致OOM。

XX:+AggressiveOpts

作用如其名(aggressive),启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话)

XX:+UseBiasedLocking

看到lock这个关键字就知道跟锁有关,启用一个线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。

 -XX:PermSize=128M-XX:MaxPermSize=256M

 

JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;

 

在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。

 

由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

 

那么,如果是物理内存4GB,那么64分之一就是64MB,这就是PermSize默认值,也就是永生代内存初始大小;

 

四分之一是1024MB,这就是MaxPermSize默认大小。
-XX:+DisableExplicitGC

在 程序代码中不允许有显示的调用”System.gc()”,这样会导致系统响应时间严重降低;

-XX:+UseParNewGC

对年轻代采用多线程并行回收

-XX:+UseConcMarkSweepGC

使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒

-XX:MaxTenuringThreshold

设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一 个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。这里需要大家去了解下新生代、老年代的具体概念结合自己系统的使用配置。

-XX:+CMSParallelRemarkEnabled

使用UseParNewGC 的情况下, 尽量减少 mark 的时间

-XX:+UseCMSCompactAtFullCollection

在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。

-XX:LargePageSizeInBytes

指定 Java heap的分页页面大小

-XX:+UseFastAccessorMethods

get,set 方法转成本地代码

-XX:+UseCMSInitiatingOccupancyOnly

只有在 oldgeneration 在使用了初始化的比例后concurrent collector 启动收集

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值