性能调优系列前序文章索引:html
程序员在转型架构师的过程当中须要创建流程化、结构化、系统化的思惟方式,而性能调优是很是可贵的契机,它既给了咱们压力,也给了咱们动力,跨越它就是突破本身的过程。Y 维度,就是从业务 HTTP 请求的横向处理流程来看,HTTP 请求会穿越网络、计算机、应用容器(Tomcat)、Spring、ORM(Hibernate)、数据库等节点,在这个流程中每一个节点都有许多能够可优化的地方,今天老兵哥先谈谈如何经过优化应用容器(Tomcat)来优化系统性能。
建议在阅读本文内容前,先参考下面这个系列的文章了解 Web 应用是怎样处理 HTTP 请求的:前端
操做系统选型,尽量选择 64 位操做系统,在 64 位系统上 JVM 内存最高能够设置为 3800MB 左右,在 32 位系统上 JVM 内存最高能够设置为 1500MB 左右。另外,咱们能够根据系统物理内存大小合理设置下列五个启动参数(在文件 catalina.sh、catalina.bat 中):java
-server -Xms300m -Xmx300m -XX:PermSize=100m -XX:MaxPermSize=100m
一般,参数取值符合规则:-Xms=-Xmx,-XX:PermSize=-XX:MaxPermSize。上述参数通过验证,能够稳定运行在各类操做系统平台和 JDK 版本上,经过调参尽量地压榨服务器性能。具体场景下的参数取值须要具体分析,基本原则就是不要超过空闲物理内存的 80% 便可。若是没有特殊理由,不要设置上述五个参数以外的 JVM 参数,一者没法保证操做系统平台的可移植性,两者过分干涉内存管理会致使没法预料的后果。程序员
非服务方式启动的 TOMCAT 调参方式以下:数据库
JAVA_HOME=/export/home/jdk1.6.0_16 JAVA_OPTS="-server -Xms300m -Xmx300m -XX:PermSize=100m -XX:MaxPermSize=100m -Dcom.sun.management.jmxremote“
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_16 set JAVA_OPTS=-server -Xms300m -Xmx300m -XX:PermSize=100m -XX:MaxPermSize=100m -Dcom.sun.management.jmxremote
二者区别:Linux/Unix 不须要 set,但有”“;Windows 须要set,但不能有”“。apache
服务方式启动的 TOMCAT 调参方式以下,仅限于 Windows 系统:segmentfault
-XX:PermSize=256m -XX:MaxPermSize=256m -Dcom.sun.management.jmxremote
Java 的 IO 操做集中在 java.io 这个包当中,基于阻塞 API(即 BIO,Block IO)。对许多应用来讲,这样的 API 使用很方便,但某些对性能要求较高的应用,尤为是服务器端应用,每每须要一个更高效的方式来处理 IO。从 JDK1.4 起,NIO API 做为一个基于缓冲区,并能提供非阻塞 IO 操做的 API(即 NIO,non-blocking IO)被引入。BIO 与 NIO 之间最为重要的不一样,就是采用 BIO 每每要引入多线程,每一个链接分配一个单独的线程;NIO 是使用单线程或者只使用少许线程,全部链接共用一个线程。具体更改方法以下:后端
Tomcat 能够采用线程池来提高响应速度,默认建立 5 个线程,最大线程数是 200。若是业务并发量较大,则能够对下列几个参数作些调整,最大线程数能够用“同时在线人数 用户每秒操做次数 平均操做时间”公式计算:tomcat
Tomcat 能够采用 APR(Apache Portable Runtime)提供超强的可伸缩性和性能,更好地集成本地服务器技术。APR 是一个高可移植库,它是 Apache HTTP Server 2.x 的核心。APR 有不少用途,包括访问高级 IO 功能(例如:sendfile、epoll、open SSL 等)、OS 级别的功能(随机数生成、系统状态等)、本地进程管理(共享内存、NT 管道、UNIX socket 等),这些功能使 Tomcat 做为 WEB 应用服务器,能更好地与其它本地 Web 技术集成,让 Tomcat 也能够担当更高性能的前端 Web 应用服务器,而不是仅仅是后端 Java EE 应用服务器。APR 的具体安装步骤以下(下载地址:http://apr.apache.org):服务器
> tar zxvf apr-1.3.8.tar.gz > cd apr-1.3.8 > ./configure —prefix=/usr/lib/apr > make > make install > tar zxvf apr-util-1.3.9.tar.gz > cd apr-util-1.3.9 > ./configure —with-apr=/usr/lib/apr > make > make install
> tar zxvf tomcat-native.tar.gz > cd tomcat-native-1.1.16-src/jni/native > ./configure —with-apr=/usr/lib/apr > make > make install
CATALINA_OPTS=-Djava.library.path=/usr/local/apr/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
启动时发现日志中有: Sep 30, 2019 4:32:55 PM org.apache.coyote.http11.Http11AprProtocol start INFO: Starting Coyote HTTP/1.1 on http-8080 Sep 30, 2019 4:32:55 PM org.apache.coyote.ajp.AjpAprProtocol start INFO: Starting Coyote AJP/1.3 on ajp-8009
中止时发现日志中有: Sep 30, 2019 4:27:06 PM org.apache.coyote.http11.Http11AprProtocol destroy INFO: Stopping Coyote HTTP/1.1 on http-8080 Sep 30, 2019 4:27:06 PM org.apache.coyote.ajp.AjpAprProtocol destroy INFO: Stopping Coyote AJP/1.3 on ajp-8009
做为一个 Jsp/Servlet 容器,Tomcat 自己对静态 HTML 文件的处理速度要远逊于 Apache 等 Web 服务器。经过与此类 Web 服务器集成,Tomcat 仅仅处理动态资源请求,静态资源请求则交给 Web 服务器处理,这样能够显著地下降系统负载,从而提升总体响应的速度。
关注「 IT老兵哥 」,赋能程序人生!近期热评系列《 程序员必须懂的架构师入门课 》: