Tomcat企业级优化

以下内容全是干货,是软谋教育Gerry老师的分享!

----------------------------------------------------------------------------------

禁用AJP协议(在内网中影响不大,但在万维网中影响很大)
    在server.xml中注释掉这一行:
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

启用nio模式(提升原有吞吐量的36%,可以用jmeter用150000的并发进行测试)
    旧的配置:
    <Connector connectionTimeout="20000" port="8998" protocol="HTTP/1.1" redirectPort="8443"/>
    新的配置:
    <Connector connectionTimeout="20000" port="8998" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/

开启连接池(有相关经验的人配置,有硬件指标和业务指标,需要依据专业压测性能工具得出)
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    <Connector executor="tomcatThreadPool"
        port="8998" protocol="org.apache.coyote.http11.Http11NioProtocol"
        connectionTimeout="20000"
        redirectPort="8443" />

优化连接器
    1.Tomcat连接相关参数
        在Tomcat配置文件server.xml中的
        <Connector port="9027"
        protocol="HTTP/1.1"
        maxHttpHeaderSize="8192"
        minProcessors="100"
        maxProcessors="1000"
        acceptCount="1000"
        redirectPort="8443"
        disableUploadTimeout="true" />
    
    2.调整连接器connector的并发处理能力
        1>参数说明
            maxThreads 客户请求最大线程数
            minSpareThreads Tomcat初始化时创建的socket线程数
            maxSpareThreads Tomcat连接器的最大空闲socket线程数
            enableLookups 若设为true,则支持域名解析,可把ip地址解析为主机名
            redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL的redirectPort端口
            acceptCount 监听端口队列的最大值,满了之后客户请求会被拒绝(不能小于maxSpareThreads)
            connectionTimeout 连接超时
            minProcessors 服务器创建时的最小处理线程数
            maxProcessors 服务器同时最大处理线程数
            URIEncoding URI统一编码
        2>Tomcat中的配置示例
            <Connector port="9027"
            protocol="HTTP/1.1"
            maxHttpHeaderSize="8192"
            maxThreads="1000"
            minSpareThreads="100"
            maxSpareThreads="1000"
            minProcessors="100"
            maxProcessors="1000"
            enableLookups="false"
            URIEncoding="utf-8"
            acceptCount="1000"
            redirectPort="8443"
            disableUploadTimeout="true" />
    
    3.Tomcat缓存优化
        1>参数说明
            compression 打开压缩功能
            compressionMinSize 启用压缩的输出内容大小,这里默认为2KB
            compressableMimeType 压缩类型
            connectionTimeout 定义建立客户端连接超时的时间,如果为-1,表示不限制建立客户连接的时间
        2>Tomcat中的配置示例
            <Connector port="9027"
            protocol="HTTP/1.1"
            maxHttpHeaderSize="8192"
            maxThreads="1000"
            minSpareThreads="100"
            maxSpareThreads="1000"
            minProcessors="100"
            maxProcessors="1000"
            enableLookups="false"
            compression="on"
            compressionMinSize="2048"
            compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
            connectionTimeout="20000"
            URIEncoding="utf-8"
            acceptCount="1000"
            redirectPort="8443"
            disableUploadTimeout="true" />
            
    4.实践参考配置
        1>旧有的配置
            参考网络对服务器做过如下配置,拿出来分享下:
            <Connector port="9027"
            protocol="HTTP/1.1"
            maxHttpHeaderSize="8192"
            maxThreads="1000"
            minSpareThreads="25"
            maxSpareThreads="75"
            enableLookups="false"
            compression="on"
            compressionMinSize="2048"
            compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
            connectionTimeout="20000"
            URIEncoding="utf-8"
            acceptCount="200"
            redirectPort="8443"
            disableUploadTimeout="true" />
            后来发现在访问量达到三百万多时出现性能瓶颈
        2>更改后的配置
            <Connector port="9027"
            protocol="HTTP/1.1"
            maxHttpHeaderSize="8192"
            maxThreads="1000"
            minSpareThreads="100"
            maxSpareThreads="1000"
            minProcessors="100"
            maxProcessors="1000"
            enableLookups="false"
            compression="on"
            compressionMinSize="2048"
            compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
            connectionTimeout="20000"
            URIEncoding="utf-8"
            acceptCount="200"
            redirectPort="8443"
            disableUploadTimeout="true" />

优化内存
    主要是在bin/catalina.bat/sh配置文件中添加:
    JAVA_OPTIONS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxNewSize=256M"
    其中:
    -server 启用jdk的server版本
    -Xms 虚拟机初始化时最小堆内存
    -Xmx 虚拟机可使用最大堆内存,一般将-Xms和-Xmx设成一样的值,防止JVM因为频繁GC导致性能大起大落
    -XX:PermSize 设置非堆内存初始值,默认是物理内存的1/64
    -XX:MaxNewSize 新生代占整个堆内存的最大值
    -XX:MaxPermSize Perm(方法区)占整个堆内存的最大值,也称内存最大永久保存区
    
    配置过程可能出现错误,下面是常见的两个:
    1)错误提示:java.lang.OutOfMemoryError:Java heap space
    Tomcat默认可使用的内存为128M,在较大型的应用中是不够的,可能导致系统无法运行。
    常见的问题是报Tomcat内存溢出错误,OutOfMemory的异常,从而导致客户端显示500错误,
    一般调整Tomcat的-Xms和-Xmx就可以解决,堆的最大值设置为物理可用内存最大值的80%。
    set JAVA_OPTIONS=-Xms512m-Xmx512m
    
    2)错误提示:java.lang.OutOfMemoryError:PermGenspace
    PermGenspace全称为Permanent Generationspace,是指内存永久保存区域,
    这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,
    它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期间对PermGenspace进行清理,
    所以如果你的应用中有很多Class的话,就可能出现这种错误,常见在web服务器对JSP进行precompile的时候。
    如果你的WEB APP下都用了大量的第三方jar,其大小超过了JVM的默认大小(4M),那就会产生此错误信息。

欢迎关注我们一起交流~~

猜你喜欢

转载自blog.csdn.net/qq_39391192/article/details/82850008