一文学会Tomcat优化,查看tomcat中jvm内存结构

本文详细介绍了如何通过配置Tomcat以优化内存使用和提升并发性能。包括修改manager权限,调整jvm内存参数,启用AggressiveOpts和BiasedLocking,设置元空间大小,以及调整Connector配置以使用NIO或Apr协议。此外,还涉及了session超时设置,日志错误排查,以及压力测试结果对比,展示了优化前后的性能差异。
摘要由CSDN通过智能技术生成

查看tomcat中jvm内存结构

图形化界面查看

localhost:8080/manager/status

可以查看manager页面

如果是远程访问tomcat,会报403无法访问错误
403无权查看

1.红框1中告诉我们没有权限,提示我们修改context.xml文件

manager权限修改:vim webapps/manager/META-INF/context.xml

对于红框中部分进行注释或者修改,如果想要安全性高一些,可已修改allow值,支持IP地址的正则表达式
manager注释

2.403错误中红框2告诉,如果想访问manager页面,还要添加一个用户,并给出了相应的角色

打开tomcat下的conf/tomcat-user.xml文件,关于用户角色、管理员的信息都在这个配置文件中。

admin-gui是host-manager的角色,它提供了虚拟主机的 web 管理界面,

host-manager权限修改:vim webapps/host-manager/META-INF/context.xml

修改方法同manager

添加以下代码到tomcat-user.xml

<role rolename =“ manager-gui” />

<role rolename =“ admin-gui” />

<user username =“ admin” password =“admin” role =“ admin-gui,manager-gui” />
tomcat-users
修改后再次启动tomcat,进入/manager/status页面,可以清除看到jvm内存情况
tomcatjvm内存

lsof -i:8080查看8080端口有没有启动

命令行查看

查看tomcat进程:ps -ef|grep tomcat

查看堆内存:jmap -heap tomcat进程号
命令行查看tomcatjvm

tomcat启动优化

tomcat/bin/catalina.sh

示例:
export JAVA_OPTS="-server -Xms512M -Xmx512M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"

参数以及解释
1.-server
启用jdk 的server版;
只要你的tomcat是运行在生产环境中的,这个参数必须添加
因为tomcat默认是以一种叫java -client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcat以server模式运行时将拥有:
更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量…

2.-Xms-Xmx
-Xms初始堆大小;其初始空间(即-Xms)是物理内存的1/64,-Xm×最大堆大小;最大空间(-Xmx)是物理内存的1/4。
-Xmn年轻代堆内存大小,此处是(eden+ 2 survivor space),默认为物理内存的1/64.
可以利用JVM提供的-Xmn -Xms -Xmx等选项,
要加"m"说明是MB,否则就是KB了,在启动tomcat时会报内存不足。
把Xms与Xmx两个值设成一样是最优的做法
why?
一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。因为默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。

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

4.-XX:+AggressiveOpts
自带魔法属性,从单词可以看出,积极的、生猛的,也即可以将最新版的JDK优化后的新特性自动注入

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

6.-XX:MetaspaceSize -XX:MaxMetaspaceSize
设置元空间的初始大小和最大大小
可以不设置

7.-XX:MaxNewSize
设置最大的年轻代大小,默认是16M
-XX:NewSize设置年轻代大小
一般不设置

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

9.-XX:MaxTenuringThreshold=15
最大养老区吞吐量,默认15次

10.-Djava.awt.headless=true
这全参数的作用是这样的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web网页输出GIF/JPG等流,
在winodws环境下,一般我们的app server在输出图形时不会碰到什么问题,
但是在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显示的好好可是在
linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。
这个参数一般我们都是放在最后使用

11.-XX:+ PrintGCDetails
打印GC情况

tomcat并发优化

/tomcat/conf下的server.xml文件中节点的配置优化,记得先备份

 <Connector port="8080" protocol="HTTP/1.1"
                connectionTimeout="20000"
                 redirectPort="8443" />

port 端口
protocol 协议HTTP/1.1代表 默认启动 BIO 模式
connectionTimeout超时20s

优化参数 http://localhost:8080/docs/config/http.html
NIO简单版

<Connector port="803O" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="600"   重点
minSpareThreads="100"  重点
maxSpareThreads="500"  重点
acceptCount="700"   重点
connectionTimeout="20000"
redirectPort="8443"/>

复杂版

<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"/>

参数
1.URIEncoding="UTF-8"
中文乱码问题

2.minSpareThreads/maxSpareThreads
minSpareThreads Tomcat初始化时创建的线程数,最小备用线程数,
maxSpareThreads一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。

3.enableLookups
enableLookups="false"使用允许DNS查询,通常情况下设置为false
如果希望调用request.getRemoteHost()进行DNS查询,以返回远程客户的实际主机名,将enableLookups设为true.
如果希望忽略DNS查询,仅仅返回IP地址,设为false(这样提高了性能)。
缺省情况下,DNS查询是使能的。
一句话:是否反查域名,取值为:true 或 false。为了提高处理能力,应设置为false

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

5.connectionTimeout
网络连接超时,单位毫秒。设置为-1表示永不超时

6.acceptCount
是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection
一句话:acceptCount:当处理任务的线程数达到最大时,接受排队的请求个数,默认100
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。

7.maxThreads
最大线程数,即同时处理的任务个数,默认值为200
Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。
保守推荐:600—900

8.minProcessors/maxProcessors
最小的处理线程数,即使没有任何HTTP请求,TOMCAT也保持至少这么多线程以等待处理。
第一次启动此连接器时将创建的请求处理线程的数量,应该将该属性设置为小于maxProcessors设置的值。默认值为5。

同时最大的处理线程数,如果系统中已经有这个数字的线程,那么,更多的连接请求将进入排队(下面说到的ACCEPT COUNT)
此连接器要创建的请求处理线程的最大数量,因此它决定了可以处理的并发请求的最大数量。如果未指定,此属性将设置为20。

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

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

11.compressionMinSize
指定压缩输出之前的最小数据量。如果未指定,则此属性默认为 “2048”。

12.compressableMimeType
压缩类型

修改conf/web.xml配置文件,设置session-timeout的有效时间(单位:分钟)

<session-config>
	<session-timeout>30</session-timeout>
</session-config>

查看%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"文件,在文件开头增加如下设置:
export JAVA_OPTS=-Xms2048m -xmx2048m

压力测试

安装httpd-2.4.46

./configure --prefix=/usr/local/web/apache --enable-shared=max --enable-module=rewirte --enable-module=so

可能会提示缺少apr

wget http://archive.apache.org/dist/apr/apr-1.5.2.tar.gz

wget http://archive.apache.org/dist/apr/apr-iconv-1.2.1.tar.gz

wget http://archive.apache.org/dist/apr/apr-util-1.5.4.tar.gz

APR not found 问题:

tar -zxf apr-1.4.5.tar.gz

cd apr-1.4.5

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

make && make install

APR-util not found 问题:

tar -zxf apr-util-1.3.12.tar.gz

cd apr-util-1.3.12

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/bin/apr-1-config

–with-apr-iconv=/usr/local/apr-iconv/bin/apriconv

make && make install

apr-iconv

tar -zxf apr-iconv-1.2.1.tar.gz

cd apr-iconv-1.2.1

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

make && make install

pcre问题

yum -y install pcre-devel

有时候make是会出现gcc-c++的问题

网上找到gcc-c++问题解决方法

在httpd目录下再次执行下面语句

./configure --prefix=/usr/local/web/apache --enable-shared=max --enable-module=rewirte --enable-module=so --with-apr-util=/usr/local/apr-util --with-apr=/usr/local/apr

make

make install

进入bin目录:cd /usr/local/web/apache/bin/

执行压测语句: ./ab -n1000 -c100 http://localhost:8080/ (1000次,100并发)
压测报告

三大模式

BIO

BIO是最稳定最老的一个连接器,是采用阻塞的方式,意味着每个连接线程绑定到每个Http请求,直到获得Http响应返回,如果Http客户端请求的是keep-Alive连接,那么这些连接也许一直保持着直至达到timeout时间,这期间不能用于其它请求。性能差但是最稳定

出厂默认 protocol=“HTTP/1.1”

NIO

NIO是使用Java的异步IO技术,不产生阻塞。nio(new I/O),是JavaSE1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blockingI/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,能大幅度提升性能

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

使用apr模式

安装apr,apr-iconv,apr-util三个组件

安装tomcat-native

还要安装tomcat-native.tar.gz

此压缩包在tomcat的bin目录下

进入目录:cd /usr/local/tomcat/bin/

解压:tar -zxf tomcat-native.tar.gz

得到tomcat-native-1.2.21-src文件
tomcat-native

然后进入native目录:cd tomcat-native-1.2.21-src/native/

然后使用以下三个命令

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

make

make install

配置文件

vim /usr/local/tomcat/bin/catalina.sh

关闭tomcat

编辑添加如下内容

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

加入前面启动优化的代码
catalina2

在/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"/>

server

启动tomcat,查看manager/status页面,可以看到和前面初始的不同了
改动后的tomcatjvm

压力测试结果

测试结果
注意:压力测试一开始的结果会比较小,多次测试后会达到一个比较平衡的值。

同时用之前的1000次,100并发进行压测

默认BIO的tomcat 每秒并发平均2800/s 最高3200/s 1000次中最大响应时间为179ms

调优后的Apr的tomcat 每秒并发平均4800/s 最高5400/s 1000次中最响应时间为31ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值