Web服务器加速之Tomcat7性能如何调优
1. Tomcat是一个运行在Java JVM(虚拟机)幸运飞艇源码开发 www.1159880099.com 企鹅 1159880099环境的的一个应用,使用Java开发的。
2. Tomcat也有自己的web管理功能,分别对应了Tomcat下webapps下的项目如下:
都对应了不同的角色能访问到具体的项目,目前掌握的Tomcat只有如下:
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<role rolename="admin "/>
<role rolename="admin "/>
这里的配置是配置管理员账号,目的是进入Tomcat默认部署的项目,进行相关Tomcat启动参数和启动信息
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>
3. 疑问:由于没有阅读和百度到具体的角色权限访问项目的详细描述,暂时不知道admin,manager和manager-gui,admin-gui(这二个主要是配置server status和host manager管理页面访问)角色区别,都对应了什么样的权限问题?
4. 客户端动态请求访问Tomcat下webapps下的项目动态资源(http1.0或http1.1)会直接根据http1.0或http1.1直接返回资源,但在在访问静态资源的时候,在tomcat(服务端)不会直接返回静态资源,会在客户端和服务端多一层静态资源的处理,服务端-->ajp(协议)-->静态资源处理-->http协议-->客户端,但通常ajp的协议一般都用不到的。
![](/qrcode.jpg)
中间静态资源处理也不是本地就能直接处理的,而是转发到Apache基金下的服务器来做静态资源处理的,很消耗资源,又不是常用到,而且做静态资源处理的时候一般都用Nginx+Tomcat来处理,且Nginx处理性能比ajp快很多,所有可以得到如下优化手段:禁用ajp协议
5. Tomcat优化手段
a) 虚拟机(Jvm)优化
b) 通信协议优化(到底使用Bio,Nio,Aio和禁用ajp协议)
c) 外部连接池优化(可根据业务量和资源合理调配连接池数量),可以根据第三方工具去开启并发测试来确定一个最好线程池连接数。
d) 更加深入内部配置(server.xml)
6. 根据Tomcat的通信协议引发对通信协议的优化(Bio,Nio,Aio)
如何查看Tomcat启动时用的是什么通信模式,可以看启动日志:
参考博客地址:Tomcat Bio,Nio,Aio 模式性能测试与个人看法,https://yq.aliyun.com/articles/14768
7. server.xml 是Tomcat的核心配置文件其中包括了Tomcat整体架构信息和各组件之间的联系,service.xml 文件配置介绍参考博客地址:https://www.cnblogs.com/kismetv/p/7228274.html
8. 对比Bio,Nio的高效处理来与是:同步非阻塞,多了(通道和缓冲区和选择器,并存在连接池的概念,所有可以根据业务量来设置具体的连接处max数来优化性能,默认连接池数量为150)。
9. Jetty比Tomcat性能高,但为什么还有这么多企业都在使用Tomcat,是在于Tomcat本身虽然没有Jetty性能高,但对应的Tomcat优化后和Tomcat的可扩展性决定Tomcat还是没法被Jetty直接取代,而且基于Tomcat还是J2ee制定规范者开发的,也带来了不少人使用它。Tomcat能够进行细粒度控制和nginx搭配优化而更加厉害了,而且Tomcat内部优化非常多。
10. Tomcat 中虚拟机(Jvm)优化参数,可以直接配置到catalina.bat中
11. 连接器参数优化(主要用于受理客户端请求处理的,所有它的参数配置也特别重要)
12. 启用(外部配置连接池),可根据业务场景和我们的一个服务器硬件资源条件可以适当加大线程连接池连接池。
13. 疑问:现在下载的Tomcat默认使用的是Apr模式的通信协议而不是Bio,要怎么才能配置出Bio的通信协议?
14. 疑问:使用Nio通信模式的时候,配置外部线程池数量不好用,管理台提示线程池数量为-1?
15. Tomcat集群的时候,根据我们的项目来确定是否使用Nio模式,如果说我们的项目的类库比较新,都是1.5类库(jdk版本)之后 那么不妨我们将我们集群当中的每一个Tomcai服务器的启动模式设置为高并发高性能的应答模式-->NIO模式。
16. server.xml 配置文件如下:
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<!-- 优化手段之三:启动外部连接池,来满足高并发已经复用的请求,根据业务场景(如每秒并发数)在硬件资源条件下可以加大线程连接池 -->
<!-- 模拟并发来测试线程连接池在多少比较合适:使用第三方并非测试工具来模拟(telnet) -->
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
<!--
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
<!-- 优化手段之二:关闭bio,启动nio(高性能的应答模式), -->
<!-- 优化手段之四:连接器的优化,可以根据经验设置一个最佳实践配置参数 -->
<!-- 细粒度控制问题决定一个企业要选择tomcat,而不选择jetty,要选择mybatis而不选择hibernate,架构师都是可控灵活的架构 -->
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 优化手段之五:JVM参数的优化 -->
<!-- 优化手段之六:虚拟机的性能优化 -->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
<!-- Define an AJP 1.3 Connector on port 8009 优化手段之一,禁用ajp 减少集群处理时间 -->
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>