面试被问到了Tomcat的优化,咋整,我们没准备,就瞎扯了亿点点;
关于优化的问题,始终是面试一项必问的问题,然而我没想到的是竟然问的是tomcat优化…
就是这只猫 …
先来整理一下吧!
Tomcat 内存优化
由于tomcat使用java写的,所以我们像配置jvm那样去配置一下tomcat的参数;
在 tomcat 的启动脚本 catalina.bat中设置一些参数
JAVA_OPTS参数说明
-server 启用jdk 的 server 版
-Xms java虚拟机初始化时的最小内存
-Xmx java虚拟机可使用的最大内存
-XX: PermSize 内存永久保留区域 #jdk1.8时已经废弃了
-XX:MaxPermSize 内存最大永久保留区域 #jdk1.8时已经废弃了
配置示例:
windows中
如果是在windows下,那么在@echo off下添加
在jdk1.8之前----->>
set JAVA_OPTS=-server -Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
jdk1.8中废弃了-XX:PermSize和-XX:MaxPermSize的持久态(存放常量、静态变量区)配置,所以如果添加了-XX:PermSize和-XX:MaxPermSizetomcat会启动失败;
本次测试用的jdk11,所以作如下配置
set JAVA_OPTS=-server -Xms1024m -Xmx2048m -Xss2m -XX:MetaspaceSize=256m -XX:MaxNewSize=256m
测试—
在linux中,要修改catlina.sh
在cygwin=false
之上添加
JAVA_OPTS=’-Xms1024m -Xmx2048m -Xss2m -XX:MetaspaceSize=256m -XX:MaxNewSize=1024m ’
Tomcat并发优化
即调整Tomcat的并发处理能力
在tomcat的配置文件夹下----conf
找到Connector配置---->>>如下图
参考配置如下
配置说明:
maxThreads :客户请求最大线程数
minSpareThreads :**Tomcat初始化时创建的 socket 线程数**
maxSpareThreads: Tomcat连接器的最大空闲 socket 线程数
enableLookups :是否**反查域名,**取值为: true 或 false 。为了提高处理能力,应设置为 false
redirectPort: 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount: 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
connectionTimeout: 连接超时
minProcessors: 服务器创建时的最小处理线程数
maxProcessors: 服务器同时最大处理线程数
URIEncoding: URL统一编码
和最大连接数相关的参数为maxProcessors和acceptCount ,如果要加大并发连接数,应同时加大这两个参数。
压缩优化
配置内容
compression="on" 打开压缩功能
compressionMinSize="2048"启用压缩的输出内容大小,默认为2KB
noCompressionUserAgents="gozilla,traviata" 对于以下的浏览器,不启用压缩
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 明确哪些资源类型需要压缩
线程优化
与线程优化有关的配置---->>
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100
minSpareThreads:Tomcat初始化时创建的线程数。
maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程
maxThreads的数值设置
一般要考虑两方面的原因----->>
- 1,cpu的运算能力
如果业务逻辑中cpu计算比较多的话,那么应该减少maxThreads的值以降低同一时间内争抢CPU的线程个数(减少cpu计算到一半时又转去处理其他的任务这之间CPU的切换时间),让cpu能够尽快完成计算任务,这样才能提高系统性能;
- 2,IO操作
如果业务逻辑中对于IO操作比较多的话,外部等待的时间会增加,这样CPU就会闲置,因此可以适当增加maxThreads的值,这样才能提高比你高发处理能力;
实际生产中更多的时两者相结合的情况;
maxThreads 配置要结合 JVM -Xmx 参数调整,也就是要考虑内存开销;
acceptCount的配置,
即等待队列的大小设置,太大太小都不好,同时要配合线程数量的设置才能发挥很好的效能;
一般是设置的跟maxThreads一样大,这个值应该是主要根据应用的访问峰值与平均值来权衡配置的。如果设的较小,可以保证接受的请求较快响应,但是超出的请求可能就直接被拒绝,如果设的较大,可能就会出现大量的请求超时的情况,因为我们系统的处理能力是一定的。
调整线程数
协议类型优化
关闭AJP端口
AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。若tomcat未与apache配合使用,因此不使用此连接器,因此需要注销掉该连接器。
当然默认也是关闭的
bio模式
数据的读取与写入都必须阻塞在一个线程中执行,在在写入完成或读取完成前,线程时阻塞的;在传统的BIO中,一个客户端请求服务器后,服务器会经过Sokcet启动一条链路将其连接并且处理,该链路的IO操作是同步阻塞的,所以该客户端和服务器的连接不可被其他客户端所使用,只能够等待当前的客户端操作完成后释放掉当前连接。
如果该连接不做任何操作就会造成不必要的线程开销;
nio模式
同步非阻塞:NIO是面向缓冲区的。 数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。
如果业务涉及到的异步操作比较多,可以切换至apr模式
简单的理解就是从操作级别解决异步IO问题,大幅度的提高服务器的性能和响应性能,也是Tomcat运行高并发应用的首选模式。从Tomcat 7.0.30开始,Tomcat默认支持apr。
apr模式
在win平台上开启apr
1,下载apr相关的文件
点击链接下载
2,复制对应的tcnative-1.dll文件到tomcat安装文件夹下的bin文件夹下;
3,配置文件—server.xml
这样基于apr模式的tomcat就启动成功了;
注:apr异步非阻塞也用到了nio
在linux上开启apr
首先下载apr相关的文件
打包下载完整版文件包---->>
之后登陆linux系统,
cd /usr/local/
wget https://dlcdn.apache.org//apr/apr-1.7.0.tar.gz
tar -zxf apr-1.7.0.tar.gz
[root@Gavin local]# cd apr-1.7.0/
[root@Gavin apr-1.7.0]# ls
apr-config.in CMakeLists.txt libapr.mak poll
apr.dep config.layout libapr.rc random
apr.dsp configure LICENSE README
apr.dsw configure.in locks README.cmake
apr.mak docs Makefile.in shmem
apr.pc.in dso Makefile.win strings
apr.spec emacs-mode memory support
atomic encoding misc tables
build file_io mmap test
build.conf helpers network_io threadproc
buildconf include NOTICE time
build-outputs.mk libapr.dep NWGNUmakefile tools
CHANGES libapr.dsp passwd user
开始配置---->>apr
[root@Gavin native]# ./configure --prefix=/home/Apache/install/apr
make && make install
正常执行结果---->>
配置apr-util
[root@Gavin local]# tar -zxf apr-util-1.6.1.tar.gz
[root@Gavin local]# cd apr-util-1.6.1/
[root@Gavin local]#./configure --prefix=/home/Apache/install/apr-util -with-apr=/home/Apache/install/apr/bin/apr-1-config
[root@Gavin local]# make && make install
部分结果展示----->>
配置apr-iconv
[root@Gavin local]# tar -zxf apr-iconv-1.2.2.tar.gz
[root@Gavin local]# cd apr-iconv-1.2.2
[root@Gavin local]# ./configure --prefix=/home/Apache/install/iconv --with-apr=/home/Apache/install/apr
[root@Gavin local]# make && make install
注:该配置要与apr 相关联,所以要制定apr地址
正常结果---->>
其他配置-----如果你需要配置Apache http服务器,请继续往下看;
配置pcre
[root@Gavin local]# tar -zxf pcre-8.40.tar.gz
[root@Gavin local]# cd pcre-8.40/
[root@Gavin local]# ./configure --prefix=/home/Apache/install/pcre
主从安装结果—>>>
配置httpd
[root@Gavin local]# tar -zxf httpd-2.4.25.tar.gz
[root@Gavin local]# cd httpd-2.4.25/
[root@Gavin local]# ../configure --prefix=/home/Apache/install/httpd-2.4.25 --with-apr=/home/Apache/install/apr --with-apr-util=/home/Apache/install/apr-util --with-pcre=/home/Apache/install/pcre
安装结果—>>
启动Apache:/home/Apache/install/httpd-2.4.25/bin/apachectl start
•停止Apache:/home/Apache/install/httpd-2.4.25/bin/apachectl stop
•重启Apache:/home/Apache/install/httpd-2.4.25/bin/apachectl restart
系统内核参数优化
修改/etc/sysctl.cnf文件,在最后追加如下内容:
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_max_syn_backlog = 65536
保存退出,执行sysctl -p生效
总结—>>>tomcat的优化主要涉及----根据实际需要调整内存,IO量 ,去选择不同的参数,根据并发业务情况选择nio/apr模式;
另一个根据jdk版本不同,内存涉及到的参数会有些变化;