Tomcat的优化

2023-11-05

Tomcat作为一款常用的web容器,对其进行优化是提升性能的重要手段;对其进行优化可以从以下方面入手:

  • 调整内存;
  • 调整线程池(Executor);
  • 调整连接器(Connector);
  • 调整运行模式;

调整内存

如果内存设置过小,极有可能导致项目无法启动,会报OOM异常;所以可以适当增大内存;

Windows下修改Tomcat_Home/bin/catalina.sh文件,在@echo off添加如下配置;

Linux下修改Tomcat_Home/bin/catalina.bat文件,在cygwin=false之前添加如下配置;

JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"

参数详解:

  • -server:一定要作为第一个参数,在多个 CPU 时性能佳,还有一种叫 -client 的模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或开发调试,在 32 位环境下直接运行 Java 程序默认启用该模式。Server 模式的特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境,在具有 64 位能力的 JDK 环境下默认启用该模式,可以不配置该参数;
  • -Xms: Java虚拟机初始化时堆的最小内存,一般与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能;
  • -Xmx: 表示最大 Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%。如何知道我的 JVM 能够使用最大值,使用java -Xmx512M -version 命令来进行测试,然后逐渐的增大512的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息,默认值为物理内存的 1/4,默认(MinHeapFreeRatio参数可以调整)空余堆内存大于 70% 时,JVM 会减少堆直到-Xms 的最小限制。使用java -Xmx命令测试java最大堆大小
  • -XX:PermSize: Java虚拟机永久代大小;
  • -XX:MaxPermSize:Java虚拟机永久代大小最大值;
    在idea、eclipse等开发工具中设置见解决内存溢出OutOfMemoryError异常

调整线程池(Executor)

打开Tomcat_home/conf/server.xml文件,配置Executor,参数如下:

    <Executor 
		name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="20"
		maxSpareThreads="50"/>

参数详解:

  • name:线程池名称,用于Connector中指定;
  • namePrefix:所创建的每个线程的名称前缀;
  • maxThreads:线程池中最大线程数;
  • minSpareThreads:最小空闲线程数,是tomcat启动时初始化的线程数;
  • maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。

注:

  1. 该部分配置也可以直接配置在Connector中,但是不可重复配置
  2. 上述配置的参数,最大线程数要根据实际情况合理设置,并不是越大越好,设置越大会耗费内存和cpu,导致cpu疲于切换线程上下文,无力提供请求服务。

调整连接器(Connector)

Connector是连接器,负责接收客户的请求,以及向客户端回送响应的消息。所以Connector的优化是重要部分。
打开Tomcat_home/conf/server.xml文件,配置Connector,参数如下:

<Connector 
	port="8080" 
	redirectPort="8443"
	executor="tomcatThreadPool"
	protocol="HTTP/1.1"
	URIEncoding = "UTF-8"
    connectionTimeout="20000"
	enableLookups="false"
	minProcessors="100"
	maxProcessors="1000"
	disableUploadTimeout = "false"
	connectionUploadTimeout = "150000"
	
	<!-- 与压缩相关额配置 -->
	compression = "on"
    compressionMinSize = "2048"
    compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" 
    />

参数详解:

  • executor:指定使用的执行器(线程池);
  • URIEncoding:指定tomcat容器的url编码格式;
  • connectionTimeout:网络连接超时,单位:毫秒,设置为 0 表示永不超时;
  • enableLookups:是否支持域名解析,建议设置为false,减少性能损耗;
  • minProcessors/maxProcessors:服务器初始化时创建的最小/最大线程数,与上述Executor中不同的是,一个是线程池的配置,而这是服务器的配置;
  • disableUploadTimeout:上传时是否启用超时机制;
  • connectionUploadTimeout :上传超时时间,与上面一个配置搭配使用

以下配置都与压缩相关,一般为了提升性能,都会对代码进行动静分离,将html、图片等静态交由Nginx处理,此时就不需要进行这部分配置;

  • compression:是否启用压缩功能;
  • compressionMinSize:压缩文件的最小值,只有当文件大于这个值时才会对其进行压缩;
  • compressableMimeType:压缩类型,指定对哪些文件进行压缩。

调整运行模式

主要是对Connector中protocol参数进行调整;tomcat主要有三种模式:

  • BIO:同步阻塞IO,服务器实现模式为每有一个连接就创建一个线程来处理,并不适合高并发,适用于连接数少的架构;
    tomcat中默认启用BIO模式

  • NIO:非阻塞IO,可以复用一个线程处理多个连接(多路复用),适用于连接数多且短的架构;

  • APR:全称 Apache Portable Runtime,是Tomcat生产环境运行的首选方式,APR是从操作系统级别解决异步 IO 问题,APR 的本质就是使用 JNI 技术调用操作系统底层的 IO 接口,所以需要提前安装所需要的依赖。

更多参数上优化可以查阅官方文档:

https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html

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

Tomcat的优化 的相关文章

随机推荐

  • 线程的查看以及利用gdb调试多线程

    更多linux知识点 linux目录索引 1 线程的查看 首先创建两个线程 include
  • socket编程——select模型

    利用select模型实现多个客户端和一个服务端的CS模型 多路IO复用技术 上一篇 多线程版本 阅前必读 select详解 select 同时监听多个文件描述符 将监控的操作交给内核去处理 委托内核监控可读 可写 异常事件 int sele
  • ai怎么做盒子效果图_AI做局部放大效果图

    前言 局部放大效果图是我们实验中比较常见的 是为了将更小的部分进行放大观察 这种图使用Ps和Ai都可以做 不难 在AI里主要涉及到了剪切蒙版的设置 使用圆形线圈对图进行剪切 放大就可以了 那么我们今天来看一下 这种图怎么做 软件 Adobe
  • 对Kalman(卡尔曼)滤波器的理解

    分类 计算机视觉 转载过来的 觉得不错 原文 http blog csdn net lanbing510 article details 8828109 1 简介 Brief Introduction 在学习卡尔曼滤波器之前 首先看看为什么
  • linux内核互斥锁,linux内核锁机制 - 全文

    在现代操作系统里 同一时间可能有多个内核执行流在执行 因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问 尤其是在多处理器系统上 更需要一些同步机制来同步不同处理器上的执行单元对共享的数据的访问 在主流的L
  • bootstrap与application对比

    用过 Spring Boot 的都知道在 Spring Boot 中有以下两种配置文件 bootstrap yml 或者 properties application yml 或者 properties 为什么会有这两种配置文件呢 大家都清
  • QPSK调制器

    早在本世纪初人们就了解通讯的重要性 从电子时代初期开始 随着技术的不断发展 本地通讯与全球通讯的之间壁垒被打破 从而导致我们世界变得越来越小 人们分享知识和信息也更加容易 贝尔和马可尼可谓通讯事业的鼻祖 他们所完成的开拓性工作不仅为现代信息
  • ViewPager中的fragment内容不显示,无报错问题解决

    背景 楼主在做一个fragment切换的时候 用viewpager来做切换的动画 将需要去切换的fragmentA fragmentB加入到fragmentAdapter中后 页面没有显示出来fragmentA或者fragmentB的内容
  • 使用机器学习做DGA域名识别

    DGA域名 域名生成算法 Domain Generation Algorithm DGA 是一项古老但一直活跃的技术 是中心结构僵尸网络赖以生存的关键武器 该技术给打击和关闭该类型僵尸网络造成了不小的麻烦 研究人员需要快速掌握域名生成算法和
  • CountDownLatch 用法和详解

    CountDownLatch 是多线程控制的一种工具 它被称为 门阀 计数器或者 闭锁 这个工具经常用来用来协调多个线程之间的同步 或者说起到线程之间的通信 而不是用作互斥的作用 下面我们就来一起认识一下 CountDownLatch 认识
  • 深度学习------不同方法实现Inception-10

    本博客通过tensorflow实现inception10模型 对于inception10模型有不同的写法 包括 sequence模型 类封装 自定义函数 而本博客主要通过自定义函数和类封装实现inception10 代码和模块图如下 inc
  • 基于echarts 做的男女比例

    data数据 maleToFemaleRatio FemaleNumber 28417 FemaleRadio 45 17 MaleNumber 34491 MaleRadio 54 83 完整代码 var myChart echarts
  • 面试题 04.02. 最小高度树

    面试题 04 02 最小高度树 给定一个有序整数数组 元素各不相同且按升序排列 编写一个算法 创建一棵高度最小的二叉搜索树 示例 给定有序数组 10 3 0 5 9 一个可能的答案是 0 3 9 10 null 5 它可以表示下面这个高度平
  • 在ch32v307单片机上移植LUA

    下载lua源代码 先到官网下载lua源代码 http www lua org 然后解压出源码 源码移植 这里基于官方例程中的串口例程进行移植 USART Printf例程 使用MounRiver Studio该工程 然后添加lua源码 需要
  • 说说对 Node 中的 Buffer 的理解?应用场景?

    一 是什么 在Node应用中 需要处理网络协议 操作数据库 处理图片 接收上传文件等 在网络流和文件的操作中 要处理大量二进制数据 而Buffer就是在内存中开辟一片区域 初次初始化为8KB 用来存放二进制数据 在上述操作中都会存在数据流动
  • Android Studio 安装 SDK 失败

    https blog csdn net zdw wym article details 74942772 utm source tuicool utm medium referral
  • 计算机端口详解

    计算机端口详解 一 摘要 端口是个网络应用中很重要的东西 相当于 门 了 二 什么是端口 在 Internet上 各主机间通过TCP TP协议发送和接收数据报 各个数据报根据其目的主机的ip地址来进行互联网络中的路由选择 可见 把数据报顺
  • 【C语言】如何只打印小数的有效数字位数且不补0

    我们时常会碰到使用printf打印小数但只想显示该小数有有效数字的小数位数 这时使用float或者double类型打印时往往会出现以下情况 但是如果我们不想打印39 5之后的小数 那么就需要将c语言中printf语句中的 f 表示十进制浮点
  • pipreqs——快捷生成一个Python项目的依赖模块requirements.txt

    依赖模块文件快捷生成requirements txt 解决代码复用过程中 低效环境配置的问题 使用步骤 1 安装pipreqs pip install i https pypi tuna tsinghua edu cn simple pip
  • Tomcat的优化

    Tomcat作为一款常用的web容器 对其进行优化是提升性能的重要手段 对其进行优化可以从以下方面入手 调整内存 调整线程池 Executor 调整连接器 Connector 调整运行模式 调整内存 如果内存设置过小 极有可能导致项目无法启