效能調優,程式設計師轉型架構師的攔路虎【2】
效能調優系列前序文章索引:
- 程式設計師必須掌握的效能調優:老兵哥結合個人經歷解釋了程式設計師往架構師方向發展時為什麼要跨越效能調優這一關,以及介紹了從 X、Y、Z 三個維度優化效能的思路。
- 從 X 維度優化系統的效能:老兵哥分享了從 X 維度優化系統性能的思路,包括讓客戶端分計算儲存任務、優化互動設計等,主要是作為引子拓寬我們效能調優的思路。
程式設計師在轉型架構師的過程中需要建立流程化、結構化、系統化的思維方式,而效能調優是非常難得的契機,它既給了我們壓力,也給了我們動力,跨越它就是突破自己的過程。
- X 維度,即業務維度,技術始終是服務業務的,任何技術問題的原點就是業務需求。在啟動技術層面的效能優化之前,我們有必要先審視一下業務流程是否合理,互動設計上有沒有可以優化的空間等。
- Y 維度,待業務維度優化完畢,接下來就是審視技術在實現當前業務流程或互動設計的全鏈路上有沒有可優化的地方,即 HTTP 請求處理全流程,從瀏覽器到應用容器,再到 Spring、Hibernate、資料庫等。
- Z 維度,除了沿著 HTTP 請求的橫向鏈路,我們還要審視支援應用系統的縱向技術棧,從上到下包括 JVM、作業系統和硬體等,這是整套應用系統執行的環境,許多效能問題都跟執行環境存在關係。
Y 維度,就是從業務 HTTP 請求的橫向處理流程來看,HTTP 請求會穿越網路、計算機、應用容器(Tomcat)、Spring、ORM(Hibernate)、資料庫等節點,在這個流程中每個節點都有許多可以可優化的地方,今天老兵哥先談談如何通過優化應用容器(Tomcat)來優化系統性能。
建議在閱讀本文內容前,先參考下面這個系列的文章瞭解 Web 應用是怎樣處理 HTTP 請求的:
- 圖解 Spring:HTTP 請求的處理流程與機制【1】
- 圖解 Spring:HTTP 請求的處理流程與機制【2】
- 圖解 Spring:HTTP 請求的處理流程與機制【3】
- 圖解 Spring:HTTP 請求的處理流程與機制【4】
- 圖解 Spring:HTTP 請求的處理流程與機制【5】
2. 應用容器 Tomcat
2.1 啟動引數
作業系統選型,儘可能選擇 64 位作業系統,在 64 位系統上 JVM 記憶體最高可以設定為 3800MB 左右,在 32 位系統上 JVM 記憶體最高可以設定為 1500MB 左右。另外,我們可以根據系統實體記憶體大小合理設定下列五個啟動引數(在檔案 catalina.sh、catalina.bat 中):
-server -Xms300m -Xmx300m -XX:PermSize=100m -XX:MaxPermSize=100m
通常,引數取值符合規則:-Xms=-Xmx,-XX:PermSize=-XX:MaxPermSize。上述引數經過驗證,可以穩定執行在各種作業系統平臺和 JDK 版本上,通過調參儘可能地壓榨伺服器效能。具體場景下的引數取值需要具體分析,基本原則就是不要超過空閒實體記憶體的 80% 即可。如果沒有特殊理由,不要設定上述五個引數之外的 JVM 引數,一者無法保證作業系統平臺的可移植性,二者過度干涉記憶體管理會導致無法預料的後果。
非服務方式啟動的 TOMCAT 調參方式如下:
- 在 Linux/Unix 系統上,修改 tomcat_home/bin/catalina.sh,新增以下內容:
JAVA_HOME=/export/home/jdk1.6.0_16 JAVA_OPTS="-server -Xms300m -Xmx300m -XX:PermSize=100m -XX:MaxPermSize=100m -Dcom.sun.management.jmxremote"
- 在 Windows 系統上,修改 tomcat_home/bin/catalina.bat,新增以下內容:
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,但不能有”“。服務方式啟動的 TOMCAT 調參方式如下,僅限於 Windows 系統:
- 在 JAVA 選項卡中,設定 JAVA OPTIONS,新增以下三個引數,每行一個,不能並列:
-XX:PermSize=256m -XX:MaxPermSize=256m -Dcom.sun.management.jmxremote
- 設定 Initial memory pool 為 1000MB。
- 設定 Maximum menory pool 為 1000MB。
- 不要設定 thread stack size。
2.2 使用 NIO 的 http1.1 超文字傳輸協議
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 的配置檔案:$TOMCAT_HOME/conf/server.xml
- 找到:<Connector port="8080" protocol="http1.1" ...
- 改為:<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"...
2.3 調整執行緒數
Tomcat 可以採用執行緒池來提升響應速度,預設建立 5 個執行緒,最大執行緒數是 200。如果業務併發量較大,則可以對下列幾個引數做些調整,最大執行緒數可以用“同時線上人數 * 使用者每秒操作次數 * 平均操作時間”公式計算:
- maxThreads:Tomcat 可建立的最大執行緒數。
- acceptCount:如果當前可用執行緒數為 0,則將請求放入處理佇列中。這個值限定了請求佇列的大小,超過這個數值的請求將不予處理。
- connectionTimeout:網路連線超時時間,單位毫秒。
- minSpareThreads:如果當前沒有空閒執行緒,且沒有超過 maxThreads,一次性建立的空閒執行緒數量。Tomcat 初始化時建立的執行緒數量也由此值設定。
- maxSpareThreads:一旦建立的執行緒超過此數值,Tomcat會關閉不再需要的執行緒。
2.4 使用 APR 來增強效能
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):
- 安裝 apr 及 apr-util:
> 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
- 安裝 tomcat-native.tar.gz,此檔案在目錄 $TOMCAT_HOME/bin 下:
> tar zxvf tomcat-native.tar.gz > cd tomcat-native-1.1.16-src/jni/native > ./configure —with-apr=/usr/lib/apr > make > make install
- 在 Tomcat 的啟動檔案($TOMCAt_HOME/bin/catalina.sh)中加入環境變數:
CATALINA_OPTS=-Djava.library.path=/usr/local/apr/lib
- 或在作業系統的環境變數(/etc/profile)中新增:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
重新啟動計算機或使用命令 source /etc/profile 使其即時生效。
檢視啟動日誌($TOMCAT_HOME/logs/catalina…….log),如出現如下資訊表示APR啟動成功:
啟動時發現日誌中有: 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
2.5 整合Web伺服器處理靜態內容
作為一個 Jsp/Servlet 容器,Tomcat 本身對靜態 HTML 檔案的處理速度要遠遜於 Apache 等 Web 伺服器。通過與此類 Web 伺服器整合,Tomcat 僅僅處理動態資源請求,靜態資源請求則交給 Web 伺服器處理,這樣可以顯著地降低系統負載,從而提高整體響應的速度。
關注「 IT老兵哥 」,賦能程式人生!堅持原創不易,請小夥伴們不吝點個「 贊 」哦!推薦軟技能文章,請點選連結:程式設計師,怎樣打造個人影響力?
近期熱評系列《 程式設計師必須懂的架構師入門課 》:
- 架構到底是什麼,你知道嗎? (閱讀人數:1176)
- 架構都有哪些,我該怎麼選? (閱讀人數:877)
- 架構師都幹什麼,你知道嗎? (閱讀人數:1163)
- 練就哪些技能才勝任架構師? (閱讀人數:1127)
- 怎樣才能搞定上下游的客戶? (閱讀人數:483)
- 如何從開發崗轉型做架構師? (閱讀人數:1270)
- 程式設計師必須懂的架構入門課 (閱讀人數:592)