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

    最近由于工作上的原因,需要对 Tomcat 并发进行优化。之前也做过一次 Tomcat 优化,但并没有记录下来,趁着最近不忙,学习并记录一下优化的过程。

    Tomcat 中的三种运行模式之运行模式的优化

    修改 Tomcat 的运行模式:

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 修改为NIO模式:

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

    验证成功方式:Tomcat 日志控制台最后
    如果是 http-bio-8080 是 bio
    如果是 http-nio-8080 是 nio

    1、BIO(阻塞式):Tomcat 的默认模式,该模式性能较低,没有经过任何优化处理和支持,一个线程处理一个请求。缺点:并发量过大时,线程数较多,浪费资源。Tomcat7 及以下版本,在 linux 系统中默认使用该模式。

    2、NIO-Non-blocking IO(非阻塞IO):Java NIO 可以让你非阻塞的使用 IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。Tomcat8 在Linux系统中默认使用这种方式。

    3、APR:Apache Portable Runtime,从操作系统层面解决io阻塞问题。Tomcat7 或 Tomcat8 在 Win7 或以上的系统中启动默认使用这种方式。Linux 如果安装了 apr 和 native,Tomcat 直接启动就支持 apr。

    Tomcat 执行器(线程池)的优化

    Tomcat 默认是没有启用线程池的,在 Tomcat 中每一个用户请求都是一个线程,所以我们可以使用线程池来提高性能。Tomcat 的前段有一个调度线程,会将用户的请求放入线程池中,一定时间后线程池中的用户请求任务就变为工作线程。

    1、开启线程池:打开 server.xml 中关于线程池的配置

    <Executor name="TomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="600" minSpareThreads="10"/>
    

    重要参数说明:

    name:共享线程池的名字。这是 Connector 为了共享线程池要引用的名字,该名字必须唯一。默认值:None;

    namePrefix:在 JVM 上,每个运行线程都可以有一个 name 字符串。这一属性为线程池中每个线程的 name 字符串设置了一个前缀,Tomcat 将把线程号追加到这一前缀的后面。默认值:Tomcat-exec-;

    maxThreads:该线程池可以容纳的最大线程数。默认值:200;

    maxIdleTime:在 Tomcat 关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于 minSpareThread 的值,才会关闭空闲线程。默认值:60000(一分钟)。

    minSpareThreads:Tomcat 应该始终打开的最小不活跃线程数。默认值:25。

    2、引用线程池

    <Connector
         executor="TomcatThreadPool"
    
         port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
         connectionTimeout="20000"
         redirectPort="8443"
    
         maxThreads="1000"
         minSpareThreads="100"
         acceptCount="1000"
         maxConnections="1000"
         maxHttpHeaderSize="8192"
         tcpNoDelay="true"
         compression="on"
         disableUploadTimeout="true"
         enableLookups="false"
         URIEncoding="UTF-8"
         />
    

    maxThreads:最大线程数
    minSpareThreads:最小线程数
    acceptCount:接受最大队列长度
    maxConnections:最大连接数
    connectionTimeout:超时等待时间 毫秒
    maxHttpHeaderSize:请求头最大值
    tcpNoDelay:如果为true,服务器socket会设置TCP_NO_DELAY选项,在大多数情况下可以提高性能。缺省情况下设为true
    compression:是否开启压缩GZIP on开启 off 关闭 forde:所有情况下都压缩
    disableUploadTimeout:限定上传时间
    enableLookups:关闭DNS反向查询,DNS反查很耗时间

    Tomcat 优化之禁用AJP连接器实现动静分离

    AJP:协议是一个面向包的。web 服务器和 servlet 容器通过 TCP 链接进行交互,为了节省 SOCKET 创建的昂贵代价,WEB服务器会尝试维护一个永久 TCP 链接到 Servlet 容器,并在多个请求和响应周期过程会重用链接。

    由于 Tomcat 服务器相对于 Nginx 服务器在处理静态资源上效率较低。因此我们的网站服务器一般是 Nginx+Tomcat,Nginx 负责处理静态资源,因此 AJP 协议我们在使用 Nginx+Tomcat 架构时可以关闭它来进行效率的优化。

    注释 Tomcat server.xml 中 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 即可。

    Tomcat 中 JVM 参数优化

    对jvm参数的优化我们主要是对堆内存的优化

    Linux 下 catalina.sh 在一大段注释的下面,正文配置的上面加入:

    JAVA_OPTS="-server -Xmx2688M -Xms2688M -Xmn960M -XX:MaxTenuringThreshold=10 -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m"

    最后推荐一个可以在线对 JVM 参数进行优化的网站:http://xxfox.perfma.com

    本文由个人 hexo 博客 co2fe.com 迁移
    date: 2018-12-12 10:54:47

  • 相关阅读:
    bzoj 1030 [JSOI2007]文本生成器
    Swift 学习笔记 (闭包)
    Swift 学习笔记 (函数)
    HTML 学习笔记 JQueryUI(Interactions,Widgets)
    HTML 学习笔记 JQuery(表单,表格 操作)
    HTML 学习笔记 JQuery(animation)
    HTML 学习笔记 JQuery(盒子操作)
    HTML 学习笔记 JQuery(事件)
    HTML 学习笔记 JQuery(DOM 操作3)
    HTML 学习笔记 JQuery(DOM 操作2)
  • 原文地址:https://www.cnblogs.com/manastudent/p/10191083.html
Copyright © 2011-2022 走看看