zoukankan      html  css  js  c++  java
  • Tomcat优化总结

    一、内存溢出问题

    Linux设置启动脚本

    [root@LAMP ~]# vi /usr/local/tomcat/bin/catalina.sh

    #___________________________________start

        225 # Bugzilla 37848: only output this if we have a TTY

        226 if [ $have_tty -eq 1 ]; then

        227   JAVA_OPTS="$JAVA_OPTS  -server -Xms512m -Xmx4096m   -XX:MaxNewSize=256m -XX:MaxPermSize=256m"

        228   echo "Using CATALINA_BASE:   $CATALINA_BASE"

    #____________________________________end

    解释

    -Xms:初始值

    -Xmx:最大值

    -Xmn:最小值

    一般“-Xms”是“-Xmx”的1/4,“-XXermSize”是“-XX:MaxPermSize”的1/2。

    因此一般建议堆的最大值设置为可用内存的最大值的80%。

    原因:

    发现很多人把问题归因于:spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出。

    然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用tomcat,还有人怀疑spring的问题,在spring论坛上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。

    但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?

    Tomcat在Q&A很隐晦的回答了这一点,我们知道这个问题,但这个问题是由一个更基础的问题产生,于是有人对更基础的JVM做了检查,发现了问题的关键。

    原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述,本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。

    而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!

    二、连接池优化

    1,配置文件解析

    接受关闭Tomcat命令的的端口:

    [root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml

    <Server port="8005"shutdown="SHUTDOWN">

    定义数据库连接池:

    [root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml

    <Resource name="UserDatabase" auth="Container"

                type="org.apache.catalina.UserDatabase"

                 description="User database that can be updated and saved"

                 factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

                 pathname="conf/tomcat-users.xml" />

    </GlobalNamingResources>

    定义配置共享线程池,用于客户端和服务器端的连接控制:

    [root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml

    #___________________________________start

    <Executor name="tomcatThreadPool"namePrefix="catalina-exec-"

           minSpareThreads="100"

           maxSpareThreads="500"

           maxThreads="3000"

           acceptCount="100"

           maxIdleTime="60000"

    />

    #__________________________________end

    配置Engine,注意defaultHost=""中,必须要与host中的一个相同,即指定默认网站。

    [root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml +99

    <Engine name="Catalina" defaultHost="www.00peixun.com">

    使用上面配置的数据库连接池

    [root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml +99

    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/>

    使用上面配置的共享线程池来控制客户端的连接,优化调度服务器资源。

    [root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml

    #___________________________________start

    <Connector port="8080"protocol="HTTP/1.1"

                  connectionTimeout="30000"

                  redirectPort="8443"

                  executor="tomcatThreadPool"

                  enableLookups="false"

                  useBodyEncodingForURI="true"

    />

    #________________________________________end

    配置虚拟主机

    [root@LAMP ~]# vi /usr/local/tomcat/conf/server.xml

    #________________________________________start

    <Host name="www.00peixun.com"

               unpackWARs="true" autoDeploy="true"

               xmlValidation="false" xmlNamespaceAware="false">

                <Context path=""docBase="/home/www/game" debug="0"reloadable="false"

        crossContext="true"/>

           <!-- SingleSignOn valve, share authentication between web applications

                Documentation at: /docs/config/valve.html -->

           <!--

           <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

           -->

           <!-- Access log processes all example.

                Documentation at: /docs/config/valve.html -->

           <!--

           <Valve className="org.apache.catalina.valves.AccessLogValve"directory="logs"

                  prefix="localhost_access_log." suffix=".txt"pattern="common" resolveHosts="false"/>

           -->

    </Host>

    #_______________________________________end

    1、minSpareThreads="100":设置Tomcat初始化时创建的socket 线程数,并且在一些线程被使用后,会不断地创建新的线程,以致使空闲线程至少保持minSpareThreads所设置的数目,默认值为4

    2、maxSpareThreads="500":设置Tomcat连接器最大空闲socket 线程数,当一些连接断开后,会不断的释放出线程,当空与线程超过maxSpareThreads所设置的数目时,会主动关闭超出的线程以节省资源默认值为50

    3、maxThreads="3000":设定处理客户请求的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目,这个值不会额外影响性能,因此可以适当加大,但让太大会碰到流量攻击哦,默认值为200.

    4、acceptCount="100":设定在监听端口队列中的最大客户请求数,默认值为10,如果队列已满客户请求将被拒绝。可用线程全部用完时,其他的连接全部放入队列,队列里的最大数目就是acceptCount设定的,超出这个数目将拒绝连接

    5、connectionTimeout:定义建立客户连接超时的时间,默认这为20000毫秒。如果为0,表示不限制建立客户连接的时间。

    6、maxIdleTime="60000":超过最小活跃线程数量的线程,如果空闲时间超过这个设置后,会被关闭。默认是1分钟

    7、useBodyEncodingForURI:表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,默认值是false.

    8、redirectPort:指定转发端口。

    9、connectionTimeout:定义建立客户连接超时的时间,默认这为20000毫秒。如果为-1,表示不限制建立客户连接的时间。

    10、useBodyEncodingForURI:表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,默认值是false.

    注意

    Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制....

    (minProcessors:服务器启动时创建的最小处理线程数,即使没有任何HTTP请求,Tomcat也要保持至少这么多线程以等待处理;

    maxProcessors:同时最大的处理线程数,如果系统中已经有这个数字的线程,那么更多的连接请求将进入排队。)

    Tomcat5中可以通过修改minSpareThreads和minSpareThreads的值来控制

    APR库使用

    Tomcat中使用APR库,其实就是在Tomcat中使用JNI的方式来读取文件以及进行网络传输。

    可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式传输的话,也可以提升SSL的处理性能。

    一般在Windows下,可以直接下载编译好的二进制版本的dll库文件来使Tomcat启用APR,一般建议拷贝库文件tcnative- 1.dll到Tomcat的bin目录下。

    而在Linux下,可以直接解压和安装bin目录下的tomcat_native.tar.gz文件,编译之前要确保apr库已经安装。

    怎么才能判断Tomcat是否已经启用了APR库呢?方法是通过看Tomcat的启动日志:

    如果没有启用APR,则启动日志一般有这么一条:

    org.apache.coyote.http11.Http11Protocol start

    如果启用了APR,则这条日志就会变成:

    org.apache.coyote.http11.Http11AprProtocol start

    tcnative-1.dll 下载地址:http://tomcat.heanet.ie/native/

    (全文完)

  • 相关阅读:
    24丨基础篇:Linux磁盘I-O是怎么工作的(上)
    23 | 基础篇:Linux 文件系统是怎么工作的?
    45 | 答疑(五):网络收发过程中,缓冲区位置在哪里?
    selenium相关:通过location 和 size 获取元素所在像素位置和尺寸,截取图片ROI
    python排序算法之冒泡,选择,插入
    pyspider和pyquery总结
    python之基于libsvm识别数字验证码
    selenium执行JavaScript语句:控制滚动条 聚焦元素 改变下拉选项
    python导入import
    【转】利用 selenium 的 webdrive 驱动 headless chrome
  • 原文地址:https://www.cnblogs.com/wangchunniu1314/p/6418679.html
Copyright © 2011-2022 走看看