tomcat的配置和优化

tomcat的内存使用配置,最大连接数配置。
 
如何修改配置呢,在/tomcat的/bin/下面有个脚本文件catailna.sh。 如果 windows 是bat设置tomcat的使用内存,其实就是设置jvm的使用参数。
 
一.Tomcat内存优化
 
Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OPTS 参数。
 
1.JAVA_OPTS参数说明
 
Java代码
-server 启用jdk 的 server 版;
-Xms java虚拟机初始化时的最小内存;
-Xmx java虚拟机可使用的最大内存;
-XX:PermSize 内存永久保留区域
-XX:MaxPermSize 内存最大永久保留区域
设置Tomcat启动的初始内存,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项,要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。

 

-Xms:初始值 【初始化内存大小】
-Xmx:最大值 【可以使用的最大内存】
-Xmn:最小值
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
 
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
 
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。 这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用 程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始 化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数 据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因 此一般建议堆的最大值设置为可用内存的最大值的80%。
  • 如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。
  • 在重启你的Tomcat服务器之后,这些配置的更改才会有效。
Windows在文件{tomcathome}/bin/catalina.bat,Unix在文件{tomcathome}/bin/catalina.sh的前面,增加如下设置:
服务器参数配置
tomcat默认: -Xms1024m -Xmx1024m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m
Java_OPTS参数
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8
-server -Xms2048m -Xmx2048m
-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m
-XX:MaxPermSize=512m -XX:+DisableExplicitGC"
配置完成后可重启Tomcat ,通过以下命令进行查看配置是否生效:
 
1.首先查看Tomcat 进程号:
ps -ef | grep tomcat
我们可以看到Tomcat 进程号是 9217 
 
1.查看是否配置生效:
sudo jmap –heap 9217
我们可以看到MaxHeapSize 等参数已经生效。

 

二.Tomcat并发优化

 
1.Tomcat连接相关参数
 
在Tomcat配置文件conf下面 server.xml 中的配置中和连接数相关的参数有:

 

minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75
acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100
enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
1.参数说明 
默认的tomcat 参数:
<Connector port=“8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
修改:
<Connector port=“8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="600"
minSpareThreads="100"
maxSpareThreads="500"
acceptCount="700"
connectionTimeout="20000"
redirectPort="8443" />
这样设置以后,基本上没有再当机过。
protocol="org.apache.coyote.http11.Http11NioProtocol" ///使用java的异步io护理技术,no blocking IO
maxThreads=“600" 表示最多同时处理600个连接 ///最大线程数
minSpareThreads=“100" 表示即使没有人使用也开这么多空线程等待 ///初始化时创建的线程数
maxSpareThreads=“500" 表示如果最多可以空500个线程,例如某时刻有505人访问,之后没有人访问了,则tomcat不会保留505个空线程,而是关闭505个空的。 ///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
acceptCount="700"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
这里是http connector的优化,如果使用apache和tomcat做集群的负载均衡,并且使用ajp协议做apache和tomcat的协议转发,那么还需要优化ajp connector。
<Connector port="8009" protocol="AJP/1.3" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700" connectionTimeout="20000" redirectPort="8443" />
 
解决常遇到的一些报错
一、Tomcat的JVM提示内存溢出
查看%TOMCAT_HOME%\logs文件夹下,日志文件是否有内存溢出错误
 
二、修改Tomcat的JVM
1、错误提示:java.lang.OutOfMemoryError: Java heap space
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误,Out of Memory(系统内存不足)的异常,从而导致客户端显示500错误,一般调整Tomcat的使用内存即可解决此问题。
windows环境下修改
“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:JAVA_OPTS=-Xms2048m -Xmx2048m
Linux环境下修改
“%TOMCAT_HOME%\bin\catalina.sh”文件,在文件开头增加如下设置:JAVA_OPTS=-Xms2048m -Xmx2048m
其中,-Xms设置初始化内存大小,-Xmx设置可以使用的最大内存。
跟我上面那么设置就可以了。
 
2、错误提示:java.lang.OutOfMemoryError: PermGen space
原因:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存
放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:
在catalina.bat的第一行增加:
set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m - XX:MaxPermSize=256m
在catalina.sh的第一行增加:
JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m XX:MaxPermSize=256m
三、查看Tomcat的JVM内存
  1. Tomcat6中没有设置任何默认用户,因而需要手动往Tomcat6的conf文件夹下的tomcat-users.xml文件中添加用户。 如:
    <role rolename="manager"/>
    <user username="tomcat" password="tomcat" roles="manager"/>
注:添加完需要重启Tomcat6。
 
 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
在平时使用Apache、Nginx或者是其他的提供相关Web服务软件中都有相应的性能模块调优修改,而在Tomcat中也有相应的性能调优修改的配置,在这里就简单的说一说比较常用的几个Tomcat中的性能调优配置参数,在Tomcat中调优参数可以分为2个部分:1、在 Tomcat中的二进制文件夹bin目录下的catalina.sh或catalina.bat中添加修改配置tomcat使用运行参数;2、在Tomcat的conf文件夹中配置修改server.xml中的容器。
   一、tomcat使用运行参数catalina.sh调优
修改catalina.sh脚本,添加修改一下JAVA_OPTS变量参数:
 
1
2
3
4
JAVA_OPTS="$JAVA_OPTS -Xms3072m -Xmx3072m -Xmn1536m\
-XX:PermSize=384m -XX:MaxPermSize=384m -XX:+UseConcMarkSweepGC\
-XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=500\
-XX:+CMSClassUnloadingEnabled -XX:+CMSClassUnloadingEnabled -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
 
-server:tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的性能更优
-Xms–Xmx:JVM内存设置,JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
 空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制,建议把最大和最小设置成一样有利于JVM的垃圾回收机制
–Xmn:设置新生代,整个堆大小=新生代大小 + 年老代大小 + 持久代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
-XX:每当JDK版本升级时,你的JVM都会使用最新加入的优化技术
-XX:PermSize:设置非堆内存初始值,默认是物理内存的1/64
-XX:MaxPermSize:设置永生代内存初始大小,即最大非堆内存的大小,默认是物理内存的1/4
-XX:+UseConcMarkSweepGC:CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发
-XX:+UseCMSCompactAtFullCollection:在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少
-XX:+UseParNewGC:对新生代采用多线程并行回收,这样收得快
-XX:+CMSClassUnloadingEnabled:CMS收集器默认不会对永久代进行垃圾回收
-XX:CMSMaxAbortablePrecleanTime:CMS GC需要经过较多步骤才能完成一次GC的动作,在minor GC较为频繁的情况下,很有可能造成CMS GC尚未完成,从而造成concurrent mode failure,可以通过-XX: CMSMaxAbortablePrecleanTime设置较小的值,以保证CMS GC尽快完成对象的回收,避免concurrent mode failure的现象,尤其是在JDK 5.0+、6.0+的有些版本在CMS-concurrent-abortable-preclean-start和CMS-concurrent-abortable-preclean这两步间有可能会耗费很长的时间,导致可回收的旧生代的对象很长时间后才被回收,这是Sun JDK CMS GC的一个bug
   二、Tomcat的server.xml配置文件
在Tomcat中的常用配置性能调优配置如下:
 
1
2
3
4
5
   <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="15000" maxThreads="1000" minSpareThreads="100"
               maxProcessors="1200" acceptCount="1000"
               enableLookups="false" compression="on"
               redirectPort="8443" />
 
connectionTimeout:超时时间,单位毫秒,默认值为60000,即60秒
maxThreads:tomcat:起动的最大线程数,默认值为200
minSpareThreads:Tomcat初始化时创建的线程数。默认值4
maxProcessors:Tomcat运行时允许创建的最大线程数,默认值为75,一般根据实际生产环境修改
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100,web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右,通常该值设置同maxThreads一样
enableLookups:是否反查域名,默认值为true。为了提高处理能力,应设置为false
compression:压缩传输,取值on/off/force,默认值off
redirectPort:SSL的重定向端口,默认8443
   总之,在平时需要根据实际生产情况修改,在Tomcat合理的性能调优后,会对Tomcat的总体性能会极大的提升
posted @ 2017-10-15 14:54  幽灵鸟  阅读(258)  评论(0编辑  收藏  举报