起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1290|回复: 5

[分享] tomcat应用服务器性能优化**

[复制链接]
发表于 2008-6-2 11:55:03 | 显示全部楼层 |阅读模式
1.jvm的server版和client版

Jvm动态库有client和server两个版本,分别针对桌面应用和服务器应用做了相应的优化,client版本加 载速度较快,server版本加载速度较慢但运行起来较快。

在命令行 java -version 可以看到jvm配置的是哪个版本。

如果要修改jvm的版本

%JAVA_HOME%/jre/bin/client/jvm.dll

%JAVA_HOME%/jre/bin/server/jvm.dll

可以看到这两个jvm.dll的大小不同。


更改默认java.exe调用的jvm.dll,这个由jvm.cfg决定。

编辑%JAVA_HOME%/jre/lib/i386/jvm.cfg
里面第一行写的是 -client 默认就是client版本 ,把第二行的-server KNOWN 放到第一行, 如下面所示

-server KNOWN
-client KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR

然后重启tomcat,在命令行下

java -version

就可以看到类似的信息
java version "1.5.0_04"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)
Java HotSpot(TM) Server VM (build 1.5.0_04-b05, mixed mode)
回复

使用道具 举报

 楼主| 发表于 2008-6-2 14:55:22 | 显示全部楼层

2.JAVA虚拟机性能优化

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机,您可以选择自己的需要选择不同的操作系统和对应的JDK的版本(只要是符合Sun发布的Java规范的),但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的,因为Sun公司和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%,平台默认使用的jdk版本是1.5,在使用过程中可以去sun的官方网站下载最新的jdk版本替换就可以。

可以给Java虚拟机设置使用的内存,可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。

-Xms<size>
JVM初始化堆的大小

-Xmx<size>
JVM堆的最大值


这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%(如果操作系统只用tomcat,没有其他软件,比如数据库的情况下可以这么考虑),但是JVM 的可分配的内存最大值在不同的操作系统,不同版本的jvm中是不一样的。下面是几个分析了当前比较流行的几个不同公司不同版本JVM的最大内存,得出来的结果如下:

公司 JVM版本    最大内存(兆)client     最大内存(兆)server
SUN  1.5.x                1492                           1520
SUN 1.5.5(Linux)       2634                           2660
SUN 1.4.2 1564 1      564
SUN 1.4.2(Linux)       1900                           1260
IBM 1.4.2(Linux) 2047 N/A
BEA JRockit 1.5 (U3) 1909                           1902
实际发现版本上有细微差别的JDK最大容许内存值都不尽相同,因此在实际的应用中还是要自己试验一下看到底内存能达到什么样的值。
如何知道我们使用的版本jvm最大能使用多大的内存呢?在命令行下用 java -XmxXXXXM -version 命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息。
如果机器的内存足够大,但jvm的最大内存和机器的物理内存比较起来也只是其中的一少部分,为了充足的利用这些内存可以分开几个tomcat来运行,比如吧系统服务与文档服务分别用一个tomcat来运行。

[B]
平台默认给jvm分配的内存最大值是:1024M[/B] ,如何在tomcat中调整jvm的内存值呢?
Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下设置:

  JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'

  需要把这个两个参数值调大。例如:

  JAVA_OPTS='-Xms256m -Xmx512m'

  表示初始化内存为256MB,可以使用的最大内存为512MB。
另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。

  如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-2 15:19:12 | 显示全部楼层

3.TOMCAT自身调整

1)禁用DNS查询
 当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值:

<Connector port="8081" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" [B]enableLookups="false" [/B]  redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true"/>  

除非你需要连接到服务器的每个HTTP客户端的机器名,否则我们建议在生产环境上关闭DNS查询功能。可以通过Tomcat以外的方式来获取机器名。这样不仅节省了网络带宽、查询时间和内存,而且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间。

2)调整线程数

  另外一个可通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。Tomcat使用线程池加速响应速度来处理请求。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU 最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。

  Tomcat4中可以通过修改minProcessors和 maxProcessors的值来控制线程数。这些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。 minProcessors服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就是说,如果一天内每秒仅发生5次单击事件,并且每个请求任务处理需要1秒钟,那么预先设置线程数为5就足够了。但在你的站点访问量较大时就需要设置更大的线程数,指定为参数maxProcessors的值。 maxProcessors的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。

  在Tomcat5对这些参数进行了调整,请看下表:
属性名
描述

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

acceptCount
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。

connnectionTimeout
网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

minSpareThreads
Tomcat初始化时创建的线程数。

maxSpareThreads
一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。



  最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的web站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值。

[B]我们在调整上面几个参数大小的时候不要一次设置的太大,应该采用少量多次的方法进行。[/B]
回复 支持 反对

使用道具 举报

发表于 2009-8-7 16:03:02 | 显示全部楼层
按1楼说的没效果呀,把配置文件改完后,检查版本依然是client
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-7 16:54:08 | 显示全部楼层
远程解决了
回复 支持 反对

使用道具 举报

发表于 2011-9-20 17:30:07 | 显示全部楼层
请问是怎样解决的呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-23 01:40 , Processed in 0.036648 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表