tomcat调优配置

一. 设置账户进入管理页面

通过浏览器进入Tomcat7的管理模块页面:http://localhost:8080/manager/status

按照提示,在Tomcat7服务器指定的位置修改配置文件(conf/tomcat-users.xml),增加相应的用户和角色配置标签

<role rolename="admin-gui"/>

<role rolename="manager-gui"/>

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

重启服务器后,再次访问服务器管理模块页面:http://localhost:8080/manager/status

二. tomcat的启动调优

Tomcat7启动需要执行bin/catalina.sh文件,所以需要修改此文件,增加配置。

(修改文件前请事先做备份: cp catalina.sh catalina.sh.bk)

在文件开头处增加配置:

export JAVA_OPTS="-server -Xms1600M -Xmx1600M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"

注:32位操作系统,无论你的内存有多大,最大只支持4G内存,所以,请一定要装64位操作系统

执行命令获取当前Tomcat服务的进程号PID :  ps -ef | grep tomcat

执行命令查看当前系统中jvm堆的内存详情 jmap –heap PID

-server : -server 启用jdk 的 server 版;

只要你的tomcat是运行在生产环境中的,这个参数必须添加

因为tomcat默认是以一种叫java–client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcat以server模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量

-Xms–Xmx

-Xms 初始堆大小;其初始空间(即-Xms)是物理内存的1/64,

-Xmx 最大堆大小; 最大空间(-Xmx)是物理内存的1/4。

-Xmn 年轻代堆内存大小,此处是(eden+ 2 survivor space),默认为物理内存的1/64.

可以利用JVM提供的-Xmn -Xms -Xmx等选项,

要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。

把Xms与Xmx两个值设成一样是最优的做法

==================================================

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

-Xss :是指设定每个线程的栈大小。一般设置不超过1M,要不然容易出现out of memory。

-XX:+AggressiveOpts:积极的、生猛的,也即可以将最新版的JDK优化后的新特性自动注入

-XX:+UseBiasedLocking:

启用一个优化了的线程锁,对于高并发访问很重要 ,太多的请求忙不过来它自动优化,对于各自长短不一的请求,出现的阻塞、排队现象,他自己优化。

-XX:PermSize -XX:MaxPermSize

-XX:PermSize设置Perm区的初始大小,默认是物理内存的1/64;

在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。

-XX:MaxPermSize设置Perm区的最大值,默认是32M,建议达到物理内存的1/4。

 存放的都是jvm初始化时加载器加载的一些类型信息(包括类信息、常量、静态变量等),这些信息的生存周期比较长,GC不会在主程序运行期对PermGen Space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen Space错误。

上述两个参数值存在于jdk1.7之前,1.8后就没有了。

-XX:MaxNewSize:设置最大的年轻代大小,默认是16M

-XX:NewSize 设置年轻代大小

-XX:+DisableExplicitGC :

在程序代码中不允许有显示的调用”System.gc()”,避免内存的大起大落, 忽略手动调用GC的代码使得 System.gc()的调用就会变成一个空调用,完全不会触发任何GC

-XX:MaxTenuringThreshold:设置对象在新生代中存活的次数,设置垃圾最大年龄

1 如果设置为零的话,则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较多的应用,可以提高效率。

2 如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。

这个值的设置是根据本地监控后得到的一个理想的值,不能一概而论原搬照抄。

默认为:15。

-XX:+UseConcMarkSweepGC :

使用CMS内存收集。即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。

我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒

 添加该参数表示启动并发标识-清理(Mark-Sweep)回收器(CMS)

-XX:+UseParNewGC :设置年轻代为并行收集,对年轻代采用多线程并行回收,这样收得快

-XX:+CMSParallelRemarkEnabled :

在使用UseParNewGC 的情况下, 尽量减少mark 的时间,降低标记停顿

-XX:+UseCMSCompactAtFullCollection :

在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。

-XX:LargePageSizeInBytes :指定 Java heap的分页页面大小

-XX:+UseFastAccessorMethods :get,set 方法转成本地代码

-XX:+UseCMSInitiatingOccupancyOnly :

指示只有在 old generation 在使用了初始化的比例后concurrent collector 启动收集

-Djava.awt.headless=true

这个参数一般我们都是放在最后使用的, 在web网页中可能会输出GIF/JPG等图片流,在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。

-XX:+PrintGCDetails :打印GC详情

三. Tomcat并发优化

优化前

基础优化

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"

 maxThreads="600"

 minSpareThreads="100"

 maxSpareThreads="500"

 acceptCount="700"

 connectionTimeout="20000"

 redirectPort="8443" />

MaxThreads: 设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目。即最大并发数,默认值为200,建议修改为500以上。保守 600 ~ 900

minSpareThreads: Tomcat初始化时创建的线程数。默认值是10, 此处我们设置为100

maxSpareThreads: 一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。此处的值我们设置为500。

acceptCount: 当所有可以使用的处理请求的线程都被用光时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,而返回Connection refused错误;默认值100

connectionTimeout: 等待超时的时间数(以毫秒为单位),建议修改为20000以上;

高级优化

<Connector  port="8080"

    protocol="org.apache.coyote.http11.Http11NioProtocol"

    URIEncoding="UTF-8"

    minSpareThreads="25"

    maxSpareThreads="75"

    enableLookups="false"

    disableUploadTimeout="true"

    connectionTimeout="20000"

    acceptCount="300"

    maxThreads="300"

    maxProcessors="1000"

    minProcessors="5"

    useURIValidationHack="false"

    compression="on"

    compressionMinSize="2048"

 compressableMimeType="text/html,text/xml,text/JavaScript,text/css,text/plain"

    redirectPort="8443"/>

参数说明

URIEncoding=”UTF-8”

使得tomcat可以解析含有中文名的文件的url,在server.xml文件的Connector标签中增加URIEncoding="UTF-8"属性,解决中文参数乱码问题。

minSpareThreads:

maxSpareThreads

enableLookups

如果希望调用request.getRemoteHost()进行DNS查询,以返回远程客户的实际主机名,将enableLookups设为true。

如果希望忽略DNS查询,仅仅返回IP地址,设为false(这样提高了性能)。

缺省情况下,DNS查询是使能的。

一句话:是否反查域名,取值为: true 或 false 。为了提高处理能力,应设置为 false

disableUploadTimeout

类似于Apache中的keepalive一样,是否需要tomcat容器单独设置上传时间限制,这里是不用,还是使用标准的,不去给上传的附件单独做超时设置。

connectionTimeout :

acceptCount

acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection一句话:acceptCount:当处理任务的线程数达到最大时,接受排队的请求个数,默认100

maxThreads :

maxProcessors

在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。

通常Windows是1000个左右,Linux是2000个左右。

minProcessors

useURIValidationHack:减少它对一些url的不必要的检查从而减省开销,为提高性能可以设置为false

compression

compression :设置是否开启GZip压缩,HTTP压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。

compressionMinSize

compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB

compressableMimeType:哪些类型需要压缩,默认是text/html,text/xml,text/plain

最后不要忘了把8443端口的地方也加上同样的配置,因为如果我们走https协议的话,我们将会用到8443端口这个段的配置。

修改conf/web.xml文件,增加服务器会话超时时间

四.tomcat 内存优化

查看%TOMCAT_HOME%\logs文件夹下,日志文件是否有内存溢出错误

错误提示:java.lang.OutOfMemoryError: Java heap space

Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。

常见的问题是报Tomcat内存溢出错误,Out of Memory(系统内存不足)的异常,从而导致客户端显示500错误,

一般调整Tomcat的使用内存即可解决此问题。

windows环境下修改

“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:

set JAVA_OPTS=-Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC

Linux环境下修改

“%TOMCAT_HOME%\bin\catalina.sh”文件,在文件开头增加如下设置:

JAVA_OPTS=-Xms2048m -Xmx2048m

错误提示:java.lang.OutOfMemoryError: PermGen space

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre-compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了

windows环境下修改

%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:

set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m - XX:MaxPermSize=256m

linux环境下修改

“%TOMCAT_HOME%\bin\catalina.sh”文件,在文件开头增加如下设置:

export JAVA_OPTS=-Xms256m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m XX:MaxPermSize=256m

五.

Tomcat 之BIO/NIO/APR的三大模式

BIO

BIO是最稳定最老的一个连接器,是采用阻塞的方式,意味着每个连接线程绑定到每个

Http请求,直到获得Http响应返回,如果Http客户端请求的是keep-Alive连接,那么这些连接也许一直保持着直至达到timeout时间,这期间不能用于其它请求。性能差但是最稳定

NIO

NIO是使用Java的异步IO技术,不产生阻塞。nio(new I/O),是Java SE1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。

直接修改server.xml里的Connector节点,修改protocol为 :

protocol="org.apache.coyote.http11.Http11NioProtocol"

APR

APR(Apache Portable Runtime)是使用原生C语言编写的非堵塞I/O,利用了操作系统的网络连接功能,速度很快,从操作系统层面解决IO问题。但是需先安装apr和native,若直接启动就支持apr,能大幅度提升性能。

     直接修改server.xml里的Connector节点,修改protocol为:

protocol=" org.apache.coyote.http11.Http11AprProtocol "

安装APR

安装APR

  • 解压缩apr-1.5.2.tar.gz

  • 在目录/opt/apr/apr-1.5.2 下执行:./configure --prefix=/usr/local/apr

  • make

  • make install

安装apr-iconv

  • 解压缩apr-iconv-1.2.1.tar.gz

  • 在目录/opt/apr/apr-iconv-1.2.1下执行

./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr

  • make

  • make install

安装apr-util

  • 解压缩apr-util-1.5.4.tar.gz

  • 在目录/opt/apr/apr-util-1.5.4下执行:

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv

  • make

  • make install

安装tomcat-native

  • 进入tomcat7的bin目录

  • 解压缩tomcat-native.tar.gz文件

  • 在目录/opt/tomcat7/bin/tomcat-native-1.2.7src/native下执行:

  • make

  • make install

设置apr的环境变量

  • vim /opt/tomcat7/bin/catalina.sh

  • 编辑添加如下内容

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib export LD_LIBRARY_PATH

保存退出

 

修改Apr的默认配置

  • /opt/tomcat7/conf目录下的server.xml文件内容:

增加配置:<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

URIEncoding="UTF-8"

maxConnections="10000"

maxThreads="2000"

acceptCount="2000"

minSpareThreads="100"

compression="on"

compressionMinSize="2048"

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

enableLookups="false"

disableUploadTimeout="true"

connectionTimeout="20000"

redirectPort="8443" />

压力测试

ab -n1000 -c100 http://localhost:8080/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/201029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10个火爆的设计素材网站推荐

所谓聪明的女人没有米饭很难做饭&#xff0c;设计师也是如此。如何找到优秀的设计材料是每个设计师的痛点&#xff0c;国内材料网站收费&#xff0c;但也限制使用范围和期限&#xff0c;大多数外国设计网站不能打开或需要特殊互联网使用&#xff0c;有一定的安全风险。 作为一…

微服务实战系列之Redis(cache)

前言 云淡天高&#xff0c;落木萧萧&#xff0c;一阵西北风掠过&#xff0c;似寒刀。冬天渐渐变得更名副其实了。“暖冬”的说法有点言过其实了。——碎碎念 微服务实战系列之Cache微服务实战系列之Nginx&#xff08;技巧篇&#xff09;微服务实战系列之Nginx微服务实战系列之F…

【hacker送书第4期】推荐4本Java必读书籍(各送一本)

第4期图书推荐 Java从入门到精通&#xff08;第7版&#xff09;内容简介参与方式 项目驱动零基础学Java内容简介参与方式 深入理解Java高并发编程内容简介参与方式 Java编程讲义内容简介参与方式 Java从入门到精通&#xff08;第7版&#xff09; 内容简介 《Java从入门到精通&…

Linux下文件操作函数

一.常见IO函数 fopen fclose fread fwrite fseek fflush fopen 运行过程 &#xff1a;打开文件 写入数据 数据写到缓冲区 关闭文件后 将数据刷新入磁盘 1.fopen 返回文件类型的结构体的指针 包括三部分 1).文件描述符&#xff08;整形值 索引到磁盘文件&#xff09;…

【执行批处理后 executeBatch() 没反应,一个参数相信就能搞定】

一、场景是在使用EasyExcel读取全表时&#xff0c;每次手动提交事务6w多条&#xff0c;总计190w数据量的情况下发生的。 博主比较fw&#xff0c;卡住了两天&#x1f636; 此问题还有一个比较bug的地方&#xff0c;就是当你在 executeBatch() 上下打断点时还能够执行出来&…

目标检测——R-CNN算法解读

论文&#xff1a;Rich feature hierarchies for accurate object detection and semantic segmentation 作者&#xff1a;Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik 链接&#xff1a;https://arxiv.org/abs/1311.2524 代码&#xff1a;http://www.cs.berke…

信创之国产浪潮电脑+统信UOS操作系统体验8:安装Docker并进行测试验证scratch镜像

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、前言 今日在进行Docker容器相关知识的学习&#xff0c;不过学习环境都不是基于统信UOS操作系统的&#xff0c;为了实验&#xff0c;老猿觉得手头国产浪潮电脑统信UOS操作系统就是原生的linux操作系统&a…

【SparkSQL】基础入门(重点:SparkSQL和Hive的异同、SparkSQL数据抽象)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Spark SQL的定义、特点、发展历史、与hive的区别、数据抽象、SparkSession对象。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一…

用flutter 写一个专属于儿子的听书的app

背景: 儿子最近喜欢上了用儿童手表听故事&#xff0c;但是手表边里的应用免费内容很少&#xff0c;会员一年要300多&#xff0c;这么一笔巨款&#xff0c;怎能承担的起&#xff0c;所以打算自己开发一个专属于儿子的听书app。 最终效果&#xff1a; 架构&#xff1a; 后端由两…

论文阅读:Distributed Initialization for VVIRO with Position-Unknown UWB Network

前言 Distributed Initialization for Visual-Inertial-Ranging Odometry with Position-Unknown UWB Network这篇论文是发表在ICRA 2023上的一篇文章&#xff0c;本文提出了一种基于位置未知UWB网络的一致性视觉惯性紧耦合优化测距算法( DC-VIRO )的分布式初始化方法。 对于…

解决:ModuleNotFoundError: No module named ‘qt_material‘

解决&#xff1a;ModuleNotFoundError: No module named ‘qt_material’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named qt_material背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&#xff0c;报错&…

Django快速搭建静态网页

Django的快速搭建 这个是例子 这个是一个目录 项目名称&#xff1a;项目似乎被命名为DJ0928&#xff0c;这是Django项目的根目录。 文件都是Django项目的核心配置文件。 settings.py 包含了项目的配置设置。urls.py 定义了项目的URL路由。wsgi.py 和 asgi.py 分别用于Web服务器…

力扣刷题篇之分治

系列文章目录 目录 系列文章目录 前言 一、分解问题 二、解决子问题 三、合并结果 总结 前言 刷题按照&#xff1a; [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 - 力扣&#xff08;LeetCode&#xff09; 参考&#xff1a; 「五大常用算法」一文搞懂分治算法…

爬虫学习 异步爬虫(五)

多线程 多进程 协程 进程 运行中的程序 线程 被CPU调度的执行过程,操作系统 运算调度的min单位 在进程之中,进程中实际运作单位 from threading import Thread#创建任务 def func(name):for i in range(100):print(name,i)if __name__ __main__:#创建线程t1 Thread(target …

异步操作的方法

在高级语言中已经有了异步的原语言&#xff0c;而在C 中的最好的方式就是 libevent 的方式,我这还是相当认同的&#xff0c;高级语言就不需要在苦哈哈的&#xff0c;事件转圈了&#xff0c;但是原理还是以事件为基础的 一句话就是在一个循环中等着他执行完,这个循环中有很多其他…

CodeMeter软件保护及授权管理解决方案(二)

客户端管理工具 CodeMeter Runtime是CodeMeter解决方案中的重要组成部分&#xff0c;其为独立软件包&#xff0c;开发者需要把CodeMeter Runtime和加密后的软件一起发布。CodeMeter Runtim包括以下组件用于实现授权的使用&#xff1a; CodeMeter License Server授权服务器 Co…

Leetcode(面试题 08.01.)三步问题

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中&#xff0c;我们将要详细介绍一下Leetcode(面试题 08.01.)三步问题相关的内容 一、题目分析 1.小孩可以上一阶&#xff0c;两阶&#xff…

2948. 交换得到字典序最小的数组 (分组排序)

Problem: 2948. 交换得到字典序最小的数组 文章目录 题目思路Code 题目 给你一个下标从 0 开始的 正整数 数组 nums 和一个 正整数 limit 。 在一次操作中&#xff0c;你可以选择任意两个下标 i 和 j&#xff0c;如果 满足 |nums[i] - nums[j]| < limit &#xff0c;则交换…

Python之数据可视化

文章目录 一、1、matplotlib简单应用1.1、绘制带有中文标签和图例的图1.2、 绘制散点图1.3、绘制饼状图1.4、多个图形一起显示 一、 1、matplotlib简单应用 matplotlib模块依赖于numpy模块和tkinter模块&#xff0c;可以绘制多种形式的图形&#xff0c;包括线图、直方图、饼状…

05_MySQL主从复制架构

任务背景 ##一、真实案例 某同学刚入职公司&#xff0c;在熟悉公司业务环境的时候&#xff0c;发现他们的数据库架构是一主两从&#xff0c;但是两台从数据库和主库不同步。询问得知&#xff0c;已经好几个月不同步了&#xff0c;但是每天会全库备份主服务器上的数据到从服务…
最新文章