性能調優(yōu)系列前序文章索引:
程序員在轉型架構師的過程中需要建立流程化、結構化、系統(tǒng)化的思維方式,而性能調優(yōu)是非常難得的契機,它既給了我們壓力,也給了我們動力,跨越它就是突破自己的過程。
Y 維度,就是從業(yè)務 HTTP 請求的橫向處理流程來看,HTTP 請求會穿越網(wǎng)絡、計算機、應用容器(Tomcat)、Spring、ORM(Hibernate)、數(shù)據(jù)庫等節(jié)點,在這個流程中每個節(jié)點都有許多可以可優(yōu)化的地方,今天老兵哥先談談如何通過優(yōu)化應用容器(Tomcat)來優(yōu)化系統(tǒng)性能。
2. 應用容器 Tomcat 2.1 啟動參數(shù) 操作系統(tǒng)選型,盡可能選擇 64 位操作系統(tǒng),在 64 位系統(tǒng)上 JVM 內(nèi)存最高可以設置為 3800MB 左右,在 32 位系統(tǒng)上 JVM 內(nèi)存最高可以設置為 1500MB 左右。另外,我們可以根據(jù)系統(tǒng)物理內(nèi)存大小合理設置下列五個啟動參數(shù)(在文件 catalina.sh、catalina.bat 中): -server -Xms300m -Xmx300m -XX:PermSize=100m -XX:MaxPermSize=100m 通常,參數(shù)取值符合規(guī)則:-Xms=-Xmx,-XX:PermSize=-XX:MaxPermSize。上述參數(shù)經(jīng)過驗證,可以穩(wěn)定運行在各種操作系統(tǒng)平臺和 JDK 版本上,通過調參盡可能地壓榨服務器性能。具體場景下的參數(shù)取值需要具體分析,基本原則就是不要超過空閑物理內(nèi)存的 80% 即可。如果沒有特殊理由,不要設置上述五個參數(shù)之外的 JVM 參數(shù),一者無法保證操作系統(tǒng)平臺的可移植性,二者過度干涉內(nèi)存管理會導致無法預料的后果。 非服務方式啟動的 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 兩者區(qū)別:Linux/Unix 不需要 set,但有”“;Windows 需要set,但不能有”“。服務方式啟動的 TOMCAT 調參方式如下,僅限于 Windows 系統(tǒng):
-XX:PermSize=256m -XX:MaxPermSize=256m -Dcom.sun.management.jmxremote
Java 的 IO 操作集中在 java.io 這個包當中,基于阻塞 API(即 BIO,Block IO)。對許多應用來說,這樣的 API 使用很方便,但某些對性能要求較高的應用,尤其是服務器端應用,往往需要一個更高效的方式來處理 IO。從 JDK1.4 起,NIO API 作為一個基于緩沖區(qū),并能提供非阻塞 IO 操作的 API(即 NIO,non-blocking IO)被引入。BIO 與 NIO 之間最為重要的不同,就是采用 BIO 往往要引入多線程,每個連接分配一個單獨的線程;NIO 是使用單線程或者只使用少量線程,所有連接共用一個線程。具體更改方法如下:
2.3 調整線程數(shù) Tomcat 可以采用線程池來提升響應速度,默認創(chuàng)建 5 個線程,最大線程數(shù)是 200。如果業(yè)務并發(fā)量較大,則可以對下列幾個參數(shù)做些調整,最大線程數(shù)可以用“同時在線人數(shù) * 用戶每秒操作次數(shù) * 平均操作時間”公式計算:
2.4 使用 APR 來增強性能 Tomcat 可以采用 APR(Apache Portable Runtime)提供超強的可伸縮性和性能,更好地集成本地服務器技術。APR 是一個高可移植庫,它是 Apache HTTP Server 2.x 的核心。APR 有很多用途,包括訪問高級 IO 功能(例如:sendfile、epoll、open SSL 等)、OS 級別的功能(隨機數(shù)生成、系統(tǒng)狀態(tài)等)、本地進程管理(共享內(nèi)存、NT 管道、UNIX socket 等),這些功能使 Tomcat 作為 WEB 應用服務器,能更好地與其它本地 Web 技術集成,讓 Tomcat 也可以擔當更高性能的前端 Web 應用服務器,而不是僅僅是后端 Java EE 應用服務器。APR 的具體安裝步驟如下(下載地址:http://apr.):
> 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 重新啟動計算機或使用命令 source /etc/profile 使其即時生效。 啟動時發(fā)現(xiàn)日志中有: 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 停止時發(fā)現(xiàn)日志中有: 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 2.5 集成Web服務器處理靜態(tài)內(nèi)容 作為一個 Jsp/Servlet 容器,Tomcat 本身對靜態(tài) HTML 文件的處理速度要遠遜于 Apache 等 Web 服務器。通過與此類 Web 服務器集成,Tomcat 僅僅處理動態(tài)資源請求,靜態(tài)資源請求則交給 Web 服務器處理,這樣可以顯著地降低系統(tǒng)負載,從而提高整體響應的速度。 |
|