写点什么

【高并发】高并发环境下如何优化 Tomcat 性能?看完我懂了!

作者:冰河
  • 2022 年 6 月 03 日
  • 本文字数:1913 字

    阅读完需:约 6 分钟

大家好,我是冰河~~


Tomcat 作为最常用的 Java Web 服务器,随着并发量越来越高,Tomcat 的性能会急剧下降,那有没有什么方法来优化 Tomcat 在高并发环境下的性能呢?

Tomcat 运行模式

Tomcat 的运行模式有 3 种。


1.bio 模式


默认的模式,性能非常低下,没有经过任何优化处理和支持。


2.nio 模式


利用 java 的异步 io 护理技术,noblocking IO 技术。要想运行在该模式下,则直接修改 server.xml 里的 Connector 节点,修改 protocol 为如下配置。


protocol="org.apache.coyote.http11.Http11NioProtocol"
复制代码


重启 Tomcat 后,就可以生效。


3.apr 模式


安装起来最困难,但是从操作系统级别来解决异步的 IO 问题,大幅度的提高性能。此种模式下,必须要安装 apr 和 native,直接启动就支持 apr。如 nio 修改模式,修改 protocol 为 org.apache.coyote.http11.Http11AprProtocol,如下所示。


protocol="org.apache.coyote.http11.Http11AprProtocol"
复制代码

Tomcat 并发优化

安装 APR

[root@binghe ~]# yum -y install apr apr-devel openssl-devel[root@binghe ~]# tar zxvf tomcat-native.tar.gz[root@binghe ~]# cd tomcat-native-1.1.24-src/jni/native[root@binghe native]# ./configure --with-apr=/usr/bin/apr-1-config --with-ssl=/usr/include/openssl/[root@binghe native]# make && make install
复制代码


安装完成之后 会出现如下提示信息


Libraries have been installed in:/usr/local/apr/lib
复制代码


安装成功后还需要对 tomcat 设置环境变量,方法是在 catalina.sh 文件中增加 1 行:


在这段代码下面添加:


============# OS specific support.  $var _must_ be set to either true or false.cygwin=falsedarwin=false==============CATALINA_OPTS=”-Djava.library.path=/usr/local/apr/lib”
复制代码


修改 server.xml 的配置,如下所示。


protocol=”org.apache.coyote.http11.Http11AprProtocol”
复制代码


启动 tomcat 之后,查看日志,如下所示。


more TOMCAT_HOME/logs/catalina.out2020-04-17 22:34:56 org.apache.catalina.core.AprLifecycleListener initINFO: Loaded APR based Apache Tomcat Native library 1.1.31 using APR version 1.3.9.2020-04-17 22:34:56 org.apache.catalina.core.AprLifecycleListener initINFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].2020-04-17 22:34:56 org.apache.catalina.core.AprLifecycleListener initializeSSLINFO: OpenSSL successfully initialized (OpenSSL 1.0.1e 11 Feb 2013)2020-04-17 22:34:58 AM org.apache.coyote.AbstractProtocol initINFO: Initializing ProtocolHandler [“http-apr-8080”]2020-04-17 22:34:58 AM org.apache.coyote.AbstractProtocol initINFO: Initializing ProtocolHandler [“ajp-apr-8009”]2020-04-17 22:34:58 AM org.apache.catalina.startup.Catalina loadINFO: Initialization processed in 1125 ms
复制代码

Tomcat 优化

1.JVM 调优


在 TOMCAT_HOME/bin/catalina.sh 增加如下语句,具体数值视情况而定。添加到上面 CATALINA_OPTS 的后面即可,如下所示。


JAVA_OPTS=-Xms512m -Xmx1024m -XX:PermSize=512M -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m
复制代码


参数详解


  • -Xms:JVM 初始化堆内存大小。

  • -Xmx:JVM 堆的最大内存。

  • -Xss:线程栈大小。

  • -XX:PermSize:JVM 非堆区初始内存分配大小。

  • -XX:MaxPermSize:JVM 非堆区最大内存。


建议和注意事项:


-Xms 和-Xmx 选项设置为相同堆内存分配,以避免在每次 GC 后调整堆的大小,堆内存建议占内存的 60%~80%;非堆内存是不可回收内存,大小视项目而定;线程栈大小推荐 256k。


32G 内存配置如下:


JAVA_OPTS=-Xms20480m -Xmx20480m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048m
复制代码


2.关闭 DNS 反向查询


在<Connector port=”8080″ 中加入如下参数。


enableLookups=”false”
复制代码


3.优化 tomcat 参数


在 server.xml 文件中进行如下配置。


<Connector port=”8080″protocol=”org.apache.coyote.http11.Http11AprProtocol”connectionTimeout=”20000″ //链接超时时长redirectPort=”8443″maxThreads=”500″//设定处理客户请求的线程的最大数目,决定了服务器可以同时响应客户请求的数,默认200minSpareThreads=”20″//初始化线程数,最小空闲线程数,默认为10acceptCount=”1000″ //当所有可以使用的处理请求的线程数都被使用时,可以被放到处理队列中请求数,请求数超过这个数的请求将不予处理,默认100enableLookups=”false”URIEncoding=”UTF-8″ />
复制代码

写在最后

如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发编程技术。


最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。



发布于: 刚刚阅读数: 3
用户头像

冰河

关注

公众号:冰河技术,专注写硬核技术专栏。 2020.05.29 加入

互联网资深技术专家,《深入理解分布式事务:原理与实战》,《海量数据处理与大数据技术实战》和《MySQL技术大全:开发、优化与运维实战》作者,mykit-data与mykit-transaction-message框架作者。【冰河技术】作者。

评论

发布
暂无评论
【高并发】高并发环境下如何优化Tomcat性能?看完我懂了!_并发编程_冰河_InfoQ写作社区