tomcat8优化策略——全部尝试可用

tomcat8 优化

tomcat8 的下载安装请自行百度,直接进入正文。

注:以下假设建立在你并没有深入了解过 tomcat 的基础上。

注:我使用的 tomcat 版本为 8.5.54,使用的 maven 版本为 3.6.1。

注:此文参考于:https://blog.51cto.com/14230003/2420282

如何查看 tomcat 的配置、状态

当你在游览器上输入 127.0.0.1:8080 后,出现的是 tomcat 的首页,而查看 tomcat 相关信息的入口便是在首页的头部右边,当你点击之后会出现弹窗要求你输入账号和密码。

tomcat8优化策略——全部尝试可用_第1张图片

你会想到之前只是用 tomcat 作为服务器,部署一个应用上去,然后开启,并没有设置什么账号和用户名。那么此时你要做的便是为你的 tomcat 后台设置一个账号。

1. 修改 tomcat-user.xml 文件

打开 conf/tomcat-user.xml 文件,在 < tomcat-users >< /tomcat-users > 标签内添加如下内容:


<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>

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

注意:上面 4 个 role 一个都不能少。

2. 修改 context.xml

打开 webapps/manager/META-INF/context.xml 文件,将 < Valve /> 的内容注释:

<Context antiResourceLocking="false" privileged="true" >
  
  
         
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
Context>

注意:如果你没有将其注释的话,那么访问页面就会显示 403,即你没有权限访问网站,因为服务器拒绝了你的地址请求。

3. 再次尝试

将以上两个文件修改好后,便可以在游览器的弹窗输入你设置的账号和密码,确定之后就会出现以下界面:

tomcat8优化策略——全部尝试可用_第2张图片

tomcat 优化

其中的属性可能因为个人表述或者版本出现偏差,所以开头先记录如何查看 conf/server.xml 各标签的各属性。

当进入 tomcat 官网 时,可以看到它的导航栏是在左边的,左边有一个 Documentation 标签,可以选择对应的 tomcat 版本的文档,比如 tomcat8.5。进去之后在它左边导航栏有一个 Reference 标签,其中有查看配置的链接:Configuration。里面就是各种标签的配置了。

AJP 设置

AJP 是什么

AJP(Apache JServer Protocol)是定向包协议。WEB 服务器通过 TCP 连接和 servlet容器连接。为了减少进程生成s ocket 的消耗,WEB 服务器和 servlet 之间尝试保持持久性的 TCP 连接,对多个请求/回复循环重用一个连接。一旦连接分配给一个特定的请求,在请求处理循环结束之前不会在分配。

如果是采用 Nginx + tomcat(进行负载均衡)的结构,那么就用不到 AJP 协议,一般将它禁掉。

注意:在 tomcat 中,默认是关闭 AJP 的,如果要使用将注释去掉就可以了。如下面代码:

 
    

线程池

在tomcat 中,每一个用户请求都是一个线程,所以可以使用线程池提高性能。

修改 conf/server.xml 文件:


    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" prestartminSpareThreads="true"
        maxThreads="500" minSpareThreads="50" maxQueueSize="100"/>
    

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

注意:修改后再次启动 tomcat,会看到最大线程数变为 -1,这种情况是正常的,仅仅是显示如此,但是真实的线程数仍然是你设置的值。

在这里插入图片描述

运行模式

tomcat 有 4 中运行模式

  1. bio:阻塞模式,性能非常低下。
  2. nio:非阻塞模式,比 nio 性能要好。
  3. nio2:tomcat8 中的模式,比 nio 速度更快。
  4. apr:从操作系统级别解决异步 IO 问题,大幅度提高速度,安装起来最困难。

tomcat 默认使用的是 nio。


    <Connector port="8080"  protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               executor="tomcatThreadPool"
               redirectPort="8443" />

在这里插入图片描述

注意:http11 是两个数字 1,不是小写的 l 或者大写的 I。

Connector 配置

对于 Connector 标签来说,可以进行以下优化:

  1. procectol:指定协议,bio,nio,nio2,apr。前面已经说了。
  2. maxThreads:连接器创建处理请求线程的最大数目。
  3. minSpareThreads:线程的最小运行数目。
  4. acceptorCount:最大队列长度。一般与maxThreads相同。
  5. maxConnections:在某的时间内,服务器将接受和处理的最大连接数。
  6. connectionTimeout:当请求已经被接受,但未被处理的超时时间。
  7. maxHTTPHeaderSize:请求和响应的HTTP头的最大大小,以字节为单位。
  8. TCPNoDelay:如果为true,服务器socket会设置TCP_NO_DELAY选项,在大多数情况下可以提高性能,默认为 true。
  9. compression:是否启用gzip压缩,默认为关闭状态。这个参数的可接受值为 off(不使用压缩),on(压缩文本数据),force(在所有的情况下强制压缩)。
  10. compressionMinSize:超过这个值后才被压缩,单位为 byte。
  11. disableUploadTimeout:允许servlet Container在一个servlet执行的时候,使用一个不同的,更长的连接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上传的时候更长的超时时间。如果没有指定,设为false。
  12. enableLookups:关闭DNS反向查询,关闭的话可以提高一定性能。
  13. URIEncoding:URL编码字符集。(看到这里你应该知道为什么你将 URIEncoding 的值指定为 “UTF-8” 控制台还是乱码吧……这跟控制台没关系,实锤的方法是这个:https://blog.csdn.net/super712/article/details/89639583)

有人可能会被 Connector 和 Executor 属性搞蒙,为什么 Connector 有个属性为 acceptorCount,Executor 又有个根据和它差不多的属性 maxQueueSize,其实它们并不是一样的,也不会有覆盖问题。关于 Connector 和 Executor 的关系可以查看阅读这一篇博客:https://blog.csdn.net/u011649691/article/details/79040953

JVM 参数调试

在这里不得不吐槽一下,网上面一些所谓的博客真的是直接复制粘贴,试都不试一下,我参考的这个帖子起码被转了 14 次(怎么得出来的?直接在百度搜索 “PringtGCTomeStamps” ,凡是出现的都是这个内容,真的是要吐了,这个名字是错了的,实际上应该是 PrintGCTimeStamps,我也是醉了……,查了我半个多小时,后面直接查 JVM 命令,突发奇想觉得这个可能是拼错了,要不然查命令都要用老久……)。

直接上参数了,在 bin/startup/sh 的 setlocal 下面一行添加:

set JAVA_OPTS=%JAVA_OPTS% -server -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log

都是一些 JVM 参数,详细内容可参考 JVM 官方文档。

参数效果查看

我用的是 GCView,一个离线的 GC 日志可视化工具。先简单说明一下它的下载吧。

首先从 git 上 clone 它的项目下来,地址是:https://github.com/chewiebug/GCViewer。

然后在它的 pom.xml 文件的 plugins 里加上一个组件:

<plugin>
    <groupId>org.apache.maven.pluginsgroupId>
    <artifactId>maven-surefire-pluginartifactId>
    <configuration>
        <testFailureIgnore>truetestFailureIgnore>
    configuration>
plugin>

接着在它的 pom.xml 文件所在的位置打开 cmd,输入 mvn clean package -DskipTests,基本上就显示打包成功了。

注意:我是进行以上两步才打包成功的,如果你只是添加了组件,但是在命令行里只是简单地输入 mvn clean install,那么可能会打包失败。如果你按我上面的做了,还是打包失败,那我只能建议你去找其它的可视化工具。

双击打开 GCView jar 包,导入 tomcat 创建的 GC 文件,我们可以看到以下(GCView 线条图解:https://blog.csdn.net/chy2z/article/details/88651810):

tomcat8优化策略——全部尝试可用_第3张图片

代码优化

这没啥说的,只要服务运行地够快,bug 就追不上我。。。尽量做到:

  1. 算法优化。
  2. 尽量减少内存使用。
  3. 尽量减少重复或不必要的操作。
  4. 对于线程使用线程池管理,数据库连接用连接池管理。
  5. 明确容器的特性。
  6. 对于 IO 操作要记得关闭。

tomcat 测试

通过 jmeter 对 tomcat 进行测试。具体操作 查看 "1.3、使用Apache JMeter进行测试 "

你可能感兴趣的:(java编程,java,tomcat)