Tomcat 6 性能优化小结
转载?http://blog.csdn.net/chen3888015/article/details/7432488
?
最近在做压力测试,用户数不到60,就没有办法响应,用了下面的优化流程并发性能提高了很多
环境centos5.7 tomcat6
http://apr.apache.org/download.cgi
1、修改tomcat让其支持NIO
编辑Tomcat目录下面的conf子目录下面的server.xml文件
vi /opt/tomcat6/conf/server.xml
? ? <Connector port="80" protocol="HTTP/1.1"?? ? ? ?connectionTimeout="20000"?? ? ? ? redirectPort="8443" />
?
修改成支持NIO的类型,配置如下 :
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol?" ? connectionTimeout="20000" ? ? redirectPort="8443" />
?
Tomcat从5.5版本开始,支持以下四种Connector的配置分别为:
<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"??????????? ?????????????? connectionTimeout="20000" redirectPort="8443"/>
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000"
?????????????? redirectPort="8443"/>?
<Connector executor="tomcatThreadPool"
?????????????? port="8081" protocol="HTTP/1.1"
?????????????? connectionTimeout="20000"
?????????????? redirectPort="8443" />
<Connector executor="tomcatThreadPool"
?????????????? port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
?????????????? connectionTimeout="20000"
?????????????? redirectPort="8443" />
我们姑且把上面四种Connector按照顺序命名为 NIO, HTTP, POOL, NIOP
为了不让其他因素影响测试结果,我们只对一个很简单的jsp页面进行测试,这个页面仅仅是输出一个Hello World。假设地址是 http://tomcat1/test.jsp
我们依次对四种Connector进行测试,测试的客户端在另外一台机器上用ab命令来完成,测试命令为:?ab -c 900 -n 2000 http://tomcat1/test.jsp?,最终的测试结果如下表所示(单位:平均每秒处理的请求数):
?
NIO HTTP POOL NIOP28165208365666661103986926566263256639445944067145363由这五组数据不难看出,HTTP的性能是很稳定,但是也是最差的,而这种方式就是Tomcat的默认配置。NIO方式波动很大,但没有低于280 的,NIOP是在NIO的基础上加入线程池,可能是程序处理更复杂了,因此性能不见得比NIO强;而POOL方式则波动很大,测试期间和HTTP方式一样,不时有停滞。
由于linux的内核默认限制了最大打开文件数目是1024,因此此次并发数控制在900。
尽管这一个结果在实际的网站中因为各方面因素导致,可能差别没这么大,例如受限于数据库的性能等等的问题。但对我们在部署网站应用时还是具有参考价值的。
来自:http://www.javayou.com/diary/143691518
??
2、增加tomcat的处理线程数
编辑Tomcat目录下面的conf子目录下面的server.xml文件
maxThreads :Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
minSpareThreads:Tomcat初始化时创建的线程数。
maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
?<Connector port="19101" maxHttpHeaderSize="8192" ?protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" maxThreads="150" acceptCount="100" ? enableLookups="false" disableUploadTimeout="true" />
当tomcat线程数增大,但没有超过最大线程数时,平均响应时间会增大,但这不意味着tomcat在线程增多时响应速度变慢.在测试中发现,由于线程数增多,在请求时需要排队,导致一部分请求会一直排队,随着线程数的增多,排队等待的最大时间也会越来越大,而这些大数据才是导致平均响应时间变大的罪魁祸首.响应时间大于3s的请求占总请求的比例一直维持在3%-5%.?
http://blog.csdn.net/spider_zhcl/article/details/6167095
3、tomcat内存空间的设置
?
编辑Tomcat目录下面的bin子目录下面的catalina.sh文件
?
常见tomcat内存错误1:java.lang.OutOfMemoryError: Java heap space
使用Java程序从数据库中查询大量的数据时出现异常
在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的Heap size 不足2%的时候将抛出此异常信息。
整体意思是超出内存堆空间的错误
?
OutOfMemeoryError:超出内存的错误
?
space:空间的意思?
heap:堆堆是什么意思?堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所有方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。-server表示以server模式运行,运行效率比默认的client高很多
-Xms:初始值
-Xmx:最大值
-Xmn:最小值
一般的JAVA程序在运行都可以通过中-Xms -Xmx来调整应用程序的初始内存和最大内存:?
? 如:java -Xms64m?? -Xmx128m?? a.jar.
tomcat的启动程序是包装过的,不能直接使用java?-Xms64m?? -Xmx128m ??tomcat.*来改变内存的设置,而是只要去改变catalina.sh文件的值就行。
?
常见tomcat内存错误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)那么就会产生此错误信息了。
问题的关键是SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态映射会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!,现在只能通过加大内存来解决。
因为对于操作系统,请求内存的系统调用会占用大量的cpu时间,所以频繁的请求、释放内存将会导致性能的严重下降。所以对于jvm,最好的方式就是尽量多占用内存作为heap,少释放甚至不释放空闲的heap给操作系统以减少消耗在内存请求、释放操作上的cpu时间。 ?
设置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old" 的一半,原因是old区如果不够大会频繁的触发主GC,大大降低了性能
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64,由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4
常见tomcat内存错误3:OutOfMemoryError: unable to create new native thread.
无法创建新的线程。
每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的 400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。
这样结论就出来了,要想创建更多的线程,你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。
给出一个有关能够创建线程的最大个数的估算公式:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
对于jdk1.5而言,假设操作系统保留120M内存:
1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads
1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads
因此:我们需要结合不同情况对tomcat内存分配进行不同的诊断才能从根本上解决问题。
??
?
Error occurred during initialization of VM
Too small initial heap for new size specified
总之,代码编写的不规范容易带来这样的问题。 ?
?
?采用 NIO 的配置:
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" enableLookups="false"
?? maxThreads="200" acceptCount="500" acceptorThreadCount="1" connectionTimeout="5000"
?????????????? redirectPort="8443" />
?
?
http://apr.apache.org/download.cgiAPR?APR-util?APR-iconvAPR 1.4.6 is the best available versionAPR-util 1.4.1 is the best available versionAPR is the base portability library.
Unix Source:?apr-1.4.6.tar.gz?[PGP] [MD5]Unix Source:?apr-1.4.6.tar.bz2?[PGP] [MD5]Win32 Source:?apr-1.4.6-win32-src.zip?[PGP] [MD5] [SHA1]Other files
APR iconv 1.2.1 is the best available versionAPR-util provides a number of helpful abstractions on top of APR.
Unix Source:?apr-util-1.4.1.tar.gz?[PGP] [MD5]Unix Source:?apr-util-1.4.1.tar.bz2?[PGP] [MD5]Windows Source:?apr-util-1.4.1-win32-src.zip?[PGP] [MD5]Other files
?Tomcat Native ConnectorAPR-iconv provides a portable iconv() implementation built on top of APR. It is generally of interest only where no system provided iconv() is available (either in libiconv, or libc as applicable). An example is the Windows platform, where APR-iconv is required to enable the APR-util library's apr_xlate feature.
Unix Source:?apr-iconv-1.2.1.tar.gz?[PGP] [MD5]Unix Source:?apr-iconv-1.2.1.tar.bz2?[PGP] [MD5]Windows Source:?apr-iconv-1.2.1-win32-src-r2.zip?[PGP] [MD5]Other files
For more information concerning Tomcat Native, see the?Tomcat Native?site.
解决:The Apache Tomcat Native library which allows optimal performance in production environments was not found?
5.5开始就支持apr了,启动的时候会有一句话,显示没找到tomcat native,这就是指apache apr,能增强IO的能力。
在tomcat发行版里有一个tomcat-native.tar.gz文件,可以解开来编译,如果嫌麻烦就去下载已编译好的版本:
http://tomcat.heanet.ie/native/
下载tcnative-1.dll,如果需要SSL,就再下载openssl.exe文件以获得SSL支持。
把dll放到tomcat下bin目录,再重新启动就行了,启动速度没变化,但是访问速度有提高,特别是并发的时候,建议使用。
---
大?|中?|小引用功能被关闭了。在启动Tomcat 6.0时发现第一条信息便是:
The Apache Tomcat Native library which allows optimal performance in production environments was not found ……
解决方法:
相关文档:http://tomcat.apache.org/tomcat-6.0-doc/apr.html
去这里http://tomcat.heanet.ie/native/下载最新版本的tcnative-1.dll放到Tomcat的安装目录\Bin下
之后重启Tomcat就OK了。
比如现在我已下载了V1.1.14的tcnative-1.dll,启动时信息变成:
??? ??? channelNioSocket.port="8009"
??? ??? channelNioSocket.redirectPort="8443"
??? ??? channelNioSocket.maxThreads="256"
??? ??? channelNioSocket.maxSpareThreads="97"
??? ??? channelNioSocket.minSpareThreads="50"
??? ??? channelNioSocket.URIEncoding="UTF-8"
??? ??? URIEncoding="UTF-8"
??? ??? channelNioSocket.connectionTimeout="20000"
??? ??? channelNioSocket.keepAliveTimeout="1000"
??? ??? channelNioSocket.bufferSize="16384"/>?
http://windows9834.blog.163.com/blog/static/27345004201012633648519/
http://vod.sjtu.edu.cn/help/Article_Print.asp?ArticleID=1387
http://grantbb.iteye.com/category/35866
]http://lianj-lee.iteye.com/blog/547485
http://brofe.iteye.com/blog/233399
?
Tomcat可以使用APR来提供超强的可伸缩性和性能,更好地集成本地服务器技术。APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心。APR有很多用途,包括访问高级IO功能(例如sendfile,epoll和OpenSSL),OS级别功能(随机数生成,系统状态等等),本地进程管理(共享内存,NT管道和UNIX sockets)。这些功能可以使Tomcat作为一个通常的前台WEB服务器,能更好地和其它本地web技术集成,总体上让Java更有效率作为一个高性能web服务器平台而不是简单作为后台容器。
在产品环境中,特别是直接使用Tomcat做WEB服务器的时候,您应该使用Tomcat Native来提高其性能,详细配置和安装请参考Tomcat文档。?如果没有apr技术,启动tomcat 时出现如下提示:?信息:?The?APR?based?Apache?Tomcat?Native?library?which?allows?optimal?performance?in?production?environments?was?not?found?on?the?java.library.path:?/usr/java/jdk1.6.0_06/jre/lib/i386/client:/usr/java/jdk1.6.0_06/jre/lib/i386:/usr/java/jdk1.6.0_06/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib?按照官方说明需要:
APR libraryOpenSSL librariesopenssl 可以用 yum install openssl-devel,apr还是下载*.gz来安装。
apr-1.3.2.tar.gz
apr-util-1.3.2.tar.gz
两个可以在?http://apache.mirror.phpchina.com/apr/??找到。
tomcat-native.tar.gz 可以在tomcat/bin目录下找到。安装 apr
File代码??
- #?wget?http://apache.mirror.phpchina.com/apr/apr-1.3.2.tar.gz??
- #?tar?zxvf?apr-1.3.2.tar.gz??
- #?cd?apr-1.3.2??
- #?./configure??
- #?make??
- #?make?install??
- #?wget?http://apache.mirror.phpchina.com/apr/apr-1.3.2.tar.gz ??
- #?tar?zxvf?apr-1.3.2.tar.gz ??
- #?cd?apr-1.3.2??
- #?./configure ??
- #?make ??
- #?make?install??
apr 默认安装在 /usr/local/apr
安装 apr-util
File代码??
- #?wget?http://apache.mirror.phpchina.com/apr/apr-util-1.3.2.tar.gz??
- #?tar?zxvf?apr-util-1.3.2.tar.gz??
- #?cd?apr-util-1.3.2??
- #?./configure?--with-apr=/usr/local/apr??
- #?make??
- #?make?install??
- #?wget?http://apache.mirror.phpchina.com/apr/apr-util-1.3.2.tar.gz ??
- #?tar?zxvf?apr-util-1.3.2.tar.gz ??
- #?cd?apr-util-1.3.2??
- #?./configure?--with-apr=/usr/local/apr ??
- #?make ??
- #?make?install??
安装 tomcat-native
File代码??
- #?cd?/usr/local/tomcat-6.0.18/bin??
- #?tar?zxvf?tomcat-native.tar.gz??
- #?cd?tomcat-native-1.1.14-src/jni/native??
- #?./configure?--with-apr=/usr/local/apr?--with-java-home=/usr/java/jdk1.6.0_11??
- #?make??
- #?make?install??
- #?cd?/usr/local/tomcat-6.0.18/bin ??
- #?tar?zxvf?tomcat-native.tar.gz ??
- #?cd?tomcat-native-1.1.14-src/jni/native ??
- #?./configure?--with-apr=/usr/local/apr?--with-java-home=/usr/java/jdk1.6.0_11 ??
- #?make ??
- #?make?install??
设置 apr 的环境变量:
File代码??
- #?vi?/etc/profile??
- //?后面添加以下内容??
- export?LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib??
- //使profile生效,??
- #?source?/etc/profile??
- #?vi?/etc/profile ??
- //?后面添加以下内容 ??
- export?LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib ??
- //使profile生效, ??
- #?source?/etc/profile??
启动 tomcat 后, 看日志:
File代码??
- #?bin/startup.sh??
- #?head?logs/catalina.out??
- ??
- //?可以看到以下结果:??
- 信息:?Loaded?APR?based?Apache?Tomcat?Native?library?1.1.14.??
- 2009-1-13?11:12:51?org.apache.catalina.core.AprLifecycleListener?init??
- 信息:?APR?capabilities:?IPv6?[true],?sendfile?[true],?accept?filters?[false],?random?[true].??
- #?bin/startup.sh ??
- #?head?logs/catalina.out ??
- ??
- //?可以看到以下结果: ??
- 信息:?Loaded?APR?based?Apache?Tomcat?Native?library?1.1.14. ??
- 2009-1-13?11:12:51?org.apache.catalina.core.AprLifecycleListener?init ??
- 信息:?APR?capabilities:?IPv6?[true],?sendfile?[true],?accept?filters?[false],?random?[true].??
好了, 可以运行了,但没有测试其性能提升多少。
?
?
?
參考自:http://www.chinajvm.com/main/helpcontent.jsp?id=5320b71a1eb098e2011ee230a2311367
http://blog.chenlb.com/2009/01/install-apache-portable-runtime-or-tomcat-native-on-tomcat.html
?
?
?
?
?
?
众所周知,tomcat是应用服务器,当处理图片,静态页面的时候,能力还是有些弱,但是通过在其中使用apr库,可以大幅度的提高这方面的能力。可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式传输的话,也可以提升SSL的处理性能。
一般在Windows下,可以直接下载编译好的二进制版本的dll库文件来使Tomcat启用APR,下载地址是:http://tomcat.heanet.ie/native/
今天要说的是在linux下面怎么使用它,?
Java代码??[java]?view plaincopy?
- 环境 ??
- CentOs?5??
- 所需软件 ??
- Tomcat?5.5.27??
- apr-1.3.3.tar.gz ??
- apr-util-1.3.4.tar.gz ??
- tomcat-native-1.1.16-src.tar.gz??
- 环境??
- CentOs?5??
- 所需软件??
- Tomcat?5.5.27??
- apr-1.3.3.tar.gz??
- apr-util-1.3.4.tar.gz??
- tomcat-native-1.1.16-src.tar.gz??
安装过程?
1、安装Tomcat。?
2、编译安装APR。?
Java代码??[java]?view plaincopy?
- 1》解压文件 ??
- tar?zxvd?apr-1.3.3.tar.gz ??
- 2》安装 ??
- ./configure?--prefix=/u02/apache-tomcat-5.5.27/apr ??
- make ??
- make?install??
- 1》解压文件??
- tar?zxvd?apr-1.3.3.tar.gz??
- 2》安装??
- ./configure?--prefix=/u02/apache-tomcat-5.5.27/apr??
- make??
- make?install??
3、编译安装APR UTIL。?
Java代码??[java]?view plaincopy?
- 1》解压文件 ??
- tar?zxvd?apr-util-1.3.4.tar.gz ??
- 2》安装 ??
- ./configure?--prefix=/u02/apache-tomcat-5.5.27/apr?--with-apr=/u02/apache-tomcat-5.5.27/apr ??
- make ??
- make?install??
- 1》解压文件??
- tar?zxvd?apr-util-1.3.4.tar.gz??
- 2》安装??
- ./configure?--prefix=/u02/apache-tomcat-5.5.27/apr?--with-apr=/u02/apache-tomcat-5.5.27/apr??
- make??
- make?install??
4、编译安装Native。?
Java代码??[java]?view plaincopy?
- 1》解压文件 ??
- tar?zxvd?tomcat-native-1.1.16-src.tar.gz ??
- 2》安装 ??
- ./configure?--prefix=/u02/apache-tomcat-5.5.27/apr?--with-apr=/u02/apache-tomcat-5.5.27/apr?--with-java-home=/u02/jdk1.5.0_16 ??
- make ??
- make?install??
- 1》解压文件??
- tar?zxvd?tomcat-native-1.1.16-src.tar.gz??
- 2》安装??
- ./configure?--prefix=/u02/apache-tomcat-5.5.27/apr?--with-apr=/u02/apache-tomcat-5.5.27/apr?--with-java-home=/u02/jdk1.5.0_16??
- make??
- make?install??
5、修改Tomcat的启动参数。?
打到Tomca t安装目录下 bin/catalina.sh 文件,找到如下内容:?
Java代码??[java]?view plaincopy?
- #?Get?standard?environment?variables ??
- 在其下面添加一行: ??
- JAVA_OPTS="-Djava.library.path=/u02/apache-tomcat-5.5.27/apr/lib"??
- #?Get?standard?environment?variables??
- 在其下面添加一行:??
- JAVA_OPTS="-Djava.library.path=/u02/apache-tomcat-5.5.27/apr/lib"??
6、验证。?
进入Tomcat的bin目录,执行:?
Java代码??[java]?view plaincopy?
- root@linux:~/apache-tomcat-5.5.27/bin>?./startup.sh? ??
- Using?CATALINA_BASE:???/u02/apache-tomcat-5.5.27??
- Using?CATALINA_HOME:???/u02/apache-tomcat-5.5.27??
- Using?CATALINA_TMPDIR:?/u02/apache-tomcat-5.5.27/temp ??
- Using?JRE_HOME:???????/u02/jdk1.5.0_16/jre??
- root@linux:~/apache-tomcat-5.5.27/bin>?./startup.sh???
- Using?CATALINA_BASE:???/u02/apache-tomcat-5.5.27??
- Using?CATALINA_HOME:???/u02/apache-tomcat-5.5.27??
- Using?CATALINA_TMPDIR:?/u02/apache-tomcat-5.5.27/temp??
- Using?JRE_HOME:???????/u02/jdk1.5.0_16/jre??
进入Tomcat的logs目录,打开 catalina.out 文件,可以看到控制台输出的日志如下:?
Java代码??[java]?view plaincopy?
- [b]Apr?17,?2009?11:16:53?AM?org.apache.coyote.http11.Http11AprProtocol?init[/b] ??
- INFO:?Initializing?Coyote?HTTP/1.1?on?http-9090??
- Apr?17,?2009?11:16:53?AM?org.apache.coyote.ajp.AjpAprProtocol?init ??
- INFO:?Initializing?Coyote?AJP/1.3?on?ajp-8009??
- Apr?17,?2009?11:16:53?AM?org.apache.catalina.startup.Catalina?load ??
- INFO:?Initialization?processed?in?2160?ms ??
- Apr?17,?2009?11:16:53?AM?org.apache.catalina.core.StandardService?start ??
- INFO:?Starting?service?Catalina ??
- Apr?17,?2009?11:16:53?AM?org.apache.catalina.core.StandardEngine?start ??
- INFO:?Starting?Servlet?Engine:?Apache?Tomcat/5.5.27??
- Apr?17,?2009?11:16:53?AM?org.apache.catalina.core.StandardHost?start ??
- INFO:?XML?validation?disabled ??
- Apr?17,?2009?11:16:57?AM?org.apache.coyote.http11.Http11AprProtocol?start ??
- INFO:?Starting?Coyote?HTTP/1.1?on?http-9090??
- Apr?17,?2009?11:16:58?AM?org.apache.coyote.ajp.AjpAprProtocol?start ??
- INFO:?Starting?Coyote?AJP/1.3?on?ajp-8009??
- Apr?17,?2009?11:16:58?AM?org.apache.catalina.storeconfig.StoreLoader?load ??
- INFO:?Find?registry?server-registry.xml?at?classpath?resource ??
- Apr?17,?2009?11:16:58?AM?org.apache.catalina.startup.Catalina?start ??
- INFO:?Server?startup?in?5236?ms??
- [b]Apr?17,?2009?11:16:53?AM?org.apache.coyote.http11.Http11AprProtocol?init[/b]??
- INFO:?Initializing?Coyote?HTTP/1.1?on?http-9090??
- Apr?17,?2009?11:16:53?AM?org.apache.coyote.ajp.AjpAprProtocol?init??
- INFO:?Initializing?Coyote?AJP/1.3?on?ajp-8009??
- Apr?17,?2009?11:16:53?AM?org.apache.catalina.startup.Catalina?load??
- INFO:?Initialization?processed?in?2160?ms??
- Apr?17,?2009?11:16:53?AM?org.apache.catalina.core.StandardService?start??
- INFO:?Starting?service?Catalina??
- Apr?17,?2009?11:16:53?AM?org.apache.catalina.core.StandardEngine?start??
- INFO:?Starting?Servlet?Engine:?Apache?Tomcat/5.5.27??
- Apr?17,?2009?11:16:53?AM?org.apache.catalina.core.StandardHost?start??
- INFO:?XML?validation?disabled??
- Apr?17,?2009?11:16:57?AM?org.apache.coyote.http11.Http11AprProtocol?start??
- INFO:?Starting?Coyote?HTTP/1.1?on?http-9090??
- Apr?17,?2009?11:16:58?AM?org.apache.coyote.ajp.AjpAprProtocol?start??
- INFO:?Starting?Coyote?AJP/1.3?on?ajp-8009??
- Apr?17,?2009?11:16:58?AM?org.apache.catalina.storeconfig.StoreLoader?load??
- INFO:?Find?registry?server-registry.xml?at?classpath?resource??
- Apr?17,?2009?11:16:58?AM?org.apache.catalina.startup.Catalina?start??
- INFO:?Server?startup?in?5236?ms??
注意上面用粗体标识的部分,说明APR应用成功。?分享到:???
?
?
?
?
tomcat6 连接数设置博客分类:
? Tomcat6默认配置,在后台一阵全点击服务器就报废了,查了一下就要是PERMSIZE默认值过小造成(16-64)
TOMCAT_HOME/bin/catalina.sh?
添加一行:JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"?
问题解决(可能为调用JAR包过多原因)下面是网上看到一些设置?
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
当在对其进行并发测试时,基本上30个USER上去就当机了,还要修改默认连接数设置:以下红色四行TOMCAT6中好相没有,手工加上就可以了,基本上可以解决连接数过大引起的死机。具体数值可跟据实际情况设置
??? <Connector port="80" protocol="HTTP/1.1"?
?????????????? maxThreads="600"?????
minSpareThreads="100"?
maxSpareThreads="500"?
acceptCount="700"?
connectionTimeout="20000" enableLookups="false"? //dns关闭?
?????????????? redirectPort="8443" URIEncoding="UTF-8"?
/>?
这样设置以后,基本上没有再当机过。。。。。?
????????????? maxThreads="600"?????? ///最大线程数?
minSpareThreads="100"///初始化时创建的线程数?
maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要?
的socket线程。?
acceptCount="700"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理?
启动时候报错:?
解决[SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxTheads' to '500' did not find a matching property.
警告: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxTheads' to '500' did not find a matching property.
2010-7-4 20:49:35 org.apache.catalina.startup.SetAllPropertiesRule begin?
警告: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'minSpareTheads' to '100' did not find a matching property.
2010-7-4 20:49:35 org.apache.catalina.startup.SetAllPropertiesRule begin?
警告: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxSpareTheads' to '300' did not find a matching property.
但是访问应用程序正常。?
通过网上搜索,具体解决方法如下:?
server.xml中的配置HTTPS的那部分Connector代码?
将protocol参数由"HTTP/1.1"改成"org.apache.coyote.http11.Http11Protocol",重新启动Tomcat,搞定!?
根据Tomcat官方的文档http://tomcat.apache.org/tomcat-6.0-doc/config/http.html,"HTTP/1.1"和"org.apache.coyote.http11.Http11Protocol"是一样的,但是不知道为什么前者会出错而后者就是对的,而且HTTP部分的Connector用的也是"HTTP/1.1"。 ??
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
? 加快tomcat编译速度
Java Servlet规范很少使用但最优秀的另一特性是在Web应用程序启动时,指定servlet容器必须允许Web应用程序指向应被预编译的JSP页。
? ?例如,如果想让index.jsp(在Web应用程序根目录中)在Web应用程序启动时就一直被预编译。
? ?则在web.xml文件中可以对该文件增加一个<servlet>标签,如下所示:
? ?<web-app xmlns="http://java.sun.com/xml/ns/javaee"
? ? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
? ? ? xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
? ?version="2.5">
? ?<servlet>
? ?<servlet-name>index.jsp</servlet-name>
? ?<jsp-file>/index.jsp</jsp-file>
? ?<load-on-startup>0</load-on-startup>
? ?</servlet>
? ?</wep-app>
? ?随后,Tomcat将在Web应用程序启动时自动为您预编译index.jsp,而恰恰就是对/index.jsp的第一个请求将被映射为该JSP预编译的servlet类文件。
? 以这种方式在Web应用程序中配置预编译,意味着无论Web客户端是否请求JSP,JSP的所有编译工作都在Web应用程序启动时完成。
? ?以这种方式在web.xml中声明的JSP网页都会被预编译。
? ?这种方法的缺陷在于Web应用程序启动的时间总是较长,因为在Web客户端能访问Web应用程序之前,必须预编译所指定的每个网页。
? ?另外,<load-on-startup>容器标签应包含一个正整数。这是指定预编译顺序的松散方式。
? ?在JSP页上指定的数字越小,则在启动过程中预编译越早。
? 在部署Web应用程序之后,当第一个Web方式请求每个JSP网页时,以这种方式预编译JSP可以使JSP显得速度较快,但是,在编译时(部署前)编译的JSP运行速度对每个请求都较快,即使是对每个JSP页的第一个请求。
http://www.gootry.com/wangzhuan/article/101006192932/277
? ?该构建文件将找到您所有Web应用程序的JSP文件,并将这些JSP文件编译成servlet类,然后为JSP类创建servlet映射。
?
? ?您必须将产生的servlet映射放到JSP servlet类中,但很难编写Ant构建文件,以便在构建文件运行时每次都以重复的方式将servlet映射插入到web.xml文件中。
?
? ?相反,笔者使用了一个XMLentity include文件,从而在构建文件运行时,每次都能使产生的servlet映射文件进入一个新文件,并通过XML entity include机制将servlet映射文件插入到web.xml文件中。
?
? ?要使用这个文件,必须在Web应用程序的WEB-INF/web.xml文件顶端拥有一条特殊的条目声明,并在web.xml文件内容中要包含servlet映射文件的位置引用这一实体。
?
? ?<!DOCTYPE jspc-webxml[
? ? ? <!ENTITY jspc-webxml SYSTEM"jspc-web.xml">
? ?]>
? ?<web-app xmlns="http://java.sun.com/xml/ns/javaee"
? ? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
? ? ? xsl:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/
? ? ? javaee/web-app_2_5.xsd" ?version="2.5">
?
? ?<!--在此处包含JspC产生的映射-->
? ?&jspc-webxml;
? ?<!--此处没有产生的web.xml内容-->
? ?确信Web应用程序的web.xml文件顶端自始至终都由内嵌的DTD(即DOCTYPE标签),且在其后含有servlet 2.5 Web应用程序架构声明。
?
? ?然后,在web.xml文件中要插入已产生的servlet映射的地方,放置实体引用语句&jspc-webxml;。
?
? ?记住,实体引用开始于“&”符号,然后是实体名,最后是分号(;)。
?
? ?要使用该构建文件,只要编辑该文件,并在顶端将所有属性设置为所要映射的值,然后按如下方式运行:
?
? ?\$ ant -f pre-compile-jsps.xml
? ?Buildfile: pre-compile-jsps.xml
? ?generate-jsp-java-src:
? ? ? [jasper2] Sep 27, 2008 10:47:15 PM org.apache.jasper.xmlparser.MyEntityResolver ? resolveEntity
? ? ? [jasper2] SEVERE:Invalid PUBLIC ID:null
? ? ? [jasper2]Sep 27, 2007 10:47:17 PM org.apache.jasper.JspC processFile
? ? ? [jasper2] INFO:Built File: /index.jsp
? ? ? BUILD SUCCESSFUL
? ? ? Total time: 7 seconds
? ? ? 1 source file to /home/jasonb/myproject/webapp-dirWEB-INF/ classes
? ? ? BUILD SUCCESSFUL
? ? ? Total time: 7 seconds
?
? ?在webapp目录下的所有JSP文件都将被编译成servlet,而且在部署Web应用程序时,JSP网页请求都将被映射成已编译的servlet。
?
? ?如果您得到了“SEVERE:Invalid PUBLIC ID:null”消息,则忽略它,因为这是一条伪信息。如果要清除已编译的servlet,所产生的Java源码及映射,只要按如下方式执行clean目标文件就可以了:
?
? ?\% ant -f pre-compile-jsps.xml clean
?
? ?这个构建文件未处理“在编译之后删除Web应用程序中的所有JSP文件”。笔者不希望您意外地删除了JSP文件,所以专门省去了这条语句。在部署Web应用程序之前。
?
? ?构建文件会完成这一处理。如果忘记了并意外地把JSP文件遗留在部署的Web应用程序中,那么Tomcat不会对这些JSP文件提供服务,因为web.xml文件显式让Tomcat使用已编译的servlet类予以替代。
示例是一个Ant构建文件,可用于构建时编译Web应用程序的JSP文件。
? ?示例:预编译的jsps.xml ? ?
?
? ?<project name="pre-compile-jsps" default="compile-jsp-servlets">
? ?<!--私有属性-->
? ?<property name="webapp.dir" value="(美元符){basedir}/webapp-dir"/>
? ?<property name="tomcat.home" value="/opt/tomcat"/>
? ?<property name="jspc.pkg.prefix"value="com.mycompany"/>
? ?<property name="jspc.dir.prefix" value="com/myeompany"/>
?
? ?<!--编译属性-->
? ?<property name="debug" value="on"/>
? ?<property name="debuglevel" value="lines,vars, source"/>
? ?<property name="deprecation" value="on"/>
? ?<property name="e ncoding " value="ISO-8859-1"/>
? ?<property name="optimize" value="off"/>
? ?<property name="build.compiler" value="modern"/>
? ?<property name="source.version" value="1.5"/>
?
? ?<!--初始化路径-->
? ?<path id="jspc.classpath">
? ? ? <fileset dir="(美元符){tomcat.home}/bin">
? ? ? ? ?<include name="*.jar"/>
? ? ? </fileset>
? ? ? <fileset dir="(美元符){tomcat.home}/server/lib">
? ? ? ? ?<include name="*.jar"/>
? ? ? </fileset>
? ? ? <fileset dir="(美元符){tomcat.home}/common/i18n">
? ? ? ? ?<include name="*.jar"/>
? ? ? </fileset>
? ? ? <fileset dir="(美元符){tomcat.home}/common/lib">
? ? ? ? ?<include name="*.jar"/>
? ? ? </fileset>
? ? ? <fileset dir="(美元符){webapp.dir}/WEB-INF">
? ? ? ? ?<include name="lib/"*.jar"/>
? ? ? </fileset>
? ? ? <pathelement location="(美元符){webapp.dir}/WEB-INF/classes"/>
? ? ? <pathelement location="(美元符){ant.home}/lib/ant.jar"/>
? ? ? <pathelement location="(美元符){java.home}/.../lib/tools.jar"/>
? ?</path>
? ?<property name="jspc.classpath" refid="jspc.classpath"/>
? ?<!-- =====================================>
? ?<!--从JSP文件产生Java源码和web.xml文件-->
? ?<!--===================================>
? ?<target name="generate-jsp-java-src">
? ? ? <mkdir dir="(美元符){webapp.dir}/WEB-INF/jspc-src/(美元符){jspc.dir.prefix}"/>
? ? ? <taskdef classname="org.apache.jasper.JspC" name="jasper2">
? ? ? <classpath>
? ? ? ? ?<path refid="jspc.classpath"/>
? ? ? </classpath>
? ?</taskdef>
? ?<touch file="(美元符){webapp.dir}/WEB-INF/jspc-web.xml"/>
? ?<jasper2 uriroot="(美元符){webapp.dir}"
? ?package="(美元符){jspc.pkg.prefix}"
? ?webXmlFragment="(美元符){webapp.dir}/WEB-INF/jspc-web.xml"
? ? ? outputOir="(美元符){webapp.dir}/WEB-INF/jspc-src/ (美元符){jspc.dir.prefix}"
? ? ? verbose="1"/>
? ?</target>
? ?<!--=========================================-->
? ?<!--编译JSP servlet并由此产生Java类文件-->
? ?<!--由JspC任务产生的源码-->
? ?<!--==============================-->
? ?<target name="compile-jsp-servlets" depends="generate-jsp-java-src">
? ?<mkdir dir="(美元符){webapp.dir}/WEB-INF/classes"/>
? ?<javac srcdir="(美元符){webapp.dir}/WEB-INF/jspc-src"
? ? ? destdir="(美元符){webapp.dir}/WEB-INF/classes"
? ? ? includes="**/*.java"
? ? ? debug="(美元符){debug}"
? ? ? debuglevel="(美元符){debuglevel}"
? ? ? deprecation="(美元符){deprecation"}
? ? ? encoding="(美元符){encoding}"
? ? ? optimize="(美元符){optimize}"
? ? ? source="(美元符){source.version"}
? ? ? <classpath>
? ? ? ? ?<path refid="jspc.classpath">
? ? ? </classpath>
? ?</javac>
? ?</target>
? ?<!--============================= -->
? ?<!-- 清除所有预编译的JSP源码、类和jspc-web.xml -->
? ?<!-- ====================================== -->
? ?<target name="clean">
? ? ? <delete dir="(美元符){webapp.dir}/WEB-INF/jspc-src"/>
? ? ? <delete dir="(美元符){webapp.dir}/WEB-INF/classes/(美元符){jspc.dir.prefix}"/>
? ? ? <delete file="(美元符){webapp.dir}/WEB-INF/jspc-web.xml"/>
? ?</target)
? ?</project>
?
? ?如果将整个Ant build.xml内容放到一个叫做pre-compile-jsps.xml的文件中,就可以在已经拥有的任何build.xml文件旁对其进行测试,如果您愿意,还可以把它合并到build.xml中。