1. 程式人生 > >優化tomcat配置(從記憶體、併發、快取4個方面)

優化tomcat配置(從記憶體、併發、快取4個方面)

Tomcat在各位JavaWeb從業者常常就是預設的開發環境,但是Tomcat的預設配置作為生產環境,尤其是記憶體和執行緒的配置,預設都很低,容易成為效能瓶頸.

幸好Tomcat還有很多的提升空間.下文介紹一下Tomcat優化,可以分為記憶體,執行緒,IO.

一:Tomcat記憶體優化,啟動時告訴JVM我要一塊大記憶體(調優記憶體是最直接的方式)

Windows 下的catalina.bat

Linux 下的catalina.sh 如:

JAVA_OPTS='-Xms256m -Xmx512m'

-Xms<size> JVM初始化堆的大小

-Xmx<size> JVM堆的最大值 實際引數大小根據伺服器配置或者專案具體設定.

二:Tomcat 執行緒優化 在server.xml中 如:

<Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700"
connectionTimeout="20000"  />

maxThreads="X" 表示最多同時處理X個連線

minSpareThreads="X" 初始化X個連線

maxSpareThreads="X" 表示如果最多可以有X個執行緒,一旦超過X個,則會關閉不在需要的執行緒

acceptCount="X" 當同時連線的人數達到maxThreads時,還可以排隊,佇列大小為X.超過X就不處理

三:Tomcat IO優化

1:同步阻塞IO(JAVA BIO) 同步並阻塞,伺服器實現模式為一個連線一個執行緒(one connection one thread 想想都覺得恐怖,執行緒可是非常寶貴的資源),當然可以通過執行緒池機制改善.

2:JAVA NIO:又分為同步非阻塞IO,非同步阻塞IO 與BIO最大的區別one request one thread.可以複用同一個執行緒處理多個connection(多路複用).

3:,非同步非阻塞IO(Java NIO2又叫AIO) 主要與NIO的區別主要是作業系統的底層區別.可以做個比喻:比作快遞,NIO就是網購後要自己到官網查下快遞是否已經到了(可能是多次),然後自己去取快遞;AIO就是快遞員送貨上門了(不用關注快遞進度)。

BIO方式適用於連線數目比較小且固定的架構,這種方式對伺服器資源要求比較高,併發侷限於應用中,JDK1.4以前的唯一選擇,但程式直觀簡單易理解.

NIO方式適用於連線數目多且連線比較短(輕操作)的架構,比如聊天伺服器,併發侷限於應用中,程式設計比較複雜,JDK1.4開始支援.

AIO方式使用於連線數目多且連線比較長(重操作)的架構,比如相簿伺服器,充分呼叫OS參與併發操作,程式設計比較複雜,JDK7開始支援.

在server.xml中

<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" 
    connectionTimeout="20000" 
    URIEncoding="UTF-8" 
    useBodyEncodingForURI="true" 
    enableLookups="false" 
    redirectPort="8443" />

實現對Tomcat的IO切換.

四:大殺器APR

APR是從作業系統級別來解決非同步的IO問題,大幅度的提高效能. (http://apr.apache.org/).

APR(Apache Portable Runtime)是一個高可移植庫,它是Apache HTTP Server 2.x的核心.能更好地和其它本地web技術整合,總體上讓Java更有效率作為一個高效能web伺服器平臺而不是簡單作為後臺容器.

在產品環境中,特別是直接使用Tomcat做WEB伺服器的時候,應該使用Tomcat Native來提高其效能.如果不配APR,基本上300個執行緒狠快就會用滿,以後的請求就只好等待.但是配上APR之後,併發的執行緒數量明顯下降,從原來的300可能會馬上下降到只有幾十,新的請求會毫無阻塞的進來.

在區域網環境測,就算是400個併發,也是一瞬間就處理/傳輸完畢,但是在真實的Internet環境下,頁面處理時間只佔0.1%都不到,絕大部分時間都用來頁面傳輸.如果不用APR,一個執行緒同一時間只能處理一個使用者,勢必會造成阻塞。所以生產環境下用apr是非常必要的.

安裝Apache Tomcat Native Library,直接啟動就支援apr(http://tomcat.apache.org/native-doc/)它本身是基於APR的. 具體安裝方法可以參考其他部落格和文章. 排除程式碼問題Tomcat優化到這個層次,可以應對大部分效能需求.

Tomcat有很多方面,我從記憶體、併發、快取四個方面介紹優化方法。 
  **

一.Tomcat記憶體優化

**

  Tomcat記憶體優化主要是對 tomcat 啟動引數優化,我們可以在 tomcat 的啟動指令碼 catalina.sh 中設定 java_OPTS 引數。 
  JAVA_OPTS引數說明 
  -server 啟用jdk 的 server 版; 
  -Xms Java虛擬機器初始化時的最小記憶體; 
  -Xmx java虛擬機器可使用的最大記憶體; 
  -XX: PermSize 記憶體永久保留區域 
  -XX:MaxPermSize 記憶體最大永久保留區域 
  伺服器引數配置

  現公司伺服器記憶體一般都可以加到最大2G ,所以可以採取以下配置:

  JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’

  配置完成後可重啟Tomcat ,通過以下命令進行檢視配置是否生效: 
  首先檢視Tomcat 程序號:

  sudo lsof -i:9027

  我們可以看到Tomcat 程序號是 12222 。 
  檢視是否配置生效:

  sudo jmap – heap 12222

  我們可以看到MaxHeapSize 等引數已經生效。

  **

二.Tomcat併發優化

**

  1.Tomcat連線相關引數

  在Tomcat 配置檔案 server.xml 中的

  <Connector port="9027"
  protocol="HTTP/1.1"
  maxHttpHeaderSize="8192"
  minProcessors="100"
  maxProcessors="1000"
  acceptCount="1000"
  redirectPort="8443"
  disableUploadTimeout="true"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  2.調整聯結器connector的併發處理能力

  1>引數說明

  maxThreads 客戶請求最大執行緒數 
  minSpareThreads Tomcat初始化時建立的 socket 執行緒數 
  maxSpareThreads Tomcat聯結器的最大空閒 socket 執行緒數 
  enableLookups 若設為true, 則支援域名解析,可把 ip 地址解析為主機名 
  redirectPort 在需要基於安全通道的場合,把客戶請求轉發到基於SSL 的 redirectPort 埠 
  acceptAccount 監聽埠佇列最大數,滿了之後客戶請求會被拒絕(不能小於maxSpareThreads ) 
  connectionTimeout 連線超時 
  minProcessors 伺服器建立時的最小處理執行緒數 
  maxProcessors 伺服器同時最大處理執行緒數 
  URIEncoding URL統一編碼

  2>Tomcat中的配置示例

  <Connector port="9027"
  protocol="HTTP/1.1"
  maxHttpHeaderSize="8192"
  maxThreads="1000"
  minSpareThreads="100"
  maxSpareThreads="1000"
  minProcessors="100"
  maxProcessors="1000"
  enableLookups="false"
  URIEncoding="utf-8"
  acceptCount="1000"
  redirectPort="8443"
  disableUploadTimeout="true"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

  3.Tomcat快取優化

  1>引數說明

  c ompression 開啟壓縮功能 
  compressionMinSize 啟用壓縮的輸出內容大小,這裡面預設為2KB 
  compressableMimeType 壓縮型別 
  connectionTimeout 定義建立客戶連線超時的時間. 如果為 -1, 表示不限制建立客戶連線的時間

  2>Tomcat中的配置示例

  <Connector port="9027"
  protocol="HTTP/1.1"
  maxHttpHeaderSize="8192"
  maxThreads="1000"
  minSpareThreads="100"
  maxSpareThreads="1000"
  minProcessors="100"
  maxProcessors="1000"
  enableLookups="false"
  compression="on"
  compressionMinSize="2048"
  compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
  connectionTimeout="20000"
  URIEncoding="utf-8"
  acceptCount="1000"
  redirectPort="8443"
  disableUploadTimeout="true"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

  4.參考配置

  1>舊有的配置

  參考網路對伺服器做過如下配置,拿出來分享下:

  <Connector port="9027"
  protocol="HTTP/1.1"
  maxHttpHeaderSize="8192"
  maxThreads="1000"
  minSpareThreads="25"
  maxSpareThreads="75"
  enableLookups="false"
  compression="on"
  compressionMinSize="2048"
  compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
  connectionTimeout="20000"
  URIEncoding="utf-8"
  acceptCount="200"
  redirectPort="8443"
  disableUploadTimeout="true" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

  後來發現在訪問量達到3 百萬多的時候出現效能瓶頸。 
  2>更改後的配置

  <Connector port="9027"
  protocol="HTTP/1.1"
  maxHttpHeaderSize="8192"
  maxThreads="1000"
  minSpareThreads="100"
  maxSpareThreads="1000"
  minProcessors="100"
  maxProcessors="1000"
  enableLookups="false"
  compression="on"
  compressionMinSize="2048"
  compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
  connectionTimeout="20000"
  URIEncoding="utf-8"
  acceptCount="1000"
  redirectPort="8443"
  disableUploadTimeout="true"/>

 Tomcat是我們經常使用的 servlet容器之一,甚至很多線上產品都使用 Tomcat充當伺服器。而且優化後的Tomcat效能提升顯著,本文從以下幾方面進行分析優化。

        一、記憶體優化

        預設情況下Tomcat的相關記憶體配置較低,這對於一些大型專案顯然是不夠用的,這些專案執行就已經耗費了大部分記憶體空間,何況大規模訪問的情況。即使是本文中的這個只有一個頁面的超小專案,在併發達到一定程度後也會丟擲以下類似異常:

Java程式碼  收藏程式碼
  1. 嚴重: Exception invoking periodic operation: java.lang.OutOfMemoryError: Java heap space  
  2. 嚴重: Error processing request java.lang.OutOfMemoryError: GC overhead limit exceeded  
        說明Tomcat已經無力支援訪問處理,內部GC也已經“無能無力”。所以一般情況下我們需要重新配置Tomcat的相關記憶體大小。

        1.修改記憶體等 JVM相關配置

        Linux下修改TOMCAT_HOME/bin/catalina.sh,在其中加入,可以放在CLASSPATH=下面:

Java程式碼  收藏程式碼
  1. JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"  

        windows下修改TOMCAT_HOME/bin/catalina.bat,在其中加入,可以放在set CLASSPATH=下面:

Java程式碼  收藏程式碼
  1. set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m  
        這些引數在我們學習JVM部分文章時已經都認識過了,不過這裡還是簡單介紹下:

        -server:啟用 JDK的 server 版本;

        -Xms:Java虛擬機器初始化時堆的最小記憶體,一般與 Xmx配置為相同值,這樣的好處是GC不必再為擴充套件記憶體空間而消耗效能;

        -Xmx:Java虛擬機器可使用堆的最大記憶體;

        -XX:PermSize:Java虛擬機器永久代大小;

        -XX:MaxPermSize:Java虛擬機器永久代大小最大值;

        除了這些引數外您還可以根據具體需要配置其他引數,引數的配置可以參考JVM引數的配置

        2.驗證

        設定成功後我們可以利用JDK自帶的工具進行驗證,這些工具都在JAVA_HOME/bin目錄下:

        1)jps:用來顯示本地的java程序,以及程序號,程序啟動的路徑等。

        2)jmap:觀察執行中的JVM 實體記憶體的佔用情況,包括Heap size , Perm size 下載地址 等。

        進入命令列模式後,進入JAVA_HOME/bin目錄下,然後輸入jps命令:

Java程式碼  收藏程式碼
  1. jps  
  2. #顯示以下結果  
  3. 2340 Bootstrap  
  4. 6696 Jps  

        其中 Bootstrap程序就是我們啟動了的 Tomcat,其程序號為2340.

        然後我們利用 jmap工具檢視其記憶體相關配置:

Java程式碼  收藏程式碼
  1. jmap -heap 2340  
  2. #顯示以下結果  
  3. Attaching to process ID 2340, please wait...  
  4. Debugger attached successfully.  
  5. Server compiler detected.  
  6. JVM version is 24.65-b04  
  7. using thread-local object allocation.  
  8. Parallel GC with 4 thread(s)  
  9. Heap Configuration:  
  10.    MinHeapFreeRatio = 0  
  11.    MaxHeapFreeRatio = 100  
  12.    MaxHeapSize      = 

    相關推薦

    簡述效能優化tomcat配置(記憶體併發快取方面)優化及壓力測試

    Tomcat有很多方面,我綜合網上文章和自己的優化過程簡單概括。 一.Tomcat記憶體優化   Tomcat記憶體優化主要是對 tomcat 啟動引數優化,我們可以在 tomcat 的啟動指令碼 catalina.sh 中設定 java_OPTS 引數。   JAVA_OPTS引

    優化tomcat配置(記憶體併發快取4方面)

    Tomcat在各位JavaWeb從業者常常就是預設的開發環境,但是Tomcat的預設配置作為生產環境,尤其是記憶體和執行緒的配置,預設都很低,容易成為效能瓶頸. 幸好Tomcat還有很多的提升空間.下文介紹一下Tomcat優化,可以分為記憶體,執行緒,IO.

    優化tomcat配置(內存並發緩存4方面)優化

    公司 應該 adt 打開 mx2 type 內存 主機名 socket Tomcat內存優化 Tomcat內存優化主要是對 tomcat 啟動參數優化,我們可以在 tomcat 的啟動腳本 catalina.sh 中設置 java_OPTS 參數。 JAVA_OPTS參數說

    如何優化tomcat配置(內存並發緩存4方面)優化

    news 同時 java 線程 進程 文件 protocol 連接超時 tac 一.Tomcat內存優化 Tomcat內存優化主要是對 tomcat 啟動參數優化,我們可以在 tomcat 的啟動腳本 catalina.sh 中設置 java_OPTS 參數。   JAVA

    優化tomcat配置(內存並發緩存)優化

    ups uri attr socket 公司 itl bsp perm script 一.Tomcat內存優化 **   Tomcat內存優化主要是對 tomcat 啟動參數優化,我們可以在 tomcat 的啟動腳本 catalina.sh 中設置 java_OPTS 參數

    處理器程序執行緒並行併發記憶體模型的相關概念併發程式設計中的三概念 Java記憶體模型剖析volatile關鍵字用volatile關鍵字的場景

    處理器:即中央處理器(CPU,Central Processing Unit),它是一塊超大規模的積體電路,是一臺計算機的運算核心(Core)和控制核心( Control Unit)。它的功能主要是解釋計算機指令以及處理計算機軟體中的資料。 程序:程序(Process)是計算機中的程式關

    tengine整合tomcat加上memcached實現高併發負載均衡可擴充套件架構

    1、高可用、負載均衡、可擴充套件架構的需要背景 2、系統架構 3、系統規劃及說明 4、系統部署及測試 5、總結 1、高可用、負載均衡、可擴充套件架構的需要背景     從網際網路誕生以來,網站架構隨著網際網路的快速發展發生著巨大的變化,現今,資料每天都在以爆

    同步非同步阻塞非阻塞並行併發共享資源的同步

    同步阻塞呼叫:得不到結果不返回,執行緒進入阻塞態等待。 同步非阻塞呼叫:得不到結果不返回,執行緒不阻塞一直在CPU執行。 非同步阻塞呼叫:去到別的執行緒,讓別的執行緒阻塞起來等待結果,自己不阻塞。 非同步非阻塞呼叫:去到別的執行緒,別的執行緒一直在執行,直到得出結果。  

    利用python指令碼執行tcpdump抓包,支援傳參併發抓取多檔案迴圈覆蓋抓取

    #!/usr/bin/env python # AUTH: [email protected] """ tcpdump -i any -s 0 -w /opt/log/tcpdump/2018-07-19--10-43-30.pcap tcp and

    【裝】並行併發同步互斥

    並行 計算機作業系統中的並行,指的是同時存在於記憶體中的多道作業都處於執行狀態。實際上都是巨集觀上並行,微觀上序列,因為這些作業都是開始各自的執行,但都沒執行完畢,只是交替地使用cpu。     在作業系統中是指,一組程式按獨立非同步的速度執行,

    Java基礎學習總結(104)——多執行緒併發工具類相關的面試題

    執行緒的概念 執行緒是程式執行的最小單位,也是作業系統排程和分派CPU的最小單元,是程序中的一個實體,是程序中的實際運作單位。可以在一個程序中啟動多個執行緒來完成不同的任務,這些執行緒共享該程序擁有的資源。 執行緒程序區別 程序是程式的實體,也是執行緒的容器,一個程序可以包含多個執行緒,程序是資源分配的基本單

    PHP session鎖併發覆蓋問題解析

    本文分享PHP的session在使用過程中的鎖和併發的問題,與之相關的現象有請求阻塞、session資料丟失、session資料讀不到。 我登入不了了 某天,我準備登入我們一個後臺系統,前去解決一個bug,在賬戶密碼驗證碼都準確輸入的情況下,我登入不上,經過多次實驗發現主要有兩個錯誤資訊: csrf驗證

    資料庫事務特性併發隔離級別鎖種類鎖粒度

    本文解釋資料庫併發控制 事務 對資料庫資料執行的一系列操作,可以是一條或者多條SQL語句 資料庫事務特性 1、 原子性 對資料庫資料的一系列操作,要麼全部執行,要麼都不

    快取失效穿透併發雪崩問題及解決方法

    1 快取失效   引起這個原因的主要因素是高併發下,一般設定一個快取的過期時間時,併發很高時可能會出在某一個時間同時生成很多的快取,並且過期時間在同一時刻,這個時候就可能引發——當過期時間到後,這些快取同時失效,請求全部轉發到DB,DB可能會壓力過重。  

    並行併發synchonrized同步的用法

    一、多執行緒的併發與並行: 併發:多個執行緒同時都處在執行中的狀態。執行緒之間相互干擾,存在競爭,(CPU,緩衝區),每個執行緒輪流使用CPU,當一個執行緒佔有CPU時,其他執行緒處於掛起狀態,各執行緒斷續推進。 並行:多個執行緒同時執行,但是每個執行緒各自有自己的C

    資料庫管理(事務ACID併發封鎖可序列化隔離)

    1、資料庫事務 1.1 資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作。 1.2 事務的4個特性(ACID):(1)原子性(atomic)(atomicity)事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作

    協程同步非同步併發並行rabbitmq分散式任務佇列

    http://docs.jinkan.org/docs/celery/ 協程 協程不是程序或執行緒,其執行過程更類似於不帶返回值的函式呼叫。 一個程式可以包含多個協程,可以對比與一個程序包含多個執行緒。我們知道多個執行緒相對獨立,有自己的上下文,切換受系統控制;而協程也相對獨立,有自己的上下文,但是

    並行併發同步和互斥

    並行 計算機作業系統中的並行,指的是同時存在於記憶體中的多道作業都處於執行狀態。實際上都是巨集觀上並行,微觀上序列,因為這些作業都是開始各自的執行,但都沒執行完畢,只是交替地使用cpu。     在作業系統中是指,一組程式按獨立非同步的速度執行,不等於時間上的重疊(同

    橫向縱向充滿螢幕(4按鈕正好各佔1/4螢幕面積(居中))——田字格

    田字格 amxl <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" an

    做seo優化一貫沒有排名你可能犯了這4錯誤

    對於那些剛開始從業seo優化排名的工作人員來說,需要注意和學習的地方有很多,但是不管怎麼學習,不管怎麼操作,所做的所有目的都是為了能夠將網站的排名提高,在搜尋引擎的關鍵詞當中能夠獲得比較好的名次。可是往往很多的新手朋友總是會陷入一個死角,就是不管怎麼對關鍵詞進行優化,都沒有辦法獲得排名,之所以出