Tomcat配置优化手册

来源:互联网 发布:sql求和函数 编辑:程序博客网 时间:2024/06/06 01:38

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、确认

登录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 &quot;%r&quot; &quot;%q&quot; %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标签页,JavaOptions增加如下配置:

-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检查启动参数:

0 0