Tomcat性能优化详细教程

2023-11-10

首先,是客户端访问tomcat的一个过程,如图所示:
这里写图片描述
图中间虚线框部分是 Apache基金下的服务器来做静态资源处理的,而这部分需要花费大量时间,当用nginx和tomcat做企业级集群的时候,需要禁用掉AJP协议。
一、准备工作:
1、配置管理员帐户:
进入conf目录下,打开tomcat-users.xml,在首尾元素中间加入:

 <role rolename="manager"/>
  <role rolename="manager-gui"/>
  <role rolename="admin"/>
  <role rolename="admin-gui"/>
  <user username="tomcat"  password="tomcat" roles="admin-gui,admin,manager-gui,manager"/> 

此时,配置的用户名和密码都是tomcat。
2、优化方法
(1)在浏览器中输入 http://localhost:8080/,点击页面中 Server Status,输入用户名和密码可以看到默认tomcat中的JVM、HTTP、AJP协议、连接池是否启用等,可以通过修改页面上显示的参数来优化tomcat。
(2)在server.xml中进行更加深入的配置。

二、Tomcat优化:

1、禁用AJP协议
  (1)通过禁用AJP协议,达到在集群的时候提高处理请求的时间。
  (2)启动tomcat后,不论从刚刚的管理员界面,还是从控制台上都可以看出,AJP协议是开启的。我们要做的就是要将此协议禁用,禁用方法:在server.xml中,将 

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

注释掉,重新启动tomcat即可

2、 将BIO通讯模式修改为NIO通讯模式
  (1)tomcat通讯协议支持http1.0和1.1,tomcat默认走的是BIO通讯模式,tomcat7和tomcat8之所以默认的都是效率低下的BIO通讯模式,是因为和前面的就项目做兼容。

  (2)在控制台上或者管理界面都可以看到,tomcat启动的通讯模式是bio的。

  (3)应用场景:tomcat集群的时候,若项目比较新,都是1.5类库之前,即JDK版本大于1.5,可将集群中每一个tomcat的启动模式设置为高并发高性能的应答模式(NIO)。修改server.xml里的Connector节点,修改protocol为org.apache.coyote.http11.Http11NioProtocol。

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

  其中,原来的protocol=”HTTP/1.1”表示遵循http1.1协议,同时,也是一个最原始的未经优化的通信协议,修改之后的 protocol=”org.apache.coyote.http11.Http11NioProtocol” ,表示以 NIO模式启动。
  
3、 启用外部连接池,来满足高并发已经复用的请求

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>

注释打开,并修改maxThreads的值,然后在
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" />
中加入 executor=”tomcatThreadPool”,即最后为:

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

根据业务场景和服务器硬件资源条件可以适当的加大线程连接池,根据第三方工具去开启并发测试来确定一个最好的连接池数。

4、 优化连接器配置

Executor重要参数说明:
  name:线程池名称,用于 Connector中指定。
  namePrefix:所创建的每个线程的名称前缀,一个单独的线程名称为 namePrefix+threadNumber。
  maxThreads:池中最大线程数。
  minSpareThreads:活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
  maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。
  maxQueueSize:在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改,否则会有请求不会被处理的情况发生。
  prestartminSpareThreads:启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动。
  threadPriority:线程池中线程优先级,默认值为5,值从1到10。
  className:线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。如果想使用自定义线程池首先需要实现 org.apache.catalina.Executor接口。

Connector重要参数说明:
  maxThreads 客户请求最大线程数
  minSpareThreads Tomcat初始化时创建的 socket 线程数
  maxSpareThreads Tomcat连接器的最大空闲 socket 线程数
  enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
  redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
  acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
  connectionTimeout 连接超时
  minProcessors 服务器创建时的最小处理线程数
  maxProcessors 服务器同时最大处理线程数
  URIEncoding URL统一编码

最佳优化实践:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="800" minSpareThreads="100" />
<Connector  executor="tomcatThreadPool" port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
            connectionTimeout="20000"
            redirectPort="8443" 
            enableLookups="false"
            maxPostSize="10485760"
            URIEncoding="UTF-8" 
            useBodyEncodingForURI="true"
            acceptCount="100"
            acceptorThreadCount="2"
            disableUploadTimeout="true" 
            maxConnections="10000"
            SSLEnabled="false"
    />

5、 在tomcat中设置JVM参数

Linux下修改TOMCAT_HOME/bin/catalina.sh,在其中加入,可以放在CLASSPATH=下面:

JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"  

windows下修改TOMCAT_HOME/bin/catalina.bat,在其中加入,可以放在set CLASSPATH=下面:

set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m  

   -Xms:设置JVM初始内存大小(默认是物理内存的1/64)

   -Xmx:设置JVM可以使用的最大内存(默认是物理内存的1/4,建议:物理内存80%)

   -Xmn:设置JVM最小内存(128-256m就够了,一般不设置)

   默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。  

   在较大型的应用项目中,默认的内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误“java.lang.OutOfMemoryError:Java heap space”,从而导致客户端显示500错误。  

  -XX:PermSize :为JVM启动时Perm的内存大小  

  -XX:MaxPermSize :为最大可占用的Perm内存大小(默认为32M) 

  -XX:MaxNewSize,默认为16M

对于WEB项目,jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小,为了避免调整),你可以使用更多的参数配置。如果你的WEBAPP下都用了大量的第三方jar, 其大小超过了jvm默认的大小,那么就会产生内存溢出的错误。

其它参数:

  -XX:NewSize :默认为2M,此值设大可调大新对象区,减少FullGC次数

  -XX:NewRatio :改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8)

  -XX:SurvivorRatio :改变Eden对象空间和残存空间的尺寸比例,意思是Eden对象空间的尺寸比残存空间大survivorRatio+2倍(缺省值是10)

  -XX:userParNewGC 可用来设置并行收集【多CPU】

  -XX:ParallelGCThreads 可用来增加并行度【多CPU】

  -XXUseParallelGC 设置后可以使用并行清除收集器【多CPU】

参考:https://www.cnblogs.com/xbq8080/p/6417671.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tomcat性能优化详细教程 的相关文章

随机推荐

  • 前缀树(字典树)应用——实现 Trie (前缀树)、添加与搜索单词

    目录 1 前缀树原理简介 2 实现前缀树 2 1 题目描述 2 2 题目分析 2 3 代码实现 3 添加与搜索单词 3 1 题目描述 3 2 题目分析 3 3 代码实现 4 总结 1 前缀树原理简介 先来简单介绍一下前缀树是什么 前缀树也叫
  • python--爬虫 爬取html和txt文件

    一 python爬取html文件 使用python爬取某网站首页并下载html文件 下面介绍两种方式 一种是urllib 另一种是requests 1 使用urllib import urllib request url http www
  • (十) web自动化测试-PO设计模式

    十 web自动化测试 PO设计模式 文章目录 十 web自动化测试 PO设计模式 前言 一 PageObject原则 1 使用方法代替页面的功能点 2 case中不要过多暴露页面的细节 3 po本身不进行断言 4 一个方法返回另一个页面 P
  • Python运算符中/和//的区别

    首先先看单斜杆的用法 举几个栗子 gt gt gt print 5 3 type 5 3 1
  • node-sass npm安装详解

    node sass npm安装详解 npm 安装 node sass 依赖时 会从 github com 上下载 node 文件 由于国内网络环境的问题 这个下载时间可能会很长 甚至导致超时失败 解决方案就是使用其他源 或者使用工具下载 然
  • 5分钟掌握接口自动化测试,4个知识点简单易学!

    一 什么是接口测试 接口测试是一种软件测试方法 用于验证不同软件组件之间的通信接口是否按预期工作 在接口测试中 测试人员会发送请求并检查接收到的响应 以确保接口在不同场景下都能正常工作 就工具而言 常见的测试工具有Jmeter Postma
  • 一张900w的数据表,16s执行的SQL优化到300ms?

    大家好 我是磊哥 有一张财务流水表 未分库分表 目前的数据量为9555695 分页查询使用到了limit 优化之前的查询耗时16 s 938 ms execution 16 s 831 ms fetching 107 ms 按照下文的方式调
  • 【每日一具3】推荐一个4K、蓝光、3D高清影视下载站,影视资源丰富 发烧友必备

    我猜测大家收藏都是有些能看片源比较丰富能看最新电影的网站 这些网站往往都是采集最大资源网的片源 最新的电影收录后的画质不敢恭维 对于那些真正的影视爱好者来说这不是最好的选择 今天博谈天下给你们推荐一个4K 蓝光 3D高清影视下载站 这个网站
  • C++多态

    C 中的多态分为静态多态和动态多态两种 其中 静态多态在编译阶段实现 其原理是由函数重载实现 通过不同的实参调用其相应的同名函数 动态多态通过虚函数实现 以下着重介绍 动态多态的两个必要条件 必须通过基类的指针或者引用调用 被调用的必须是虚
  • TamperMonkey油猴脚本弹出系统通知

    TamperMonkey油猴脚本弹出系统通知 通知问题 解决方法 删除通知 修改通知内容 通知问题 安装某些TamperMonkey油猴脚本后偶尔弹出如下系统通知 通知标题显示为Microsoft Edge或Chrome 正在使用的浏览器
  • laravel模型中数据批量加入

    laravel模型中数据批量加入 控制器 关联新增批量加入 user User find 19 user gt book gt saveMany new Book title gt 哈利波特1 new Book title gt 哈利波特2
  • Java课题笔记~ SpringMVC概述

    1 1 SpringMVC简介 SpringMVC 也叫Spring web mvc 是Spring 框架的一部分 在Spring3 0 后发布的 1 2 SpringMVC的优点 基于MVC 架构 基于 MVC 架构 功能分工明确 解耦合
  • 性能测试指标全解

    最近在公司做压测时 对于各个监控工具的监控指标一脸蒙 有时候不清晰 有时候理解错误 于是 恶补基础知识 希望对广大网友有所帮助 一 性能测试指标 1 在线用户数 此指标指的是某个时间段内 在服务器上保持登录状态的用户数 在线用户数不等同于并
  • 【Go】字符串拼接

    在 Go 语言中 常见的字符串拼接方式包括 拼接 fmt Sprintf拼接 strings Join拼接 buffer Builderbuffer WriteString拼接和strings Builder WriteString拼接 1
  • 什么是to B 业务

    引言 To B or Not to B there is not a question 对于企业而言 数据分析的作用主要体现在三大领域 1 是对业务的改进优化 2 是帮助业务发现机会 3 是创造新的商业价值 数据分析最重要的是基于对业务的理
  • 常见的反爬手段、原理以及应对思路

    应对反爬的主要思路就是 尽可能的去模拟浏览器 浏览器在如何操作 代码中就如何去实现 1 通过User Agent反爬 爬虫发送请求时 请求头中默认没有User Agent 或者提供非正常的UA 应对思路 在请求时添加UA 具体应对 requ
  • 用JAVA实现网络数据包嗅探

    用JAVA实现网络数据包嗅探 网络嗅探可是说是网络开发的一个基础 SNIFFER IDS都是在这个基础上开发的 一个提供了网络分析 一个提供了入侵检测 实现一个网络嗅探程序到底有多难呢 可以很复杂 也可以很简单 在WINDOWS平台下 大多
  • 框架分析(8)-React Native

    框架分析 8 React Native 专栏介绍 React Native 特性和优势 跨平台开发 热更新 原生性能 组件化开发 第三方库支持 社区支持 限制和挑战 性能问题 第三方库兼容性 学习曲线 总结 专栏介绍 link 主要对目前市
  • 大数据开发:数仓建模常见数据模型

    在数据仓库搭建的过程当中 根据需求合理地选择数据模型 是非常关键的一个环节 对于数仓建模 很多人说不就是建表吗 哪有那么复杂 事实上 这是非常错误的思想 今天的大数据开发分享 我们来聊聊数仓建模常见的几种数据模型 目前来说 市场上主流的数据
  • Tomcat性能优化详细教程

    首先 是客户端访问tomcat的一个过程 如图所示 图中间虚线框部分是 Apache基金下的服务器来做静态资源处理的 而这部分需要花费大量时间 当用nginx和tomcat做企业级集群的时候 需要禁用掉AJP协议 一 准备工作 1 配置管理