您的位置:首页 > 运维架构 > Tomcat

Tomcat配置优化手册

2017-03-06 16:12 169 查看
Tomcat配置优化手册

一、环境变量检查

1、JDK环境变量

配置好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%

2、Tomcat环境变量

配置好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管理员账户,来登录Tomcat控制台查看各种参数。
%CATALINA_HOME%/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"/>
启动tomcat后,登录Tomcat控制台查看信息,URL: http://serverip:port/


三、运行模式确认

1、运行模式

TomcatConnector的三种不同的运行模式性能相差很大,这三种模式的不同之处如下:
BIO:
一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下,在Linux系统中默认使用这种方式。
NIO:
利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。
APR:
即Apache Portable Runtime,从操作系统层面解决io阻塞问题。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。Linux如果安装了apr和native,Tomcat直接启动就支持apr。

2、确认


fb49
登录Tomcat控制台,确认运行模式为APR:



四、执行器优化

1、Executor参数

name:
共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:None;
namePrefix:
在JVM上,每个运行线程都可以有一个name 字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-;
maxThreads
该线程池可以容纳的最大线程数。默认值:200;
minSpareThreads
Tomcat应该始终打开的最小不活跃线程数。默认值:25。
prestartminSpareThreads
是否在Executor启动时,就生成minSpareThreads个线程。默认为 false。

2. 开启线程池

修改%CATALINA_HOME%/conf/
server.xml
,开启线程池:



Executor参数改成:

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

 

五、连接器优化

1、Connector参数

executor:
表示使用该参数值对应的线程池;
enableLookups:
是否反查域名,取值为true 或 false 。为了提高处理能力,应设置为 false;

maxPostSize:
以POST方式传输的参数长度限制,默认为2M;
URIEncoding:
Tomcat在解析参数的时候使用的编码方式,默认不支持中文;
acceptCount:
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
acceptorThreadCount:
Tomcat接收请求的线程的数目,默认是1个;

2、配置连接器

修改%CATALINA_HOME%/conf/server.xml,将Connector的执行器设置为共享池模式:



具体如下:
    <Connector executor="tomcatThreadPool" port="8080"
connectionTimeout="20000"
protocol="HTTP/1.1"
redirectPort="8443"
enableLookups="false"
        maxPostSize="10485760"
        URIEncoding="utf-8"
        acceptCount="800"
        acceptorThreadCount="2"/>

3、 验证

登录Tomcat控制台,验证配置是否生效:



六、开启压缩功能

1.    压缩参数

HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,JavaScript
, Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩。
compression:
是否启动压缩功能;
compressionMinSize:
当数据大于多少KB的时候使用压缩;

noCompressionUserAgents:
哪些类型的浏览器不启用压缩;
compressableMimeType:
需要压缩的文件类型;

2.    开启压缩

%CATALINA_HOME%/conf/ server.xml



具体如下:

<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
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"/>

七、 日志配置

1.    格式参数

通过配置日志记录的格式,取得访问日志数据,为后续的性能优化提供依据,也能为一些故障定位提供帮助:
 %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
访问发生的时间,以秒记

2.    配置优化

%CATALINA_HOME%/conf/ server.xml中,修改Server->Service->Engine->Host下的Valve元素:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%t %a %A %h %H %S %l %u %m %U "%r" "%q" %s %b %D %T" />

3、验证

%CATALINA_HOME%/logs/下查看最新生成的日志的格式:



后续可以使用工具根据以上日志信息生成多个报表:
* 独立IP数统计

* 访问请求数统计
* 访问资料文件数统计

* 访问流量统计

* 访问处理响应时间统计

* 统计所有404错误页面

* 统计所有500错误的页面

* 统计访问最频繁页面

* 统计访问处理时间最久页面

* 统计并发访问频率最高的页面

八、 安全性配置

1.    应用程序安全

关闭war自动部署unpackWARs="false" autoDeploy="false"。防止被植入木马等恶意程序。
%CATALINA_HOME%/conf/ server.xml中,Host修改如下:
<Host name="localhost"  appBase="webapps"
unpackWARs="false" autoDeploy="false">

九、JVM配置优化

1、JVM参数

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作为垃圾回收

使用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

把相关日志信息记录到文件以便分析

 

 

2.    配置优化

%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这三个参数,下面的内存池初始值和最大值以及堆栈大小就不要填写,如果没加入这三个参数就在界面上填写对应的参数。

3.    验证

jmap –heap pid检查内存分配情况:
 


jinfo –flags pid检查参数配置情况:
 


通过jvisualvm.exe检查启动参数:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: