Tomcat配置优化手册
配置好JDK环境变量
JAVA_HOME:
在系统变量里点击新建,变量名填写JAVA_HOME,变量值填写JDK的安装路径。
CLASSPATH:
在系统变量里点击新建变量名填写CLASSPATH,变量值填写
“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar”
注意不要忘记前面的点和中间的分号。
Path:
在系统变量里找到Path变量,这是系统自带的,不用新建。双击Path,由于原来的变量值已经存在,故应在已有的变量后加上
“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”
注意前面的分号。
验证方式
在cmd中输入java –verion后能输出正确的JDK版本号信息:
打开命令窗口,检查以下命令的输出:
JAVA_HOME |
echo %JAVA_HOME% |
CLASSPATH |
echo %CLASSPATH% |
Path |
echo %Path% |
配置好Tomcat环境变量
CATALINA_BASE:
在系统变量里点击新建,变量名填写CATALINA_BASE,变量值填写TOMCAT的安装根路径。
CATALINA_HOME:
在系统变量里点击新建,变量名填写CATALINA_HOME,变量值填写TOMCAT的安装家路径。
Path:
在系统变量里找到Path变量,这是系统自带的,不用新建。双击Path,由于原来的变量值已经存在,故应在已有的变量后加上
“%CATALINA_HOME%\lib;%CATALINA_HOME%\bin”
注意前面的分号。
验证方式
打开命令窗口,检查以下命令的输出。
CATALINA_BASE |
echo %CATALINA_BASE% |
CATALINA_HOME |
echo %CATALINA_HOME% |
Path |
echo %Path% |
优化配置之前,需要配置一个Tomcat管理员账户,来登录Tomcat控制台查看各种参数。
在%CATALINA_HOME%/conf/tomcat-users.xml下添加用户:
|
启动tomcat后,登录Tomcat控制台查看信息,URL:
http://serverip:port/
TomcatConnector的三种不同的运行模式性能相差很大,这三种模式的不同之处如下:
BIO:
一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下,在Linux系统中默认使用这种方式。
NIO:
利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。
APR:
即Apache Portable Runtime,从操作系统层面解决io阻塞问题。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。Linux如果安装了apr和native,Tomcat直接启动就支持apr。
name:
共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:None;
namePrefix:
在JVM上,每个运行线程都可以有一个name 字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-;
maxThreads:
该线程池可以容纳的最大线程数。默认值:200;
minSpareThreads:
Tomcat应该始终打开的最小不活跃线程数。默认值:25。
prestartminSpareThreads:
是否在Executor启动时,就生成minSpareThreads个线程。默认为 false。
修改%CATALINA_HOME%/conf/ server.xml,开启线程池:
将Executor参数改成:
namePrefix="catalina-exec-" maxThreads="800" minSpareThreads="100" prestartminSpareThreads="true"/> |
executor:
表示使用该参数值对应的线程池;
enableLookups:
是否反查域名,取值为true 或 false 。为了提高处理能力,应设置为 false;
maxPostSize:
以POST方式传输的参数长度限制,默认为2M;
URIEncoding:
Tomcat在解析参数的时候使用的编码方式,默认不支持中文;
acceptCount:
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
acceptorThreadCount:
Tomcat接收请求的线程的数目,默认是1个;
修改%CATALINA_HOME%/conf/server.xml,将Connector的执行器设置为共享池模式:
具体如下:
connectionTimeout="20000" protocol="HTTP/1.1" redirectPort="8443" enableLookups="false" maxPostSize="10485760" URIEncoding="utf-8" acceptCount="800" acceptorThreadCount="2"/> |
登录Tomcat控制台,验证配置是否生效:
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩。
compression:
是否启动压缩功能;
compressionMinSize:
当数据大于多少KB的时候使用压缩;
noCompressionUserAgents:
哪些类型的浏览器不启用压缩;
compressableMimeType:
需要压缩的文件类型;
在%CATALINA_HOME%/conf/ server.xml下
具体如下:
connectionTimeout="20000" redirectPort="8443" enableLookups="false" maxPostSize="10485760" URIEncoding="utf-8" acceptCount="800" acceptorThreadCount="2" compression="on" compressionMinSize="50" noCompressionUserAgents="" compressableMimeType="text/html,text/xml,text/javascript,application/x-javascript,application/javascript,text/css,text/plain"/> |
通过配置日志记录的格式,取得访问日志数据,为后续的性能优化提供依据,也能为一些故障定位提供帮助:
%a |
记录访问者的IP |
%A |
记录本地服务器的IP |
%b |
发送的字节数,不包括http头,如果字节数为0的话,显示为- |
%h |
服务器名称,如果resolveHosts为false的话,就是IP地址 |
%H |
访问者使用的协议 |
%l |
访问逻辑用户名,通常返回'-' |
%m |
访问的方法 |
%q |
querystring |
%r |
请求首行 |
%s |
http的状态 |
%S |
用户的session ID |
%t |
访问时间 |
%u |
验证的访问者,否则就是"-" |
%U |
访问的URL地址 |
%D |
访问发生的时间,以毫秒记 |
%T |
访问发生的时间,以秒记 |
在%CATALINA_HOME%/conf/ server.xml中,修改Server->Service->Engine->Host下的Valve元素:
prefix="localhost_access_log." suffix=".txt" pattern="%t %a %A %h %H %S %l %u %m %U "%r" "%q" %s %b %D %T" /> |
在%CATALINA_HOME%/logs/下查看最新生成的日志的格式:
后续可以使用工具根据以上日志信息生成多个报表:
* 独立IP数统计
* 访问请求数统计
* 访问资料文件数统计
* 访问流量统计
* 访问处理响应时间统计
* 统计所有404错误页面
* 统计所有500错误的页面
* 统计访问最频繁页面
* 统计访问处理时间最久页面
* 统计并发访问频率最高的页面
关闭war自动部署unpackWARs="false" autoDeploy="false"。防止被植入木马等恶意程序。
在%CATALINA_HOME%/conf/ server.xml中,Host修改如下:
unpackWARs="false" autoDeploy="false"> |
JVM参数可分为通用参数、并行收集器参数、CMS参数等,具体如下:
参数名称 |
含义 |
默认值 |
备注 |
-Xms |
初始堆大小 |
物理内存的1/64(<1GB) |
默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. |
-Xmx |
最大堆大小 |
物理内存的1/4(<1GB) |
默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 |
-Xmn |
年轻代大小 |
|
增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 |
-XX:PermSize |
设置持久代初始值 |
物理内存的1/64 |
|
-XX:MaxPermSize |
设置持久代最大值 |
物理内存的1/4 |
|
-Xss |
每个线程的堆栈大小 |
|
JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K. |
-XX:+DisableExplicitGC |
禁用System.gc() |
|
|
-XX:SurvivorRatio |
Eden区与Survivor区的大小比值 |
|
设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10 |
-XX:+UseConcMarkSweepGC |
使用CMS内存收集 |
|
|
-XX:+UseParNewGC |
设置年轻代为并行收集 |
|
可与CMS收集同时使用 |
-XX:+CMSParallelRemarkEnabled |
降低标记停顿 |
|
|
-XX+UseCMSCompactAtFullCollection |
在FULL GC的时候, 对年老代的压缩 |
|
CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 |
-XX:CMSFullGCsBeforeCompaction |
多少次后进行内存压缩 |
|
由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生"碎片",使得运行效率降低.此值设置运行多少次GC以后对内存空间进行压缩,整理. |
-XX:+CMSClassUnloadingEnabled |
开启对永久代进行垃圾回收 |
CMS收集器默认不会对永久代进行垃圾回收。 |
|
-XX:LargePageSizeInBytes |
内存页的大小不可设置过大, 会影响Perm的大小 |
|
|
-XX:+UseFastAccessorMethods |
原始类型的快速优化 |
|
|
-XX:+UseCMSInitiatingOccupancyOnly |
使用手动定义初始化定义开始CMS收集 |
|
禁止hostspot自行触发CMS GC |
-XX:CMSInitiatingOccupancyFraction=70 |
使用cms作为垃圾回收 |
92 |
为了保证不出现promotion failed(见下面介绍)错误,该值的设置需要满足以下公式CMSInitiatingOccupancyFraction计算公式 |
-XX:SoftRefLRUPolicyMSPerMB |
每兆堆空闲空间中SoftReference的存活时间 |
1s |
|
-XX:+PrintClassHistogram |
|
|
garbage collects before printing the histogram |
-XX:+PrintGCDetails |
打印日志细节 |
|
|
-XX:+PrintGCTimeStamps |
打印时间 |
|
|
-XX:+PrintHeapAtGC |
打印GC前后的详细堆栈信息 |
|
|
-XX:+PrintGCApplicationStoppedTime |
打印垃圾回收期间程序暂停的时间 |
|
|
-Xloggc:d:\gc.log |
把相关日志信息记录到文件以便分析 |
|
|
在%CATALINA_HOME%/bin/ 下,创建文件setenv.bat,文件内容如下:
set JAVA_OPTS=%JAVA_OPTS% -server –Xms3000M –Xmx3000M –Xmn600M -XX:PermSize=512M -XX:MaxPermSize=512M -Xss256K set JAVA_OPTS=%JAVA_OPTS% -XX:+DisableExplicitGC -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC set JAVA_OPTS=%JAVA_OPTS% -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=83 -XX:SoftRefLRUPolicyMSPerMB=0 set JAVA_OPTS=%JAVA_OPTS% -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -Xloggc:d:\gc.log |
其中红色属性值需要根据具体资源来计算和配置。为避免promontion faild报错,个别属性的值需要计算得出,因为eden+fromsurvivor < old gen区剩余内存时,不会出现promontion faild的情况,所以可依据以下公式来计算CMSInitiatingOccupancyFraction的值:
CMSInitiatingOccupancyFraction计算公式
CMSInitiatingOccupancyFraction<=((Xmx-Xmn)-(Xmn-Xmn/(SurvivorRatior+2)))/(Xmx-Xmn)*100
例如:
当xmx=3000xmn=600 SurvivorRatior=1时 CMSInitiatingOccupancyFraction<=((3000.0-600)-(600-600/(1+2)))/(3000-600)*100=83.33
当xmx=5000xmn=900 SurvivorRatior=1时 CMSInitiatingOccupancyFraction<=((5000.0-900)-(900-900/(1+2)))/(5000-900)*100=85.3659
另外,如果Tomcat是安装成service方式,除了需要增加setenv.bat文件外,还需要配置%CATALINA_HOME%/bin/目录下的tomcat7w.exe,双击打开,切换到JAVA标签页,Java Options增加如下配置:
-Xms3000M -Xmx3000M -Xmn600M -XX:PermSize=512M -XX:MaxPermSize=512M -Xss256K -XX:+DisableExplicitGC -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=83 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -Xloggc:d:\gc.log |
如果加入了-Xms、-Xmx、-Xss这三个参数,下面的内存池初始值和最大值以及堆栈大小就不要填写,如果没加入这三个参数就在界面上填写对应的参数。
jmap –heap pid检查内存分配情况:
jinfo –flags pid检查参数配置情况:
通过jvisualvm.exe检查启动参数: