程式員必須練就的「性能調優」組合拳【2】

来源:https://www.cnblogs.com/itlaobingge/archive/2020/01/19/12212942.html
-Advertisement-
Play Games

程式員在轉型架構師的過程中需要建立流程化、結構化、系統化的思維方式,而性能調優是非常難得的契機,它既給了我們壓力,也給了我們動力,跨越它就是突破自己的過程。Y 維度,就是從業務 HTTP 請求的橫向處理流程來看,HTTP 請求會穿越網路、電腦、應用容器(Tomcat)、Spring、ORM(Hib... ...


性能調優系列前序文章索引:

  • 程式員必須掌握的性能調優:老兵哥結合個人經歷解釋了程式員往架構師方向發展時為什麼要跨越性能調優這一關,以及介紹了從 X、Y、Z 三個維度優化性能的思路。
  • 從  X  維度優化系統的性能:老兵哥分享了從 X 維度優化系統性能的思路,包括讓客戶端分計算存儲任務、優化交互設計等,主要是作為引子拓寬我們性能調優的思路。

程式員在轉型架構師的過程中需要建立流程化、結構化、系統化的思維方式,而性能調優是非常難得的契機,它既給了我們壓力,也給了我們動力,跨越它就是突破自己的過程。

  • X 維度,即業務維度,技術始終是服務業務的,任何技術問題的原點就是業務需求。在啟動技術層面的性能優化之前,我們有必要先審視一下業務流程是否合理,交互設計上有沒有可以優化的空間等。
  • Y 維度,待業務維度優化完畢,接下來就是審視技術在實現當前業務流程或交互設計的全鏈路上有沒有可優化的地方,即 HTTP 請求處理全流程,從瀏覽器到應用容器,再到 Spring、Hibernate、資料庫等。
  • Z 維度,除了沿著 HTTP 請求的橫向鏈路,我們還要審視支持應用系統的縱向技術棧,從上到下包括 JVM、操作系統和硬體等,這是整套應用系統運行的環境,許多性能問題都跟運行環境存在關係。

Y 維度,就是從業務 HTTP 請求的橫向處理流程來看,HTTP 請求會穿越網路、電腦、應用容器(Tomcat)、Spring、ORM(Hibernate)、資料庫等節點,在這個流程中每個節點都有許多可以可優化的地方,今天老兵哥先談談如何通過優化應用容器(Tomcat)來優化系統性能。

建議在閱讀本文內容前,先參考下麵這個系列的文章瞭解 Web 應用是怎樣處理 HTTP 請求的:

 

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老兵哥 」,賦能程式人生!堅持原創不易,請小伙伴們不吝點個「 」哦!推薦軟技能文章,請點擊鏈接:程式員,怎樣打造個人影響力?

 

 

近期熱評系列《 程式員必須懂的架構師入門課 》:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 起步 下載模板: 初始化項目: 將 文件內容替換如下: 安裝模板依賴的樣式文件: 在 文件中導入樣式文件: 看到如下頁面說明成功。 ...
  • todolist小案例 "該案例的模板文件下載地址" 走外國伺服器, ̄□ ̄|| app.module.ts 核心組件app.component.ts 發現這倆不是同一類文件,哈哈哈,٩(๑ ◡ !t.done) } else if (this.visibility === 'completed') ...
  • Node.js簡介 Node.js是一個能夠在伺服器端運行JavaScript的開源代碼、跨平臺JavaScript運行環境 Node採用Google開發的V8引擎運行js代碼,使用事件驅動、非阻塞和非同步I/O模型等技術來提高性能,可優化應用程式的傳輸量和規模 Node大部分基本模塊都用JavaSp ...
  • 前言 最近在學習研究 Nest 框架,但是在學習過程中除了參考翻閱官方文檔外國內幾乎沒有多少資料能系統的講解 Nest 的相關內容,所以打算想通過我自己學習的角度講解下 Nest 框架,不知道能堅持多久,也可能有錯誤或遺漏的地方,歡迎大家批評指正。 下麵我學習 Nest 的主要信息來源,在編寫過程中 ...
  • 7)onloadonload就是等頁面載入完後才執行。例 3.7.1<HEAD> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <SCRIPT LANGUAGE="JavaScript"> <!-- func ...
  • Vue開發環境跨域訪問其他伺服器或者本機其他埠,需要配置項目中config/index.js文件,修改如下 module.exports = { dev: { // Paths assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTa ...
  • 程式員在轉型架構師的過程中需要建立流程化、結構化、系統化的思維方式,而性能調優是非常難得的契機,它既給了我們壓力,也給了我們動力,跨越它就是突破自己的過程。Y 維度,就是從業務 HTTP 請求的橫向處理流程來看,HTTP 請求會穿越網路、電腦、應用容器(Tomcat)、Spring、ORM(Hib... ...
  • Y 維度就是從業務 HTTP 請求的橫向處理流程來看,HTTP 請求會穿越網路、電腦、應用容器(Tomcat)、Spring、ORM(Hibernate)、資料庫等節點,在這個流程中每個節點都有許多可以可優化的地方,今天老兵哥將介紹通過優化開發框架 Spring 來優化系統性能的方法。 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...