??xml version="1.0" encoding="utf-8" standalone="yes"?> tomcat默认情况下,catalina.out日志增长都是无限的,从而导致日志文件超大?/p> 1、下载安装cronologQ步骤如下: 打开conf/server.xml文g可以看到Q?/p>
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> 要用gzip压羃功能Q可以在Connector实例中加上如下属? <Connector 卛_Connector里面增加U色部分卛_?/p>
Apache 服务器本w没有提?Servlet/JSP 容器。因此,在实际应用中Q把
Tomcat与Apache服务器集成,可以建立h实用价值的商业化的Webq_?/p>
安装Apache服务?/strong> q行 apache_2.0.63-win32-x86-no_ssl.msiQ就启动?Apache
服务器的安装E序Q只要按默认讄q行安装卛_。如果安装成功,会自动在Windows中加入Apache
HTTP服务? 假定Apache服务器的根目录ؓQ在其conf子目录下有一个配|文件httpd.conf。如果Apache安装在本ZQƈ且采用默认的80端口作ؓHTTP端口Q则在httpd.conf文g中会看到如下属性:
Listen 80 在操作系l的【开始?#8594;【程序?#8594;【Apache HTTP Server
2.0?#8594;【ControApacheServer】菜单中Q提供了重启QRestartQ、启动(StartQ和关闭QStopQApache 服务器的子菜单?
Tips 应该保操作pȝ?0端口没有被占用,否则Apache服务器无法启动。当Apache服务器启动后Q就可以通过讉KApache的测试页来确定是否安装成功?
在Apache服务器中加入JK插g 要在Apache服务器中加入JK插gQ只要把mod_jk.so复制?modules目录下即可?
创徏workers.properties文g Apache 服务器把 Tomcat
看做是ؓ自己工作的工人(workerQ。workers.properties文g用于配置 Tomcat 的信息,它的存放位置?/conf/workers.
properties。在本书附赠光盘?
sourcecode/chapter26/windows_apache
目录下提供了workers.properties文gQ它的内容如下(“#”后面为注释信息)Q? worker.list=worker1worker.worker1.port=8009
#工作端口Q若没占用则不用修改worker.worker1.host=localhost
#Tomcat服务器的地址worker.worker1.type=ajp13 #cdworker.worker1.lbfactor=1 #负蝲q因数 以上worker.list指定Tomcat服务器名单。例?#8220;worker.list=worker1”表示只有一?
Tomcat 服务器,名ؓ“worker1”。再例如“worker.list=worker1,worker2”表示有两 ?Tomcat
服务器,分别名ؓ“worker1”?#8220;worker2”。worker.worker1.port
及worker.worker1.host用于讄名ؓ“worker1”的Tomcat服务器的有关属性,如果要设|worker2的port属性,则可以采?#8220;worker.worker2.port=8109”的Ş式?
试配置 重启Tomcat服务器和Apache服务器,q过览器访问http://localhost/index.jspQ如果出现Tomcat的默认主,p明配|已l成功。此外,如果在Tomcat服务器上已经发布了helloapp应用Q把本书附赠光盘的sourcecode/chapter26
目录下的 helloapp目录复制?webapps 目录下)Q则可以讉K
http://localhost/helloapp/hello.htmQ如果正常返回helloapp应用的hello.htm|页Q说明配|已l成功。如果配|有误,可以查看JK插g生成的日志信息,它有助于查找错误原因。在Apache服务器的配置文g
httpd.conf 中设定该日志文g的存放位|ؓ/logs/mod_jk.log? 在Unix/Linuxpȝ中,无论是socketq是file讉KQ在后台讉KE序分配了一个文件描q符QdescriptorQ,该文件描
q符为应用程序与基础操作pȝ之间的交互提供了通用接口。Unix/LinuxpȝҎ个进E能打开文g描述W有最大限Ӟ一般默认是1024。如果在?
作socket和file的时候忘记关闭,当超q系l默认的最大限Ӟ则出现java.net.SocketException: Too many
open files?/p>
针对q个问题Q解军_法如下: 我目前遇到的问题,的确是因为socket打开q接太多了?/p>
当然Q网上其他h说的Q诸如文件流没有关闭Q也可能会导致这个问题。如果是q种情况Q请查程序,把不必要的socket或file操作关闭掉即可解冟?br />
eclipse web本地工程Qnew一个java对象Q编译时都没问题Q但q行时就直接没反应,也没M报错。查找了最半天时_原来以ؓ是类之间怺依赖造成的,可能某些依赖cL加蝲q来或初始化的时候有问题。但最l定位确定不是,l过不断折磨和探索,最后在debugӞ选择new ***()q行watchQ发现报了java.lang.NoClassDefFoundError错误Q这才开始有一点眉目?br />
最l定位问题原因:java web工程build后的WEB-INF/lib下,没有引入依赖的lib包,Dq行时出现诡异现象?br />
]]>
A、下载(最新版本)
# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
B、解压羃
# tar zxvf cronolog-1.6.2.tar.gz
C、进入cronolog安装文g所在目?br />
# cd cronolog-1.6.2
D、运行安?br />
# ./configure
# make
# make install
E、查看cronolog安装后所在目录(验证安装是否成功Q?br />
# which cronolog
一般情况下昄为:/usr/local/sbin/cronolog
2、修改tomcat启动文gcatalina.sh
B、将
org.apache.catalina.startup.Bootstrap "$@" start \ >> "$CATALINA_BASE"/logs/catalina.out 2>&1 & 替换?
org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
| cronolog "$CATALINA_BASE"/logs/catalina.out.%Y-%m-%d >> /dev/null &
重启tomcatQ则下次会在catalina.out后面加上q月日,从而按日进行日志输出?/span>
]]>
]]>
/usr/local/apache2/modules/mod_dir.so into server: /usr/local/apache2/modules/mod_dir.so: undefined symbol: apr_array_clear
.cd httpd.2.4.6
.make clean
.make
.make install
2、启动apache遇到错误Qhttpd: Could not reliably determine the server's fully qualified domain nameQ具体ؓQ?br />
#ServerName www.example.com:80
ServerName localhost:80
参考链接:
3、源码编译apache报错Q?div>configure: error: Bundled APR requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/.
解决办法Q?br />
cp -r apr-util-1.4.1 httpd-2.4.3/srclib/apr-util
参考:
]]>
<session-timeout>1</session-timeout>
</session-config>
但会话过?分钟的一Q却不清除,查看tomcat理控制収ͼ发现session 是一直递增Q从未清除过q期的session?br />
解决办法如下Q?br />1、删?TOMCAT_HOME/work目录下的所有文件?br />2、重启tomcat?br />3、完毕?img src ="http://m.tkk7.com/anchor110/aggbug/402330.html" width = "1" height = "1" />
]]>
q个30分钟左右Q具体等待时间可能略有差异,ping域名Q就能ping通了Q此Ӟ已l绑定了?br />
接下来,可以用域名替换ip讉K|站或自qWEBE序了?img src ="http://m.tkk7.com/anchor110/aggbug/391435.html" width = "1" height = "1" />
]]>
清空览器缓存,h界面卛_看到自定义效果的图标?img src ="http://m.tkk7.com/anchor110/aggbug/391431.html" width = "1" height = "1" />
]]>
]]>
解决办法Q?br />修改webwork.properties文gQ将上传文g的解析器Q修ҎpellQ如下:
#弃用jakartaQ解决中文上传文件时文g名ؕ码问?br />webwork.multipart.parser=pell
]]>
解决ҎQ?
h一下项目,有可能是盘文g和Eclipse目中文件不一致造成的?
]]>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
外能不能放一个请求在里面Q(例如下)
<welcome-file-list>
<welcome-file>index.do</welcome-file>
</welcome-file-list>
我用spring MVCQ按照以下配|?
<welcome-file-list>
<welcome-file>index.do</welcome-file>
</welcome-file-list>
启动服务器,l是?04错误Q但我在地址栏手工加入index.doӞ面正常昄Q这是ؓ什么,是不是服务器不支持这L写法Qindex.doQ?Q?Q如果支持应该如何写Q?Q?
回答:
支持...不过tomcat 会去查有没有index.doq个文g.
意思大概就是这?首先d welcome list,然后取得W一个index,然后到web中的路径中查找有没有q个文g,没有l箋W二?
然后l箋下去没有,提C没有主?
解决办法:
在你的WebRoot 下添加一个空白的文g命名?index.do
]]>
<Connector
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
<!-- Note : To disable connection timeouts, set connectionTimeout value
to 0 -->
<!-- Note : To use gzip compression you could set the following properties :
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"
-->
1) compression="on" 打开压羃功能
2) compressionMinSize="2048" 启用压羃的输出内容大,q里面默认ؓ2KB
3) noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器Q不启用压羃&<60;
4) compressableMimeType="text/html,text/xml" 压羃cd
修改完成?/p>
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla,traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" />
l查Q原因如下:
׃服务器托在IDC机房Q电信公司对80端口做了Ҏ限制Q必L工信部备案的|站Q才能开?0端口?br />
]]>
]]>
以下为网上摘抄的解决Ҏ与解惑:
#ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 1024
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 32764
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
查看某一q程打开的文件描q符
#lsof -p q程ID
java 12451 root 1w REG 8,2 6130 2297363 /opt/log.txt
java 12451 root 43u sock 0,5 6741803 can't identify protocol
]]>
一. 引言
性能试与分析是软g开发过E中介于架构和调整的一个广泛ƈ比较不容易理解的领域Q更是一较为复
杂的zd。就像下游戏一P有效的性能试和分析只能在一个良好的计划{略和具备了对不可预料事件的处理能力的条件下利地完成。一个下高手赢得比?
靠的不仅仅是Ҏ戏规则的认识Q更是靠他的自己的能力和不断C注于分析自己Ҏ的实力来更加有效地利用和发挥规则的作用。同样一个优U的性能试和分?
人员要面对的是来自一个全新的应用E序和环境下带来的整个项目的挑战。本文中作者结合自q使用l验和参考文档,对Tomcat性能斚w的调整做一?
的介l,q给出Tomcat性能的测试、分析和调整优化的一些方法?br />
? 量Web服务器的性能
?
量web服务器的性能是一让人感到畏~的dQ但是我们在q里给Z些需要注意的地方q且指点你了解其中更多的l节性的内容。它不像一些简单的dQ?
如测量CPU的速率或者是量E序占用CPU的比例,web服务器的性能优化中包括许调整许多变量来达到目标。许多的量{略中都包含了一个看似简单的?
览实际上是在向服务器发送大量的hQ我们称之ؓ客户端的E序Q来量响应旉。客L和服务器端是在同一台机器上吗?服务器在试的时候还q行着其它?
什么程序吗Q客L和服务器端的通讯是通过局域网Q?00baseTQ?0baseTq是使用调制解调器?客户端是否一直重复请求相同的面Q还是随机地
讉K不同的页面?Q这些媄响到了服务缓存的性能Q客L发送请求的有规律的q是H发的?你是在最l的配置环境下运行服务的q是在调试的配置环境下运行服?
的?客户端请求中包含囄q是只有HTML面Q是否有h是通过servlets和JSP的,CGIE序Q服务端包含QServer-
Side Includes QSSI是一个可以让你用动态HTML文g的技术)Q所有这些都是我们要关心的Qƈ且几乎我们不可能_地把所有的问题
都清楚地列出来?br />
1.压力试工具
“工欲善其事,必先利其?#8221;Q压力测试只有借助于一些工h可得以实施?br />
?
多数web压力试工具的实现原理都是通过重复的大量的面h来模拟多用户对被系l的q发讉KQ以此达C生压力的目的。生压力的手段都是通过录制
或者是~写压力脚本Q这些脚本以多个q程或者线E的形式在客Lq行Q这样通过Zؓ刉各U类型的压力Q我们可以观察被系l在各种压力状况下的表现Q从
而定位系l瓶颈,作ؓpȝ调优的基。目前已l存在的性能试工具林林L,数量不下一癄Q从单一的开放源码的免费工具如 Aapache 自带
?nbsp;web 性能试工具 Apache Benchmark、开源的Jmeter 到大而全的商业性能试软g
?nbsp;Mercury ?nbsp;LoadRunner {等。Q何性能试工具都有其优~点Q我们可以根据实际情冉|选用最合适的工具。您可以在这里找C?
web压力试工具http://www.softwareqatest.com/qatweb1.html#LOAD
q里我们所使用?
工具要支持web应用服务认证才可以,要支持接收发送cookiesQ不仅如此Tomcat支持多种认证方式Q比如基本认证、基于表单的认证、相互认证和
客户端认证,而一些工具仅仅支持HTTP基本认证。真实地模拟用户认证是性能试工具的一个重要的部分Q因证机制将对一个web站点的性能特征产生?
要的影响。基于你在品中使用的不同的认证方式Q你需要从上面的工具列表中选择使用q种Ҏ的试工具?br />
Apache Benchmark
和http_load是命令行形式的工P非常易于使用。Apache Benchmark可以模仿单独的URLhq且重复地执行,可以使用不同的命?
行参数来控制执行q代的次敎ͼq发用户数等{。它的一个特Ҏ可以周期性地打印出处理过E的信息Q而其它工具只能给Z个全局的报告?br />
2.压力试工具介绍
? 外部环境的调?/strong>
?
Tomcat和应用程序进行了压力试后,如果您对应用E序的性能l果不太满意Q就可以采取一些性能调整措施了,当然了前提是应用E序没有问题Q我们这?
只讲Tomcat的调整。由于Tomcat的运行依赖于JVMQ所以在q里我们把Tomcat的调整可以分ZcL详细描述Q?br />
外部环境调整
调整非TomcatlgQ例如Tomcatq行的操作系l和q行Tomcat的java虚拟机?br />
自n调整
修改Tomcat自n的参敎ͼ调整Tomcat配置文g中的参数?br />
下面我们详l讲解外部环境调整的有关内容QTomcat自n调整的内容将在第2部分中阐q?.JAVA虚拟机性能优化
Tomcat本n不能直接在计机上运行,需要依赖于g基础之上的操作系l和一个java虚拟机。您可以选择自己的需要选择不同的操作系l和对应?
JDK的版本(只要是符合Sun发布的Java规范的)Q但我们推荐您用Sun公司发布的JDK。确保您所使用的版本是最新的Q因为Sun公司和其它一
些公怸直在为提高性能而对java虚拟机做一些升U改q。一些报告显CJDK1.4在性能上比JDK1.3提高了将q?0%?0%?br />
可以lJava虚拟|用的内存Q但是如果你的选择不对的话Q虚拟机不会补偿。可通过命o行的方式改变虚拟Z用内存的大小。如下表所C有两个参数用来讄虚拟Z用内存的大小?br />
参数
描述
-Xms<size>
JVM初始化堆的大?br />
-Xmx<size>
JVM堆的最大?br />
q两个值的大小一般根据需要进行设|。初始化堆的大小执行了虚拟机在启动时向系l申L内存的大。一般而言Q这个参C重要。但是有的应用程序在大负
载的情况下会急剧地占用更多的内存Q此时这个参数就是显得非帔R要,如果虚拟机启动时讄使用的内存比较小而在q种情况下有许多对象q行初始化,虚拟机就
必须重复地增加内存来满使用。由于这U原因,我们一般把-Xms?Xmx设ؓ一样大Q而堆的最大值受限于pȝ使用的物理内存。一般用数据量较大的应
用程序会使用持久对象Q内存用有可能q速地增长。当应用E序需要的内存出堆的最大值时虚拟机就会提C内存溢出,q且D应用服务崩溃。因此一般徏议堆
的最大D|ؓ可用内存的最大值的80%?br />
Tomcat默认可以使用的内存ؓ128MBQ在较大型的应用目中,q点内存是不够的Q需要调大?br />
Windows下,在文件{tomcat_home}/bin/catalina.batQUnix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下讄Q?br />
JAVA_OPTS='-Xms【初始化内存大小?nbsp;-Xmx【可以用的最大内存?
需要把q个两个参数D大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存ؓ256MBQ可以用的最大内存ؓ512MB?br />
另外需要考虑的是Java提供的垃圑֛收机制。虚拟机的堆大小军_了虚拟机p在收集垃圾上的时间和频度。收集垃圑֏以接受的速度与应用有养I应该通过
分析实际的垃圾收集的旉和频率来调整。如果堆的大很大,那么完全垃圾攉׃很慢Q但是频度会降低。如果你把堆的大和内存的需要一_完全攉很
快,但是会更加频J。调整堆大小的的目的是最化垃圾攉的时_以在特定的时间内最大化处理客户的请求。在基准试的时候,Z证最好的性能Q要把堆?
大小讑֤Q保证垃圾收集不在整个基准测试的q程中出现?br />
如果pȝp很多的时间收集垃圾,请减堆大小。一ơ完全的垃圾攉应该不超
q?nbsp;3-5 U。如果垃圾收集成为瓶颈,那么需要指定代的大,查垃圾收集的详细输出Q研I?nbsp;垃圾攉参数Ҏ能的媄响。一般说来,你应该用物理内?
?nbsp;80% 作ؓ堆大。当增加处理器时Q记得增加内存,因ؓ分配可以q行q行Q而垃圾收集不是ƈ行的?br />
2.操作pȝ性能优化
q里说的操作pȝ是指q行web服务器的pȝ软gQ当Ӟ不同的操作系l是Z同的目的而设计的。比如OpenBSD是面向安全的Q因此在它的内核中有
许多的限制来防止不同形式的服务攻击(OpenBSD的一句右铭?#8220;默认是最安全?#8221;Q。这些限制或许更多地用来q行z跃的web服务器?br />
而我们常用的Linux操作pȝ的目标是易用使用Q因此它有着更高的限制。用BSD内核的系l都带有一个名?#8220;Generic”的内核,表明所有的?
动器都静态地与之相连。这样就使系l易于用,但是如果你要创徏一个自定义的内核来加强其中某些限制Q那需要排除不需要的讑֤。Linux内核中的许多
驱动都是动态地加蝲的。但是换而言之,内存现在变得来便宜,所以因为加载额外的讑֤驱动显得不是很重要的。重要的是要有更多的内存Qƈ且在服务器上
腑և更多的可用内存?br />
提C:虽然现在内存已经相当的便宜,但还是尽量不要购C宜的内存。那些有牌子的内存虽然是贵一点,但是从可靠性上来说Q性h比会更高一些?br />
如果是在Windows操作pȝ上用TomcatQ那么最好选择服务器版本。因为在非服务器版本上,最l用h权数或者操作系l本w所能承受的用户数、可用的|络q接数或其它斚w的一些方面都是有限制的。ƈ且基于安全性的考虑Q必ȝ常给操作pȝ打上最新的补丁?br />
3.Tomcat与其它web服务器整合?br />
虽然tomcat也可以作web服务?但其处理静态html的速度比不上apache,且其作ؓweb服务器的功能q不如apache,因此我们x
apache和tomcat集成hQ将html与jsp的功能部分进行明分工,让tomcat只处理jsp部分Q其它的由apache,IIS{这?
web服务器处理,由此大大节省了tomcat有限的工?#8220;U程”?br />
4.负蝲均衡
在负载均衡的思\下,多台服务器ؓ对称方式Q每台服务器都具有同{的CQ可以单独对外提供服务而无d他服务器的辅助。通过负蝲分担技术,外部发送来的请求按一定规则分配到对称l构中的某一台服务器上,而接收到h的服务器都独立回应客h的请求?br />
提供服务的一l服务器l成了一个应用服务器集群(cluster)Qƈ对外提供一个统一的地址。当一个服务请求被发至该集时Q根据一定规则选择一台服务器Qƈ服务{定向l该服务器承担,卛_负蝲q行均衡分摊?br />
通过应用负蝲均衡技术,使应用服务超q了一台服务器只能为有限用h供服务的限制Q可以利用多台服务器同时为大量用h供服务。当某台服务器出现故?
Ӟ负蝲均衡服务器会自动q行ƈ停止服务请求分发至该服务器Q而由其他工作正常的服务器l箋提供服务Q从而保证了服务的可靠性?br />
负蝲均衡实现的方式大概有四种Q第一是通过DNSQ但只能实现单的轮流分配Q不能处理故障,W二如果是基?
MS IISQWindows 2003 server本n带了负载均衡服务,W三是硬件方式,通过交换机的功能或专门的负蝲均衡讑֤可以实现Q第四种
是Y件方式,通过一台负载均衡服务器q行Q上面安装Y件。用Apache Httpd Server做负载^衡器QTomcat集群节点使用
Tomcat可以做C上第四种方式。这U方式比较灵z,成本相对也较低。另外一个很大的优点是可以Ҏ应用的情况和服务器的情况采取一些策略?nbsp;
? 自n调整
?
节将向您详细介绍一些加速可使Tomcat实例加速运行的技巧和ҎQ无论是在什么操作系l或者何UJava虚拟Z。在有些情况下,您可能没有控刉|?
环境上的操作pȝ或者Java虚拟机。在q种情况下,您就需要逐行了解以下的的一些徏议,然而你应该在修改后使之生效。我认ؓ以下Ҏ是Tomcat性能
自n调整的最x式?br />
1.用DNS查询
当web应用E序向要记录客户端的信息Ӟ它也会记录客L的IP地址
或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网l,q且包括可能从很多很q的服务器或者不起作用的服务器上去获取对应的IP的过E,
q样会消耗一定的旉。ؓ了消除DNS查询Ҏ能的媄响我们可以关闭DNS查询Q方式是修改server.xml文g中的enableLookups参数
|
Tomcat4
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" />
Tomcat5
<Connector port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true"/>
除非你需要连接到站点的每个HTTP客户端的机器名,否则我们在生产环境上关闭DNS查询功能。可以通过Tomcat以外的方式来获取机器名。这?
不仅节省了网l带宽、查询时间和内存Q而且更小的流量会使日志数据也会变得更,显而易见也节省了硬盘空间。对量较小的站Ҏ说禁用DNS查询可能没有
大流量站点的效果明显Q但是此举仍不失Z良策。谁又见C个低量的网站一夜之间就量大增呢?
2.调整U程?br />
另外一个可通过应用E序的连接器QConnectorQ进行性能控制的的参数是创建的处理h的线E数。Tomcat使用U程池加速响应速度来处理请
求。在Java中线E是E序q行时的路径Q是在一个程序中与其它控制线E无关的、能够独立运行的代码Dc它们共享相同的地址I间。多U程帮助E序员写?
CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的h?br />
Tomcat4中可以通过修改minProcessors?
maxProcessors的值来控制U程数。这些值在安装后就已经讑֮为默认值ƈ且是_使用的,但是随着站点的扩容而改大这些倹{?
minProcessors服务器启动时创徏的处理请求的U程数应该够处理一个小量的负蝲。也是_如果一天内每秒仅发?ơ单MӞq且每个h
d处理需?U钟Q那么预先设|线E数?p够了。但在你的站点访问量较大时就需要设|更大的U程敎ͼ指定为参数maxProcessors的倹{?
maxProcessors的g是有上限的,应防止流量不可控Ӟ或者恶意的服务dQ,从而导致超Z虚拟Z用内存的大小。如果要加大q发q接敎ͼ
应同时加大这两个参数。web server允许的最大连接数q受制于操作pȝ的内核参数设|,通常Windows?000个左叻ILinux?
1000个左叟?br />
在Tomcat5对这些参数进行了调整Q请看下表:
属性名
描述
maxThreads
Tomcat使用U程来处理接收的每个h。这个DCTomcat可创建的最大的U程数?br />
acceptCount
指定当所有可以用的处理h的线E数都被使用Ӟ可以攑ֈ处理队列中的h敎ͼ过q个数的h不予处理?br />
connnectionTimeout
|络q接时Q单位:毫秒。设|ؓ0表示怸时Q这栯|有隐患的。通常可设|ؓ30000毫秒?br />
minSpareThreads
Tomcat初始化时创徏的线E数?br />
maxSpareThreads
一旦创建的U程过q个|Tomcat׃关闭不再需要的socketU程?br />
最好的方式是多讄几次q且q行试Q观察响应时间和内存使用情况。在不同的机器、操作系l或虚拟机组合的情况下可能会不同Q而且q不是所有h的web站点的流量都是一LQ因此没有一刀切的Ҏ来确定线E数的倹{?br />
3.加速JSP~译速度
当第一ơ访问一个JSP文gӞ它会被{换ؓJava serverlet源码Q接着被编译成Java字节码。你可以控制使用哪个~译器,默认情况下,Tomcat使用使用命o行javacq行使用的编译器。也可以使用更快的编译器Q但是这里我们将介绍如何优化它们?br />
另外一U方法是不要把所有的实现都用JSP面Q而是使用一些不同的java模板引擎变量。显然这是一个跨很大的军_Q但是事实证明至这U方法是
只得研究的。如果你想了解更多有兛_Tomcat可用的模板语言Q你可以参考Jason Hunter和William Crawford合著?
《Java Servlet Programming 》一书(O'Reilly公司出版Q?br />
在Tomcat 4.0中可以用流?
而且免费的Jikes~译器。Jikes~译器的速度要由于Sun的Java~译器。首先要安装JikesQ可讉K
http://oss.software.ibm.com/pub/jikes 获得更多的信息)Q接着需要在环境变量中设|JIKESPATH包含pȝ
q行时所需的JAR文g。装好Jikes以后q需要设|让JSP~译servlet使用JikesQ需要修改web.xml文g?
jspCompilerPlugin的|
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>
org.apache.jasper.servlet.JspServlet
</servlet-class><init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<init-param>
<param-name>jspCompilerPlugin</param-name>
<param-value>
org.apache.jasper.compiler.JikesJavaCompiler
</param-value>
</init-param>
<init-param>
<!-- <param-name>
org.apache.catalina.jsp_classpath
</param-name> -->
<param-name>classpath</param-name>
<param-value>
/usr/local/jdk1.3.1-linux/jre/lib/rt.jar:
/usr/local/lib/java/servletapi/servlet.ja
r</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
在Tomcat 4.1Q或更高版本Q,JSP的编译由包含在Tomcat里面的AntE序控制器直接执行。这听v来有一点点奇怪,但这正是Ant有意
Z的一部分Q有一个API文档指导开发者在没有启动一个新的JVM的情况下Q用Ant。这是用Antq行Java开发的一大优ѝ另外,q也意味着
你现在能够在Ant中用Q何javac支持的编译方式,q里有一个关于Apache Ant使用手册的javac page列表。用v来是Ҏ的,?
Z只需要在 元素中定义一个名字叫“compiler”Qƈ且在value中有一个支持编译的~译器名字,CZ如下Q?br />
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>
org.apache.jasper.servlet.JspServlet
</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<init-param>
<param-name>compiler</param-name>
<param-value>jikes</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
Ant可用的编译器
名称
别名
调用的编译器
classic
javac1.1, javac1.2
Standard JDK 1.1/1.2 compiler
modern
javac1.3, javac1.4
Standard JDK 1.3/1.4 compiler
jikes
The Jikes compiler
JVC Microsoft
Microsoft command-line compiler from the Microsoft SDK for Java/Visual J++
KJC The kopi compiler
GCJ The gcj compiler (included as part of gcc)
SJ Symantec
Symantec's Java compiler
extJavac
Runs either the modern or classic compiler in a JVM of its own
׃JSP面在第一ơ用时已经被编译,那么你可能希望在更新新的jsp面后马上对它进行编译。实际上Q这个过E完全可以自动化Q因为可以确认的是新的JSP面在生产服务器和在试服务器上的运行效果是一L?nbsp;
在Tomcat4的bin目录下有一个名为jspc的脚本。它仅仅是运行翻译阶D,而不是编译阶D,使用它可以在当前目录生成Java源文件。它是调试JSP面的一U有力的手段?br />
可以通过览器访问再认一下编译的l果。这样就保了文件被转换成serverletQ被~译了可直接执行。这样也准确地模仿了真实用户讉KJSP面Q可以看到给用户提供的功能。也抓紧q最后一M改出现的bugq且修改它J
Tomcat提供了一U通过h来编译JSP面的功能。例如,你可以在览器地址栏中输入http://localhost:8080
/examples/jsp/dates/date.jsp?jsp_precompile=trueQ这样Tomcat׃~译data.jsp而不?
执行它。此丑֔手可得,不失ZU检验页面正性的捷径?br />
4. 其它
前面我们提到q操作系l通过一些限制手D|防止恶意的服务攻击,同样Tomcat也提供了防止恶意d或禁止某些机器访问的讄?br />
Tomcat提供了两个参C你配|:RemoteHostValve 和RemoteAddrValve?nbsp;
通过配置q两个参敎ͼ可以让你qo来自h的主机或IP地址Qƈ允许或拒l哪些主?IP。与之类似的Q在Apache的httpd文g里有Ҏ个目录的允许/拒绝指定?nbsp;
例如你可以把Admin Web application讄成只允许本地讉KQ设|如下:
<Context path="/path/to/secret_files" ...>
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.0.0.1" deny=""/>
</Context>
如果没有l出允许L的指定,那么与拒l主机匹配的L׃被拒l,除此之外的都是允许的。与之类|如果没有l出拒绝L的指定,那么与允怸机匹配的L׃被允许,除此之外的都是拒l的?br />
? 定w计划
定w计划是在生环境中用Tomcat不得不提的提高性能的另一个重要的话题。如果你没有寚w期的|络量下的g和带宽做考虑的话那么无论你如何做配置修改和测试都无济于事?br />
q里先对提及的容量计划作一个简要的定义Q容量计划是指评估硬件、操作系l和|络带宽Q确定应用服务的服务范围Q寻求适合需求和软gҎ的软硬件的一Ҏ动。因此这里所说的软g不仅包括TomcatQ也包括与Tomcatl合使用的Q何第三方web服务器Y件?br />
如果在购买Yg或部|系l前你对定w计划一无所知,不知道现有的软硬件环境能够支撑多的讉K量,甚至更糟直到你已l交付ƈ且在生环境上部|品后
才意识到配置有问题时再进行变更可能ؓ时已晚。此时只能增加硬件投入,增加盘定w甚至购买更好的服务器。如果事先做了容量计划那么就不会搞的如此焦头?
额了?br />
我们q里只介l与Tomcat相关的内宏V?br />
首先Z定Tomcat使用机器的容量计划,你应该从一下列表项目种着手研I和计划Q?br />
1. g
采用什么样的硬件体p?需要多台计算机?使用一个大型的Q还是用多台小型机Q每个计机上用几个CPUQ用多内存?使用什么样的存储设
备,I/O的处理速度有什么要求?怎样l护q些计算机?不同的JVM在这些硬件上q行的效果如何(比如IBM AIXpȝ只能在其设计的硬件系l上q?
行)Q?br />
2. |络带宽
带宽的用极限是多少Qweb应用E序如何处理q多的请求?
3. 服务端操作系l?br />
采用哪种操作pȝ作ؓ站点服务器最好?在确定的操作pȝ上用哪个JVM最好?例如QJVM在这U系l上是否支持本地多线E,对称多处理?哪种pȝ可web服务器更快、更E_Qƈ且更便宜。是否支持多CPUQ?nbsp;
4. Tomcat定w计划
以下介绍针对Tomcat做容量计划的步骤Q?br />
1Q?nbsp;量化负蝲。如果站点已l徏立ƈq行Q可以用前面介l的工具模仿用户讉KQ确定资源的需求量?br />
2Q?nbsp;针对试l果或测试过E中q行分析。需要知道那些请求造成了负载过重或者用过多的资源Qƈ与其它请求做比较Q这样就定了系l的瓉所在。例如:如果servlet在查询数据库的步骤上耗用较长的时_那么需要考虑使用~冲池来降低响应旉?br />
3Q?nbsp;定性能最低标准。例如,你不惌用户?0U来{待l果面的返回,也就是说甚至在达到访问量的极限时Q用L待的旉也不能超q?0U种Q从
点击链接到看到返W一条返回数据)。这个时间中包含了数据库查询旉和文件访问时间。同cM品性能在不同的公司可能有不同的标准Q一般最好采取同行中的最
低标准或对这个标准做估?br />
4Q?nbsp;定如何合理使用底层资源Qƈ逐一q行试。底层资源包括CPU、内存、存储器、带宽、操作系
l、JVM{等。在各种生环境上都按顺序进行部|和试Q观察是否符合需求。在试Tomcat时尽量多采用几种JVMQƈ且调整JVM使用内存?
TomcatU程池的大小q行试。同时ؓ了达到资源充分合理稳定地使用的效果,q需针对试q程中出现的gpȝ瓉q行处理定合理的资源配|。这?
q程最为复杂,而且一般由于没有可参考的值所以只能靠理论推断和经验ȝ?br />
5Q?nbsp;如果通过W?步的反复试如果辑ֈ了最优的l合Q就可以在相同的生环境上部|品了?br />
此外应牢C定要文档化你的测试过E和l果Q因为此后可能还会进行测试,q样可以拿以前的测试结果做为参考。另外测试过E要反复多次q行Q每ơ的条g可能都不一P因此只有记录下来才能q行l果比较和最x件的选择?br />
q样我们通过试扑ֈ了最好的l合方式Q各U资源得C合理的配|,pȝ的性能得到了极大的提升?br />
? 附加资料
很显然本文也很难全面而详地阐述性能优化q程。如果你q行更多研究的话可能会把性能调优做的更好Q比如JavaE序的性能调整、操作系l的调整、各U复
杂环境与应用pȝ和其它所有与应用E序相关的东ѝ在q里提供一些文中提到的一些资源、文中提到的相关内容的链接以及本文的一些参考资料?br />
1. Web性能试资料及工?br />
1Q?nbsp;Jmeter Wiki首页QJmeterZ个开源的100%Java开发的性能试工具
http://wiki.apache.org/jakarta-jmeter/
2Q?nbsp;Apache Benchmark使用说明
http://httpd.apache.org/docs-2.0/programs/ab.html
3Q?nbsp;一些Java相关试工具的介l,包含可以与Tomcat集成q行试的工?br />
http://blog.csdn.net/wyingquan/
4Q?nbsp;LoadRunner? 是一U预系l行为和性能的工业标准负蝲试工具。它通过模拟数据以千万计用户来实施ƈ发负载来Ҏ个企业架构进行测试,来帮助您更快的查扑֒发现问题?br />
http://www.mercury.com/us/products/performance-center/loadrunner/
2. 文中介绍的相兛_容的介绍
1Q?nbsp;Apache 2.x + Tomcat 4.x做负载均衡,描述了如何利用jk配置集群的负载均衡?br />
http://raibledesigns.com/tomcat/index.html
2Q?nbsp;定w计划的制定,攉了许多有兛_定web站点定w计划的例子:
http://www.capacityplanning.com/
3Q?nbsp;评测Tomcat5负蝲q与集,
http://www.javaresearch.org/article/showarticle.jsp?column=556&thread=19777
4Q?nbsp;Apache与Tomcat的安装与整合之整合篇
http://www.javaresearch.org/article/showarticle.jsp?column=23&thread=18139
5Q?nbsp;性能试工具之研IӞ介绍了性能试工具的原理与思\
http://www.51testing.com/emagzine/No2_2.htm
6Q?nbsp;Java的内存泄?br />
http://www.matrix.org.cn/resource/article/409.html
7Q?nbsp;Web服务器和应用E序服务器有什么区别?
http://www.matrix.org.cn/resource/article/1429.html
8Q?nbsp;详细讲解性能中数据库集群的问?br />
http://www.theserverside.com/articles/article.tss?l=DB_Break
]]>
W一步,打开׃n的线E池
默认前后是注?lt;!-- -->掉的Q去掉就可以了。其?
name
The name used to reference this pool in other places in server.xml. The name is required and must be unique.
q个是线E池的名字,必须唯一Q我们在后面的配|里要用到这个东?
namePrefix
(String) The name prefix for each thread created by the executor.
The thread name for an individual thread will be namePrefix+threadNumber
U程的名字前~Q用来标记线E名字的Q这h个线E就用这个前~加上U程~号了,比如
catalina-exec-1
catalina-exec-2
maxThreads
(int) The max number of active threads in this pool, default is 200
允许的最大线E池里的U程数量Q默认是200Q大的ƈ发应该设|的高一些,反正只是限制而已Q不占用资源
minSpareThreads
(int) The minimum number of threads always kept alive, default is 25
最的保持z跃的线E数量,默认?5.q个要根据负载情况自行调整了。太了媄响反应速度Q太大了白白占用资源?
maxIdleTime
(int) The number of milliseconds before an idle thread shutsdown,
unless the number of active threads are less or equal to
minSpareThreads. Default value is 60000(1 minute)
过最活跃线E数量的U程Q如果空闲时间超q这个设|后Q会被关别。默认是1分钟?
threadPriority
(int) The thread priority for threads in the executor, the default is Thread.NORM_PRIORITY
U程的等U。默认是Thread.NORM_PRIORITY
W二?
?Connector里指定用共享线E池
注意Q一旦用了U程池,则其它的U程属性,比如 maxThreads{将被忽?
我测试了一下,׃每次h不再需要重新分配线E,pȝ响应速度q是有很明显的改善的?
]]>
环境说明
Apache :apache_2.0.55 1 ?/p>
Tomcat: apache-tomcat-5.5.17 (zip? 2?/p>
mod_jk:: mod_jk-apache-2.0.55.so 1?/p>
W一部分Q负载均?/strong>
负蝲均衡Q就是apache客戯求均衡的分给tomcat1,tomcat2....d?/p>
1.安装apche,tomcat
http://httpd.apache.org/ 下蝲Apache 2.0.55
http://tomcat.apache.org/download-55.cgi 下蝲tomcat5.5 zip版本Q解压即可,l色版)
http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/ 下蝲mod_jk,注意?nbsp; apache版本匚w
按照jdk,我的路径?E:"ide"apache"Apache2
解压两䆾Tomcat, 路径分别?E:"ide"tomcat1,E:"ide"tomcat2
下蝲mod_jk
2.修改Apache配置文ghttp.conf
在apache安装目录下conf目录中找到http.conf
在文件最后加上下面一句话可以了
include "E:"ide"apache"Apache2"conf"mod_jk.conf"
Tomcat ?strong style="background-color: rgb(153, 255, 153); color: black;">U程?/strong>位于tomcat-util.jar文g中,包含了两U?strong style="background-color: rgb(153, 255, 153); color: black;">U程?/strong>Ҏ?/font>
Ҏ一Q用APR的Pool技术,使用了JNIQ?/font>
Ҏ二:使用Java实现的ThreadPool。这里介l的是第二种。如果想了解APR的Pool技术,可以查看APR的源代码?/font>
ThreadPool默认创徏?个线E,保存在一?00l的U程数组中,创徏时就启动了这些线E,当然在没有请求时Q它们都处理“{待”状态(其实是一个while循环Q不停的{待notifyQ。如果有hӞI闲U程会被唤醒执行用户的请求?/font>
具体的请求过E是Q? 服务启动Ӟ创徏一个一l线E数l(maxThreadQ?00个)Qƈ创徏I闲U程(minSpareThreadsQ??随时{待用户h? 当有用户hӞ调用 threadpool.runIt(ThreadPoolRunnable)ҎQ将一个需要执行的实例传给ThreadPool中。其中用户需要执行的 实例必须实现ThreadPoolRunnable接口?ThreadPool 首先查找I闲的线E,如果有则用它q行要执行ThreadPoolRunnableQ如果没有空闲线Eƈ且没有超qmaxThreadsQ就一ơ性创? minSpareThreads个空闲线E;如果已经过了maxThreads了,q待空闲线E了。MQ要扑ֈI闲的线E,以便用它执行实例。找? 后,该U程从线E数l中U走?接着唤醒已经扑ֈ的空闲线E,用它q行执行实例QThreadPoolRunnableQ? q行完ThreadPoolRunnable后,将该线E重新放到线E数l中Q作为空闲线E供后箋使用?
由此可以看出QTomcat?strong style="background-color: rgb(153, 255, 153); color: black;">U程?/strong>实现是比较简单的QThreadPool.java也只?40行代码。用一个一l数l保存空闲的U程Q每ơ以一个较步伐(5个)创徏I闲U程q放?strong style="background-color: rgb(153, 255, 153); color: black;">U程?/strong>中。用时从数l中U走I闲的线E,用完后,?#8220;归还”l?strong style="background-color: rgb(153, 255, 153); color: black;">U程?/strong>?/font>
tomcat5.5.10以上版本支持aprQ支持通过apache runtime moduleq行JNI调用Q用本C码来加速网l处理?
如果不用apr之前QTomcat的ServletU程池用的是阻塞IO的模式,使用apr之后Q线E池变成?
NIO的非d模式Q而且q种NIOq是使用了操作系l的本地代码Q看tomcat文档上面的说法是Q极大提升web处理能力Q不再需要专门放一个web
server处理静态页面了?
我自q观的感受是,不用apr之前Q你配置多少个等待线E,tomcat׃启动多少个线E挂L待,使用apr以后Q不你配置多少Q就只有几个NIO调度的线E,q一点你可以通过kill -3 PIDQ然后察看log得知?
假设不用aprQ可能端口的U程调度能力比较差,所以通过iptablesq行端口转发Q让两个端口d担一个端口的U程调度Q就有可能减线E调度的q发Q从而提高处理能力,减少资源消耗?/font>
This page requires Java5 with enabled JMX Agent. To enable the JXM Agent please add "-Dcom.sun.management.jmxremote" to java command line or $JAVA_OPTS environment variable.
解决办法如下Q?/span>
Vi /usr/local/tomcat/bin/catalina.sh
CATALINA_HOME=/usr/local/tomcat
JAVA_OPTS="-Xms512m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote"
再重启服务器卛_?br />