`

9、tomcat调优

    博客分类:
  • mvc
 
阅读更多
由于Tomcat的运行依赖于JVM,从虚拟机的角度我们把Tomcat的调整分为外部环境调优自身调优两类来描述。

1.1、外部环境调优
调整Tomcat运行环境的操作系统和运行Tomcat的java虚拟机参数。

1.1.1、JAVA虚拟机性能优化(增大内存,优化gc时间)
Tomcat需要依赖Java虚拟机运行。根据客户选用的主机的操作系统选择对应的 JDK的版本。无论哪个厂商的JDK,都建议使用最新的版本。
虚拟机可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。
参数描述
-Xms<size>JVM初始化堆的大小
-Xmx<size>JVM堆的最大值

Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。
Windows下,在文件tomcat_home/bin/catalina.bat
Unix下,在文件tomcat_home/bin/catalina.sh的前面,增加如下设置:
  JAVA_OPTS=‘-Xms【初始化内存大小,最小内存】 -Xmx【可以使用的最大内存】’'
  需要把这个两个参数值调大。例如:
  JAVA_OPTS='-Xms256m -Xmx512m'
  表示初始化内存为256MB,可以使用的最大内存为512MB。

另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。

如果堆的空间很大,那么完全垃圾收集(FULL GC)就会很慢,但是频度会降低。如果在客户系统中把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。对于SUN和HP等虚拟机,推荐将最小堆大小和最大堆大小设置为同一值,因为这样可以避免浪费用于时常调整堆大小所需的 VM 资源。

当然,客户系统如果用到IBM虚拟机,要特别的注意设置-Xms和-Xmx一样大小会耽误垃圾回收的开始直到堆满,这样第一次垃圾回收就会变成非常昂贵的操作。推荐把-Xms设置为应用所需的最小值,这样会产生高效的垃圾回收。

1.1.2、操作系统调优
对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,CPU的处理能力越强,系统运行速度越快。
:一个进程所能创建的线程的最大数
:在系统上同时允许的核心线程的最大数

1.1.3、Tomcat与其它web服务器整合使用
虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把 apache和tomcat集成起来,将html与jsp的功能部分进行明确分工,让tomcat只处理jsp部分,其它的由apache,IIS等这些 web服务器处理,由此大大节省了tomcat有限的工作线程

1.2、自身调优
1.2.1、禁用DNS查询
当web应用程序要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml 文件中的enableLookups参数值:
不同的tomcat版本稍有不同。
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以外的方式来获取机器名。这样不仅节省了网络带宽、查询时间和内存,而且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间。对流量较小的站点来说禁用DNS查询可能没有大流量站点的效果明显。

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

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

在Tomcat5对这些参数进行了调整,请看下表:
属性描述
maxThreadsTomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
connnectionTimeout网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
minSpareThreadsTomcat初始化时创建的线程数。
maxSpareThreads一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。


1.2.3、加速JSP编译速度
当第一次访问一个JSP文件时,它会被转换为Java servlet源码,接着被编译成Java字节码。客户工程师可以控制使用哪个编译器,默认情况下,Tomcat使用命令行javac进行使用的编译器。也可以使用更快的编译器,这里将介绍如何优化它们。
     在Tomcat 4.0中可以使用流行而且免费的Jikes编译器。Jikes编译器的速度要高于Sun的Java编译器。首先要安装Jikes(可访问http://oss.software.ibm.com/pub/jikes 获得更多的信息),接着需要在环境变量中设置JIKESPATH包含系统运行时所需的JAR文件。装好Jikes以后还需要设置让JSP编译servlet使用Jikes,需要修改web.xml文件中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.jar
</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>

在Tomcat 4.1(或更高版本),JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。客户开发人员需要在元素中定义一个名字叫”compiler”,并且在value中有一个支持编译的编译器名字,示例如下:
<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可用的编译器
由于JSP页面在第一次使用时已经被编译,那么你可能希望在更新 新的jsp页面后马上对它进行编译。实际上,这个过程完全可以自动化,因为可以确认的是新的JSP页面在开发服务器和在测试服务器上的运行效果是一样的。
在Tomcat4的bin目录下有一个名为jspc的脚本。它仅仅是运行翻译阶段,而不是编译阶段,使用它可以在当前目录生成Java源文件。它是调试JSP页面的一种有力的手段。

可以通过浏览器访问再确认一下编译的结果。这样就确保了文件被转换成servlet,被编译了可直接执行。这样也准确地模仿了真实用户访问JSP页面,可以看到给用户提供的功能。也抓紧这最后一刻修改出现的bug并且修改它。

Tomcat提供了一种通过请求来编译JSP页面的功能。客户可以在浏览器地址栏中输入http://localhost: 8080/examples/jsp/dates/date.jsp?jsp_precompile=true,这样Tomcat就会编译 data.jsp而不是执行它。此举唾手可得,不失为一种检验页面正确性的捷径。

1.2.4、NIO 配置
NIO (No-blocking I/O)从JDK 1.4起,NIO API作为一个基于缓冲区,并能提供非阻塞I/O操作的API被引入。
       TOMCAT可以支持高并发的企业级应用。其中有个很大的原因就是,配置良好的tomcat都会使用APR(Apache Portable Runtime),APR是Apache HTTP Server2.x的核心,它是高度可移植的本地库,它使用高性能的UXIN I/O操作,低性能的java io操作,但是APR对客户开发人员而言可能稍稍有点难度,在很多OS平台上,可能需要重新编译APR。但是从Tomcat6.0以后, 客户开发人员很容易就可以用NIO的技术来提升tomcat的并发处理能力。但是为什么NIO可以提升tomcat的并发处理能力呢,我们先来看一下java 传统io与 java NIO的差别。
    Java 传统的IO操作都是阻塞式的(blocking I/O), 如果有socket的编程基础,你会接触过堵塞socket和非堵塞socket,堵塞socket就是在accept、read、write等IO操作的时候,如果没有可用符合条件的资源,不马上返回,一直等待直到有资源为止。而非堵塞socket则是在执行select的时候,当没有资源的时候堵塞,当有符合资源的时候,返回一个信号,然后程序就可以执行accept、read、write等操作,一般来说,如果使用堵塞socket,通常我们通常开一个线程accept socket,当读完这次socket请求的时候,开一个单独的线程处理这个socket请求;如果使用非堵塞socket,通常是只有一个线程,一开始是select状,当有信号的时候可以通过多路复用(Multiplexing)技术传递给一个指定的线程池来处理请求,然后原来的线程继续select状态。 最简单的多路复用技术可以通过java管道(Pipe)来实现。换句话说,如果客户端的并发请求很大的时候,客户系统可以使用少于客户端并发请求的线程数来处理这些请求,而这些来不及立即处理的请求会被阻塞在java管道或者队列里面,等待线程池的处理。

      在web服务器上阻塞IO(BIO)与NIO一个比较重要的不同是,客户系统使用BIO的时候往往会为每一个web请求引入多线程,每个web请求一个单独的线程,所以并发量一旦上去了,线程数就上去了,CPU就忙着线程切换,所以BIO不合适高吞吐量、高可伸缩的web服务器;而NIO则是使用单线程(单个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe或者队列里的请求.这样的话,只要OS可以接受TCP的连接,web服务器就可以处理该请求。大大提高了web服务器的可伸缩性。

   客户只需要在server.xml里把 HTTP Connector做如下更改,

    <Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
       redirectPort="8443" />
    改为
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000"
               redirectPort="8443" />

然后启动服务器,如果出现org.apache.coyote.http11.Http11NioProtocol start的提示信息,表示NIO已经启动。其他的配置请参考官方配置文档。

1.2.5、拒绝访问
前面我们提到过操作系统通过一些限制手段来防止恶意的服务攻击,同样Tomcat也提供了防止恶意攻击或禁止某些机器访问的设置。
    Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。
    通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。与之类似的,在Apache的httpd文件里有对每个目录的允许/拒绝指定。

例如你可以把Admin Web application设置成只允许本地访问,设置如下:
<Context path=“/path/to/secret_files” >
<Valve className=“org.apache.catalina.valves.RemoteAddrValve”
allow=“127.0.0.1”deny=““/>
</Context>

如果没有给出允许主机的指定,那么就会被拒绝,除此之外的都是允许的。与之类似,如果没有给出拒绝主机的指定,那么与允许主机匹配的主机就会被允许,除此之外的都是拒绝的。
分享到:
评论

相关推荐

    Tomcat调优及相关汇总设置

    ### Tomcat调优及相关汇总设置 #### 一、Tomcat防止恶意攻击 ##### 1. 管理平台安全设置 - **管理平台**: Tomcat自带的管理平台(manager)是一个web应用,可通过`localhost:8080/manager/html`进行访问。此平台...

    Tomcat 调优及 JVM 参数优化

    这篇文章将深入探讨Tomcat调优与JVM参数优化的各个方面,帮助你提升服务器性能。 首先,我们来了解一下Tomcat调优的基础知识。Tomcat调优主要包括以下几个方面: 1. **线程池配置**:调整`maxThreads`和`...

    Tomcat调优及相关设置汇总-paulen.docx.rar_Tomcat调优及相关设置汇总_flowerd54

    《Tomcat调优及相关设置汇总》是一份详细探讨如何优化Apache Tomcat服务器性能的重要文档,由作者flowerd54编写。Tomcat作为广泛使用的开源Java Servlet容器,其性能调优对于提升Web应用的响应速度和处理能力至关...

    Tomcat性能调优方案

    Tomcat性能调优方案,tomcat集群,tomcat配置 三、Apache集成Tomcat Web服务器专门处理HTTP请求,应用服务器是通过很多协议为应用提供商业逻辑。虽然Tomcat也可以作web服务器,但其处理静态html的速度比不上Apache...

    tomcat优化调优文档

    ### Tomcat优化调优知识点详解 #### 一、Tomcat简介及重要性 Tomcat作为一款免费且开源的Web应用服务器软件,在Java开发领域占据着举足轻重的地位。其核心功能是支持运行Java Servlet/JSP,同时也因其轻量级、易用...

    tomcat调优.zip

    【标题】"Tomcat调优.zip"所包含的是一系列关于Tomcat服务器优化的资料,主要探讨了Tomcat的整体架构、线程模型以及类加载机制等核心知识点。 首先,我们来深入理解一下Tomcat的整体架构及其设计精髓。Tomcat作为一...

    jvm虚拟机参数调优,tomcat调优

    接下来,Tomcat调优主要包括以下几个方面: 1. **连接器优化**:`Connector`组件负责处理客户端请求。可以通过调整`maxThreads`(最大线程数)和`minSpareThreads`(最小空闲线程数)来平衡响应速度和资源利用率。 ...

    Tomcat调优.doc

    在优化Apache Tomcat服务器以提高性能的过程中,有多个关键配置参数需要调整。这些调整主要集中在JVM内存设置和Tomcat的Connector配置上。下面将详细解释这些参数的含义及其优化方法。 首先,我们关注的是`JAVA_...

    Tomcat调优配置技巧[参考].pdf

    Tomcat调优是提高应用程序性能的关键步骤,尤其对于处理高并发和大数据量的应用来说更为重要。以下是一些关键的Tomcat调优配置技巧: 一、启用Gzip压缩 为了减少网络流量,可以在Tomcat配置中启用Gzip压缩。在`...

    tomcat调优

    在进行Tomcat调优时,首先需要理解其服务器与JVM的基本信息及其重要性。 **1.1 JVM区域分配** - **PSEdenSpace(新生代)**: 新创建的对象一般会被分配到这里。在垃圾回收过程中,大部分不再使用的对象将在这里被...

    Tomcat调优配置技巧[文].pdf

    《Tomcat调优配置技巧详解》 在软件开发领域,优化服务器性能是至关重要的,尤其对于使用Apache Tomcat作为应用服务器的情况。Tomcat以其轻量级、高效的特点被广泛采用,但随着应用规模的扩大,对其进行调优配置就...

    Tomcat服务器性能调优几个方面[定义].pdf

    Tomcat服务器性能调优是提升应用程序运行效率的关键环节,涉及到多个层面的调整。以下将详细阐述从操作系统、Java虚拟机、Apache与Tomcat的集成以及Apache和Tomcat集群等方面的调优策略。 首先,**操作系统调优**是...

    tomcat调优和java配置.doc

    Tomcat调优和Java配置是优化服务器性能的关键步骤,尤其对于运行大型Web应用程序的企业来说。以下是对这些主题的详细讨论: 首先,配置Java环境变量是基础。在Linux系统中,这通常涉及编辑`/etc/profile`文件。在该...

    tomcat使用与调优,nginx

    tomcat 第⼀部分:Tomcat 系统架构与原理剖析 第⼆部分:Tomcat 服务器核⼼配置详解 第三部分:⼿写实现迷你版 Tomcat 第四部分:Tomcat 源码构建及核⼼流程源码剖析 第五部分:Tomcat 类加载机制剖析 第六部分:...

    tomcat7性能调优

    【Tomcat7性能调优】是一项关键的任务,它关乎服务器的稳定性和响应速度。Tomcat作为流行的Java应用服务器,其性能优化能显著提升应用程序的运行效率。本文将深入探讨如何针对Tomcat7进行调优。 首先,我们关注的是...

Global site tag (gtag.js) - Google Analytics