
如何优化提高tomcat启动速度.doc
27页如何优化提高 tomcat 启动速度在 tomcat 启动的时候,我们可以做一些优化设置来使得 tomcat 的启动更快速,下面是一些常见的优化加速启动的方法建议(以 tomcat-7.+为例说明)1、 Jars 包1.1、将一些不必要的 jar 包去掉,当 tomcat 启 动加载 jar 包的时候,会去搜寻每个 jar 包里的 class 文件,这些都会耗费一些时间,如果你把不必要的jar 包去掉了,很 显然会节省时间1.2、你可以将一些与 TLD files、注解、网络碎片无关的 jar 包加入到属性tomcat.util.scan.DefaultJarScanner.jarsToSkip 的值中,这可以在conf/catalina.properties 中进行设置2、 缓 存你可以在 bin/catalina.sh 中设置 jvm 所能使用到的缓存大小,如下:JAVA_OPTS=’-Xms1024m -Xmx1024m’3、 配置文件Tomcat 的配置比如 server.xml 是 xml 文件,而 xml 的解析也是要花时间的,如果我们能将 xml 配置文件尽可能地弄得 简洁一些,比如去掉一些没有用到的节点,这也有助于减少启动的时间,虽然这个节省的时间看来很少。
4、 应 用程序4.1、确保你程序在启动的时候没有一些处理很耗时的地方4.2、删除掉 tomcat 自带的目录 webapps 及下面的所有内容,不然的话每次启动的时候都会加载这些自带的例子4.3、修改 WEB-INF/web.xml 文件,在默认的情况下 中的属性metadata-complete 的值为 false,也就是这样:,这种情况下,tomcat 在启动时会去自动扫描是否有注解及网络碎片,如果你不想 tomcat 这样做,你可以将 metadata-complete的值设为 true5、 并行启动多个应用程序默认情况下,假设在一个 tomcat 下你有多个应用,那么启 动的时候,这些应用程序都是依次启动的,除非所有应用全部启动完毕,tomcat 才会启动完成,但从 Tomcat 7.0.23+开始,你可以配置多个 应用程序并行启动了!你可以通过修改配置文件中 Host 里面的 startStopThreads 这个属性的值来达到这个目的,将多个应用 startStopThreads 的值设为不同即可6、 Entropy SourceTomcat 7+严重依赖 SecureRandom 这个类为 它的 session id 或其它地方取得随机数值,这取决于你的 JRE,它有可能在 tomcat 启动时造成非常大的耗时,比如,在子猴启动 tomcat-7.0.26 的时候,它耗时近 25 秒!INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [24,790] milliseconds.要解决这个问题,可以通过配置 JRE 使用非阻塞的 Entropy Source,在bin/ catalina.sh 中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。
1 概述 本文档主要介绍了 Tomcat 的性能调优的原理和方法可作为公司技术人员为客户 Tomcat 系统调优的技术指南,也可以提供给客户的技术人员作为他们性能调优的指导手册2 调优分类 由于 Tomcat 的运行依赖于 JVM,从虚拟机的角度我们把 Tomcat 的调整分为外部环境调优和自身调优两类来描述 2.1 外部 环境调优 调整 Tomcat 运行环境的操作系统参数和运行 Tomcat 的 java 虚拟机参数 2.1.1 JAVA 虚拟机性能优化 Tomcat 需要依赖 Java 虚拟机运行根据客户选用的主机的操作系统选择对应的 JDK 的版本无论哪个厂商的 JDK,都建议使用最新的版本 虚拟机可通过命令行的方式改变虚拟机使用内存的大小如下表所示有两个参数用来设置虚拟机使用内存的大小 参数 描述 -Xms JVM 初始化堆的大小 -Xmx JVM 堆的最大值 Tomcat 默认可以使用的内存为 128MB,在较大型的应用项目中,这点内存是不够的,需要调大。
[LD1] Windows 下,在文件 tomcat_home/bin/catalina.bat,Unix 下,在文件 tomcat_home/bin/catalina.sh 的前面,增加如下 设置:JAVA_OPTS=‘-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】’' 需要把这个两个参数值调大例如:[html] view plaincopyJAVA_OPTS='-Xms256m -Xmx512m' 表示初始化内存为 256MB,可以使用的最大内存为 512MB 另外需要考虑的是 Java 提供的垃圾回收机制虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整如果堆的空间很大,那么完全垃圾收集(FULL GC)就会很慢,但是频度会降低如果在客户系统中把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求对于 SUN 和 HP 等虚拟机,推荐将最小堆大小和最大堆大小设置为同一值,因为这样可以避免浪费用于时常调整堆大小所需的 VM 资源。
当然,客户系统如果用到 IBM 虚拟机,要特别的注意设置-Xms 和-Xmx 一样大小会耽误垃圾回收的开始直到堆 满, 这样第一次垃圾回收就会变成非常昂贵的操作推荐把-Xms 设置为应用所需的最小 值,这样会产生高效的垃圾回收2.1.2 操作系统性能优化 以客户系统为 HP-UX 为例 HP 系统中对 Tomcat 有影响的参数: 其中: max_thread_proc: 一个进程所能创建的线程的最大数 nkthread: 在系统上同时 允许的核心线程的最大数 maxfiles 上表给的建议是不是不合适? 如果在输出里看到消息:java.lang.OutOfMemoryError: unable to create new native thread,则说 明名为 max_thread_proc 的 Unix 内核设置过小max_thread_proc 是单个进程中的最大线程数 它必须大到能够容纳 Java 应用程序中的所有线程以及虚拟机本身中的部分额外线程查看核心参数:$ulimit -a 显示[LD2] 输出中的 nofiles 是指用户的进程能同时打开的最大文件句柄数。
如果日志中出现”two many open files”的异常,需要重点检查这个参数coredump 参数是 core 文件最大值的,限制当进程 coredump 时将产生 core 文件的大小不能超过这个最大值如果在日志文件检查时,发现 core 文件不完整,需要增大这个参数值执行 ulimit -n 命令可以设置 nofiles 参数,执行 ulimit -c 命令设置 core 文件最大值如果是在 Windows 操作系统上使用 Tomcat,那么最好选择服务器版本因为在非服务器版本上,最终用户授权数或者操作系统本身所能承受的用户数、可用的网络连接数或其它方面的一些方面都是有限制的并且基于安全性的考虑,必须经常给操作系统打上最新的补丁2.1.3 Tomcat 与其它 web 服务器整合使用 虽然 tomcat 也可以作 web 服务器,但其处理静态 html 的速度比不上apache,且其作为 web 服务器的功能远不如 apache,因此我们想把 apache和 tomcat 集成起来,将 html 与 jsp 的功能部分进行明确分工,让 tomcat只处理 jsp 部分,其它的由 apache,IIS 等这些 web 服务器处理,由此大大节省了 tomcat 有限的工作线程[LD3] 。
2.2 自身 调优 本节将说明 Tomcat 性能调优的技巧和方法,这些技巧和方法与操作系统或Java 虚拟机的种类无关以下方法都是针对 Tomcat 性能自身调整的最佳方式 2.2.1 禁用 DNS 查询 当 web 应用程序要记录客户端的信息时,它也会 记录客户端的 IP 地址或者通过域名服务器查找机器名转换为 IP 地址DNS 查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的 IP 的过程,这样会消耗一定的时间为了消除 DNS 查询对 性能的影响我们可以关闭DNS 查询,方式是修改 server.xml 文件中的 enableLookups 参数值:不同的 tomcat 版本稍有不同 Tomcat4[html] view plaincopyTomcat5[html] view plaincopy除非客户需要连接到站点的每个 HTTP 客户端的机器名,否则我们建议在生产环境上关闭 DNS 查询功能可以通过 Tomcat 以外的方式来获取机器名这样不仅节省了网络带宽、查询时间和内存,而且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间。
对流量较小的站点来说禁用DNS 查询可能没有大流量站点的效果明显2.2.2 调整线程数 另外一个可通过应用程序的连接器(Connector)进行性能控制的参数是创建的处理请求的线程数Tomcat 使用线程池加速响应速度来处理请求在 Java 中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段它们共享相同的地址空间多线程帮助程序员写出CPU 最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求Tomcat4 中可以通 过修改 minProcessors 和 maxProcessors 的值来控制线程数这些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值minProcessors 服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载也就是说,如果一天内每秒仅发生 5 次单击事件,并且每个请求任务处理需要 1 秒钟,那么预先设置线程数为 5 就足够了但在你的站点访问量较大时就需要设置更大的线程数,指定为参数maxProcessors 的值maxProcessors 的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。
如果要加大并发连接数,应同时加大这两个参数web server 允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右,Linux是 1000 个左右 在 Tomcat5 对这 些参数进行了调整,请 看下表: 最好的方式是多设置几次并且进行测试,观 察响应时间和内存使用情况在不同的机器、操作系统或虚拟机组合的情况下可能会不同,而且并不是所有的 web 站点的流量都是一样的,因此没有一刀切的方案来确定线程数的值2.2.3 加速 JSP 编译 速度 当第一次访问一个 JSP 文件时,它会被转换为 Java servlet 源码,接着被编译成 Java 字节码客户工程师可以控制使用哪。
