一、简介

Tomcat官网:http://tomcat.apache.org/

建议windows用户也用linux的版本,也就是tomcat的免安装版,因为exe安装版在windows服务器,如果要安装两个以上的tomcat就会在注册系统服务时重名,导致安装错误,免安装版可通过修改bin\service.bat,完成注册系统服务。

安装:(前提需配置好环境变量:JAVA_HOME,CLASSPATH

1、将解压版tomcat解压到相应的路径下(重命名tomcat为Tomcat1)


2、如果服务器上有多个tomcat,那你必须在Tomcat1\conf\server.xml中修改端口

<!-- 远程停服务端口 -->
<Server port="8005" shutdown="SHUTDOWN">  
<!-- 其中8080为HTTP端口,8443为HTTPS端口 -->
<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />  
<!-- 8009为AJP端口 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


3、修改service.bat文件(Tomcat1\bin\service.bat)该文件中SERVICE_NAME即可

rem Set default Service name
set SERVICE_NAME=Tomcat7_1

两个tomcat配置的端口及服务名不能重复


4、注册系统服务

在DOS命令行模式下,cd到tomcat的bin目录下

安装:

service.bat install [服务名]

移除:

service.bat uninstall [服务名]


二、Tomcat启动命令行中的优化参数:  

    Tomcat首先跑在JVM之上的,因为它的启动其实也只是一个java命令行,首先我们需要对这个JAVA的启动命令行进行调优 

  1. 在linux下可在bin\catalina.bat中配置

  2. 在windows下可以在bin\service.bat中配置(需在注册系统服务器前配置)

  3. 在注册windows服务器后可在注册表中设置

    运行 regedit 找到(路径可能有一点点差别)

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\Tomcat7_1\Parameters\Java 中的 Options


调优参数:

set JAVA_OPTS=
-server
-Xms1000M
-Xmx1000M
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:PermSize=64M
-XX:MaxPermSize=300M
-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

    开启Java的服务器模式(默认-client模式),一定要作为第一个参数,在多个CPU时性能佳,java虚拟机启动会检测主机是否为服务器,可以通过运行:java -version来查看jvm默认工作在什么模式


-Xms

    为jvm启动时分配的内存(初始化内存),比如-Xms200m,表示分配200M

-Xmx

    为jvm运行过程中分配的最大内存,比如-Xms500m,表示jvm进程最多只能够占用500M内存

    把Xms与Xmx两个值设成一样是最优的做法,发数越高,使用内存逐步上升,上升到最高,开始回落,由其是大起大落,在内存回落时它付出的代价是CPU高速开始运转进行垃圾回收,系统容易出现“卡壳”网页像死在那边一样几秒甚至十几秒时间,因为JVM正在进行垃圾回收。

可通过"java -Xmx1500M -version"命令测试JVM能够使用的最大值


-Xmn

    设置年轻代大小为512m。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。


-Xss

    是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory。默认JDK1.4中是256K,JDK1.5+中是1M


-XX:+AggressiveOpts

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


-XX:+UseBiasedLocking  

    启用一个优化了的线程锁,我们知道在我们的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()”。看到过有两个极品工程中每次在DAO操作结束时手动调用System.gc()一下,觉得这样做好像能够解决它们的out ofmemory问题一样,付出的代价就是系统响应时间严重降低,就和在关于Xms,Xmx里的解释的原理一样,这样去调用GC导致系统的JVM大起大落,性能不到什么地方去哟! 


-XX:+UseParNewGC

    对年轻代采用多线程并行回收,这样收得快。


-XX:+UseConcMarkSweepGC

    即CMS gc(tenured generation 终身代),这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒。


-XX:MaxTenuringThreshold

    设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。 这个值的设置是根据本地的jprofiler监控后得到的一个理想的值,不能一概而论原搬照抄。


-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 启动收集


-XX:CMSInitiatingOccupancyFraction=70  

    CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed。在我的应用中Xmx是6000,Xmn是512,那么Xmx-Xmn是5488兆,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还 剩10%的空间是5488*10%=548兆,所以即使Xmn(也就是年轻代共512兆)里所有对象都搬到年老代里,548兆的空间也足够了,所以只要满 足上面的公式,就不会出现垃圾回收时的promotion failed; 因此这个参数的设置必须与Xmn关联在一起。


-Djava.awt.headless=true  

    这个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web网页输出GIF/JPG等流,在winodws环境下,一般我们的app server在输出图形时不会碰到什么问题,但是在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。


三、Tomcat连接参数的优化,主要是针对吞吐量做优化:

修改conf/server.xml文件,把原来

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

改成下面的内容

<Connector port="8080" protocol="HTTP/1.1"
  URIEncoding="UTF-8"  
  minSpareThreads="25" 
  maxSpareThreads="75"
  enableLookups="false" 
  disableUploadTimeout="true" 
  connectionTimeout="20000"
  acceptCount="300"   
  maxThreads="300" 
  maxProcessors="1000" 
  minProcessors="5"
  useURIValidationHack="false"
  compression="on" 
  compressionMinSize="2048"
  compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
  redirectPort="8443"
/>


参数讲解:

● URIEncoding=”UTF-8”  

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


● maxSpareThreads  

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

  

● minSpareThreads  

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

 

● enableLookups  

    这个功效和Apache中的HostnameLookups一样,设为关闭。 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址。

 

● connectionTimeout  

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


● maxThreads  

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


● acceptCount  

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


● maxProcessors与minProcessors  

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

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


● useURIValidationHack   

    我们来看一下tomcat中的一段源码:

security          
if (connector.getUseURIValidationHack()) {             
	String uri = validate(request.getRequestURI());             
	if (uri == null) {                 
		res.setStatus(400);                  
		res.setMessage("Invalid URI");                 
		throw new IOException("Invalid URI");             
	} else {                  
		req.requestURI().setString(uri);                 
		// Redoing the URI decoding                  
		req.decodedURI().duplicate(req.requestURI());                 
		req.getURLDecoder().convert(req.decodedURI(), true);             
	}         
}

可以看到如果把useURIValidationHack设成"false",可以减少它对一些url的不必要的检查从而减省开销。 


● disableUploadTimeout  

    类似于Apache中的keeyalive一样,这个标志允许servlet container在一个servlet执行的时候,使用一个不同的,更长的连接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上载的时候更长的超时时间。如果没有指定,设为false。



给Tomcat配置gzip压缩(HTTP压缩)功能

●compression="on" 

    打开压缩功能 


● compressionMinSize="2048" 

    启用压缩的输出内容大小,这里面默认为2KB 


● noCompressionUserAgents="gozilla, traviata" 

    对于以下的浏览器,不启用压缩 


● compressableMimeType="text/html,text/xml" 

    压缩类型 


HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。


最后不要忘了把8443端口的地方也加上同样的配置,因为如果我们走https协议的话,我们将会用到8443端口这个段的配置!

<Connector port="8443" protocol="HTTP/1.1" 
...
/>



以上内容参考了"Tomcat性能调优-让小猫飞奔"文章,总结而来

注意:本文归作者所有,未经作者允许,不得转载