tomcat7优化记录

​​​​1.修改用户名密码都为tomcat修改tomcat-users.xml

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

2.开启共享线程池:此选项默认是注释的,打开即可

name线程池名字,必须唯一。后面会用到。
namePrefix="catalina-exec-"线程的名字前缀,用来标记线程名字的,这样每个线程就用这个前缀加上线程编号了
minSpareThreads最小的保持活跃的线程数量,太小了就影响反应速度,太大了白白占用资源。
maxThreads允许的最大线程池里的线程数量默认是200,大的并发应该设置的高一些,反正只是限制而已,不占用资源 
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="20000" minSpareThreads="60" />
注意:如果配置了一个Executor,则该属性的任何值集将被正确记录,但是它将被显示为-1,但此值是生效的。详情见https://blog.csdn.net/weixin_38278878/article/details/80144397

3.优化运行模式改:BIO模式为NIO模式并使用上面定义的线程池

1)bio默认的模式,性能非常低下,没有经过任何优化处理和支持.bio模式是和前面的就项目做兼容
2)nio利用java的异步io护理技术,no blocking IO技术,为高并发高性能的应答模式(NIO).
3)安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.必须要安装apr和native,直接启动就支持apr利用java的异步io护理技术,no blocking IO技术.
注:在控制台上(如图1所示)或者管理界面都可以看到,tomcat启动的通讯模式是bio的。

修改cat server.xml 一下内容

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
改为
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" //修改为NIO模式            
    executor="tomcatThreadPool"
    connectionTimeout="2000"
    redirectPort="8443"
    enableLookups="false"
    acceptCount="5000" 
    maxConnections="10000" 
    maxThreads="10000"
    compression="on"
    compressionMinSize="4096"
    URIEncoding="utf-8" />

参数解释:

#注意如果配置了一个Executor,则该属性的任何值集将被正确记录,但是它将被显示为-1,详情见:https://blog.csdn.net/weixin_38278878/article/details/80144397
URIEncoding="utf-8"使得tomcat可以解析含有中文名的文件的url
executor="tomcatThreadPool" //使用上面定义的线程池
connectionTimeout= //网络连接超时毫秒
noCompressionUserAgents="gozilla, traviata" //对于以下的浏览器,不启用压缩
compressionMinSize="4096"启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json,application/x-
javascript " 开启静态文件压缩 
enableLookups="false" 关闭反向查询为了消除DNS查询对性能的影响我们可以关闭DNS查询
acceptCount是当线程数达到maxThreads(可创建的最大线程数)后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个
队列也满了,就直接refuse connection 即:acceptCount:Tomcat维护最大的对列数
maxThreads :Tomcat可创建的最大线程数,上面已经使用了线程池所以这里指定的maxThreads会失效。
maxConnections :最多能并发处理的连接请求
compression="on"开启静态文件压缩
protocol="org.apache.coyote.http11.Http11NioProtocol" //修改为NIO模式

4.tomcat7中maxConnections、maxThreads、acceptCount的含义及关系:

maxConnections当连接数达到最大值后,系统会继续接收连接但不会超过acceptCount的值
acceptCount=300等待连接的队列数
maxThreads Tomcat=800 线程池最多能起的线程数
maxConnections=600 最大能并发处理的连接数
比如某一瞬间的并发时1000,那么最终Tomcat的线程数将会是600,那么同时处理的将是600个请求,由于设置了acceptcount=300,所以剩余300进入队列“排队”,么有100个请求会被拒掉。

5.优化JVM 修改配置文件:catalina.sh

cat catalina.sh
export JAVA_HOME=/opt/jdk
export PATH=${JAVA_HOME}/bin:$PATH
JAVA_OPTS="-server -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Xms2048m -Xmx2048m -Xmn768m -XX:MaxMetaspaceSize=192m -XX:+UseFastAccessorMethods -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/tomcat-1/dump"

解释说明参考:
https://www.cnblogs.com/dengyungao/p/7542604.html
https://www.cnblogs.com/xbq8080/p/6417671.html

6.优化tomcat启动速度

打开vi /opt/jdk/jre/lib/security/java.security
将securerandom.source=file:/dev/random 替换为 securerandom.source=file:/dev/./urandom

7.如果配置nginx做为静态资源处理可将AJP禁用

apache基金下的AJP是用来来做静态资源处理的,而这部分需要花费大量时间,当用nginx和tomcat做企业级集群的时候,需要禁用掉AJP协议,有关AJP问题请往下看-7.1
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

7.1AJP答疑解惑

虽说用了tomcat也有一段时间了,大伙都知道tomcat默认启动会有3个端口:8080端口为http协议端口,8005为管理端口,8009是AJP协议端口。但在每次在优化tomcat 服务时都会禁用8009端口。关于APJ协议网络博客上大多数回答的都是"ajp协议是tomcat为了动静资源处理分离时,通过该协议可以将css、js等静态资源请求转发到Apache的http服务器处理,提高并发量,在没有用到apache时可将其禁用。"那么在现实配置中并没有用到apache 而是用的nginx ,为什么不采用ajp协议呢而是采用http协议?我想大多数伙伴都有和我一样的困惑,最近偶尔看了一篇有关这个问题回答的博客,完美解决了心中的疑惑。下面就将博友的问题及相关回答原话摘抄下来以备留存!

6671bad8bb31b93186c09f64b4cb291cc49.jpg

博友回答:ajp13是一个二进制的TCP传输协议,相比HTTP这种纯文本的协议来说,效率和性能更高,也做了很多优化。显然,浏览器并不能直接支持AJP13协议,只支持HTTP协议。所以实际情况是,通过Apache的proxy_ajp模块进行反向代理,暴露成http协议给客户端访问。所以这么来看实际跟动静分离没一毛钱关系,你如果没做动静分离的设置,那么单纯反向代理AJP13协议也没太大的意义。
其他支持AJP协议的代理服务器当然也可以用这种做法。但是实际情况是,支持AJP代理的服务器非常少,比如目前很火爆的Nginx就没这个模块。因此tomcat的配置大部分都是关闭AJP协议端口的,因为除了Apache之外别的http server几乎都不能反代AJP13协议,自然就没太大用处了.

有关nginx是否具有相关AJP支持的模块,经过一番搜索 发现nginx有ajp模块且是国人贡献的,(nginx本身不包含ajp模块)需要我们在github在: https://github.com/yaoweibin/nginx_ajp_module 上 单独下载,安装此模块需要重新编译nginx, 既然有为什么没有有人用, 是该模块与ajp通讯中存在某种不足还是ajp本身存在问题等,我们不得而知, 后续有机会在测试吧,今天就到这里!

转载于:https://my.oschina.net/wangyunlong/blog/3046211

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值