tomcat之性能優化

  tomcat是咱們經常使用的web容器,它的性能高低直接影響到應用對外提供服務的能力和用戶的體驗,因此tomcat的優化相當重要。對於單臺tomcat服務器而言,優化主要是兩方面:內存優化和配置優化(例如,鏈接數,線程池,iO等),固然還有使用tomcat原生庫。除了這些tomcat自己固有配置優化,還有一些減小佔用tomcat鏈接時間的配置,好比數據壓縮。若是單個服務器通過優化後依然沒法知足,性能要求,這時服務器集羣就是必須的手段了,下面針對這些方面的優化詳細介紹。javascript

tomcat用戶配置css

  優化配置以前,咱們須要配置一個tomcat管理員帳戶,來登陸查看Tomcat控制檯提升的各類參數。在conf/ tomcat-users.xml下添加用戶:html

<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>

  啓動tomcat,登陸查看信息:http://127.0.0.1:8080/:java

    

 

    

 

內存優化linux

  主要是針對jvm各個內存大小的分配進行優化,以提升內存的使用率和減小資源變化帶來的時間消耗。有關文件:catalina.sh(linux下)或者catalina.bat(window下)。程序員

  注意:對於32位操做系統上對jvm的內存有不能超過2G的限制,可是64位系統上沒有這個限制。但不少狀況下32操做系統上jvm的最大使用內存是不到2G的,2G只是個理想值,根據服務器的配置不一樣,可能有些只能用1500M或者1700M。具體支持多少,能夠在控制檯輸入:java -Xmx2089M -version,若是出現Java版本,說明你的jvm內存能夠設置到2089M。web

Linux系統中tomcat的啓動參數:面試

export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M 
-XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

Windows系統中tomcat的啓動參數:數據庫

set JAVA_OPTS=-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M 
-XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true
  •  -server

  這個參數必須加上,由於tomcat默認是以一種叫java –client的模式來運行的,server即意味着你的tomcat是以真實的production的模式在運行的,這也就意味着你的tomcat以server模式運行時將擁有:更大、更高的併發處理能力,更快更強捷的JVM垃圾回收機制等。apache

  • -Xms和–Xmx

  Xms是JVM初始化時的內存大小;Xmx是jvm的最大內存大小。Xms默認是物理內存的1/64,Xmx默認是物理內存的1/4,建議是物理內存的80%,可是通常咱們會把Xms和Xmx設置同樣大,這樣在服務器啓動時就是最大值能夠避免內存膨脹和回落時帶來的資源的消耗。特別是回落時會帶來cpu的高速運轉進行垃圾回收,系統可能會出現幾秒甚至幾十秒的卡頓現象。

  • –Xmn

  Xmn是年輕代大小。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代通常固定大小爲64m,因此增大年輕代後,將會減少年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。

  •  -Xss

  是指設定每一個線程的堆棧大小。這個就要依據你的程序,看一個線程 大約須要佔用多少內存,可能會有多少線程同時運行等。通常不易設置超過1M,要否則容易出現out ofmemory。

 

  • -XX:NewSize :默認爲2M,此值設大可調大新對象區,減小FullGC次數
  • -XX:NewRatio :改變新舊空間的比例,意思是新空間的尺寸是舊空間的1/8(默認爲8)
  • -XX:SurvivorRatio :改變Eden對象空間和殘存空間的尺寸比例,意思是Eden對象空間的尺寸比殘存空間大survivorRatio+2倍(缺省值是10)

 

 

  • -XX:+AggressiveOpts

  做用如其名(aggressive),啓用這個參數,則每當JDK版本升級時,你的JVM都會使用最新加入的優化技術(若是有的話)

  • -XX:+UseBiasedLocking

  啓用一個優化了的線程鎖,咱們知道在咱們的appserver,每一個http請求就是一個線程,有的請求短有的請求長,就會有請求排隊的現象,甚至還會出現線程阻塞,這個優化了的線程鎖使得你的appserver內對線程處理自動進行最優調配。

  • -XX:PermSize=128M和-XX:MaxPermSize=256M

  JVM使用-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;在數據量的很大的文件導出時,必定要把這兩個值設置上,不然會出現內存溢出的錯誤。由XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。那麼,若是是物理內存4GB,那麼64分之一就是64MB,這就是PermSize默認值,也就是永生代內存初始大小;四分之一是1024MB,這就是MaxPermSize默認大小。

  PermGen space的全稱是Permanent Generationspace,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到

  PermGenspace中,它和存放類實例(Instance)的Heap區域不一樣,GC(GarbageCollection)不會在主程序運行期對PermGenspace進行清理,因此若是你的應用中有很CLASS的話,就極可能出現「java.lang.OutOfMemoryError:PermGen space」錯誤。

  對於WEB項目,jvm加載類時,永久域中的對象急劇增長,從而使jvm不斷調整永久域大小,爲了不調整),你可使用更多的參數配置。若是你的WEBAPP下都用了大量的第三方jar, 其大小超過了jvm默認的大小,那麼就會產生此錯誤信息了。

  • -XX:+DisableExplicitGC

  在程序代碼中不容許有顯示的調用」System.gc()」。看到過有兩個極品工程中每次在DAO操做結束時手動調用System.gc()一下,以爲這樣作好像可以解決它們的out ofmemory問題同樣,付出的代價就是系統響應時間嚴重下降,就和我在關於Xms,Xmx裏的解釋的原理同樣,這樣去調用GC致使系統的JVM大起大落,性能不到什麼地方去喲!

  • -XX:+UseParNewGC

  對年輕代採用多線程並行回收,這樣收得快。

  • -XX:ParallelGCThreads 可用來增長並行度【多CPU】
  • -XXUseParallelGC 設置後可使用並行清除收集器【多CPU】
  • -XX:+UseConcMarkSweepGC

  即CMS gc,這一特性只有jdk1.5即後續版本才具備的功能,它使用的是gc估算觸發和heap佔用觸發。

咱們知道頻頻繁的GC會造面JVM的大起大落從而影響到系統的效率,所以使用了CMS GC後能夠在GC次數增多的狀況下,每次GC的響應時間卻很短,好比說使用了CMS GC後通過jprofiler的觀察,GC被觸發次數很是多,而每次GC耗時僅爲幾毫秒。

  • -XX:MaxTenuringThreshold

  設置垃圾最大年齡。若是設置爲0的話,則年輕代對象不通過Survivor區,直接進入年老代。對於年老代比較多的應用,能夠提升效率。若是將此值設置爲一個較大值,則年輕代對象會在Survivor區進行屢次複製,這樣能夠增長對象再年輕代的存活時間,增長在年輕代即被回收的機率。

  這個值的設置是根據本地的jprofiler監控後獲得的一個理想的值,不能一律而論原搬照抄。

  • -XX:+CMSParallelRemarkEnabled

  在使用UseParNewGC 的狀況下, 儘可能減小 mark 的時間

  • -XX:+UseCMSCompactAtFullCollection

  在使用concurrent gc 的狀況下, 防止 memoryfragmention, 對live object 進行整理, 使 memory 碎片減小。

  • -XX:LargePageSizeInBytes

  指定 Java heap的分頁頁面大小

  • -XX:+UseFastAccessorMethods

  get,set 方法轉成本地代碼

  • -XX:+UseCMSInitiatingOccupancyOnly

  指示只有在 oldgeneration 在使用了初始化的比例後concurrent collector 啓動收集

  • -XX:CMSInitiatingOccupancyFraction=70

  CMSInitiatingOccupancyFraction,這個參數設置有很大技巧,基本上知足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就不會出現promotion failed。在個人應用中Xmx是6000,Xmn是512,那麼Xmx-Xmn是5488兆,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90說明年老代到90%滿的時候開始執行對年老代的併發垃圾回收(CMS),這時還 剩10%的空間是5488*10%=548兆,因此即便Xmn(也就是年輕代共512兆)裏全部對象都搬到年老代裏,548兆的空間也足夠了,因此只要滿 足上面的公式,就不會出現垃圾回收時的promotion failed;

所以這個參數的設置必須與Xmn關聯在一塊兒。

  •  -Djava.awt.headless=true

  這個參數通常咱們都是放在最後使用的,這全參數的做用是這樣的,有時咱們會在咱們的J2EE工程中使用一些圖表工具如:jfreechart,用於在web網頁輸出GIF/JPG等流,在winodws環境下,通常咱們的app server在輸出圖形時不會碰到什麼問題,可是在linux/unix環境下常常會碰到一個exception致使你在winodws開發環境下圖片顯示的好好但是在linux/unix下卻顯示不出來,所以加上這個參數以避免避這樣的狀況出現。

  上述這樣的配置,基本上能夠達到:

  • 系統響應時間增快
  • JVM回收速度增快同時又不影響系統的響應率
  • JVM內存最大化利用
  • 線程阻塞狀況最小化

 

配置優化

  主要是優化conf/server.xml文件中相關配置參數。

鏈接器優化

  這裏主要是優化connector標籤中的相關參數,用於處理訪問的請求;固然此標籤中也能夠設置線程的相關參數,可是爲了更好的性能通常咱們使用外部的線程池,這樣有利於線程的複用,以減小線程的建立和銷燬帶來的資源消耗;另外,咱們也能夠修改tomcat的運行模式:BIO,NIO,AIO(NIO2),APR.

  1. 首先,咱們須要禁用AJP協議

  AJP鏈接器:
  用於將Apache與Tomcat集成在一塊兒,當Apache接收到動態內容請求時,經過在配置中指定的端口號將請求發送給在此端口號上監聽的AJP鏈接器組件。
  屬性:
    backlog:當全部可能的請求處理線程都在使用時,隊列中排隊的請求最大數目。默認爲10,當隊列已滿,任何請求都將被拒絕
    maxSpareThread:容許存在空閒線程的最大數目,默認值爲50
    maxThread:最大線程數,默認值爲200
    minSpareThreads:設當鏈接器第一次啓動時建立線程的數目,確保至少有這麼多的空閒線程可用,默認值爲4
    port:服務端套接字的TCP端口號,默認值爲8089(必須)
    topNoDelay:爲true時,能夠提升性能,默認值爲true
    soTimeout:超時值
    例:
    <!—Define an AJP1.3 Connector on port 8089-->
    <Connector port=」8089」 enableLookups=」false」 redirectPort=」8443」 protocol=」AJP/1.3」 />  

  AJPv13協議是面向包的。WEB服務器和Servlet容器經過TCP鏈接來交互;爲了節省SOCKET建立的昂貴代價,WEB服務器會嘗試維護一個永久TCP鏈接到servlet容器,而且在多個請求和響應週期過程會重用鏈接。咱們通常是使用Nginx+tomcat的架構,因此用不着AJP協議,因此把AJP鏈接器禁用。

  

  2.Connector標籤常見參數的配置:

<Connector port="8080" protocol="HTTP/1.1"
    //編碼格式
       URIEncoding="UTF-8" 
    //線程配置
    maxThreads="1000" maxProcessors="1000" minProcessors="5" minSpareThreads="100" maxSpareThreads="1000
    //鏈接數配置
    maxConnections="1000"
    connectionTimeout="20000" acceptCount="1000"
    //是否關閉DNS的反響查詢 false:關閉,true:開啓
    enableLookups="false"
    //是否保持長時間鏈接,false:關閉,ture:開啓
    disableUploadTimeout="true"
    //是否開啓對url進行校驗的配置 ,false:關閉,true:開啓
    useURIValidationHack="false"
    //啓用壓縮的配置 
    compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
    //post請求提交最大大小
    maxPostSize="10485760"

    maxHttpHeaderSize="8192"
    tcpNoDelay="true"

    acceptorThreadCount="8"
    redirectPort
="8443" />
  •  port:表明Tomcat監聽端口,也就是網站的訪問端口,默認爲8080,能夠根據須要改爲其餘。
  • protocol:協議類型,可選類型有四種,分別爲BIO(阻塞型IO),NIO,NIO2和APR。
  • maxThreads:Tomcat使用線程來處理接收的每一個請求。此值是由該鏈接器建立的處理請求的線程的最大數目,也就是最大併發數。若是未配置默認值爲200。若是一個執行器與此鏈接器關聯,則該屬性將被忽略,因此該鏈接器將使用執行器而不是一個內部線程池來執行任務。可是這個值的是指和jvm內存和爲每一個線程所分配的內存大小有關
  • minSpareThreads:tomcat初始化時建立的線程數,線程的最小運行數目,這些始終保持運行。若是未指定,默認值爲10。
  • maxSpareThreads:maxSpareThreads 的意思就是若是空閒狀態的線程數多於設置的數目,則將這些線程停止,減小這個池中的線程總數。
  • acceptCount:當線程數達到maxThreads後,後續請求會被放入一個等待隊列,這個acceptCount是這個隊列的大小,若是這個隊列也滿了,就直接refuse connection。若是未指定,默認值爲100。通常是設置的跟 maxThreads同樣或一半,此值設置的過大會致使排隊的請求超時而未被處理。因此這個值應該是主要根據應用的訪問峯值與平均值來權衡配置。
  • maxConnections:在任何給定的時間內,服務器將接受和處理的最大鏈接數。當這個數字已經達到時,服務器將接受但不處理,等待進一步鏈接。NIO與NIO2的默認值爲10000,APR默認值爲8192。
  • connectionTimeout:當請求已經被接受,但未被處理,也就是網絡鏈接超時時間毫秒數。單位爲毫秒,默認值爲60000。一般狀況下設置爲30000。
  • maxHttpHeaderSize:請求和響應的HTTP頭的最大大小,以字節爲單位指定。若是沒有指定,這個屬性被設置爲8192(8 KB)。
  • tcpNoDelay:若是爲true,服務器socket會設置TCP_NO_DELAY選項,在大多數狀況下能夠提升性能。缺省狀況下設爲true。
  • compression:是否啓用gzip壓縮,默認爲關閉狀態。這個參數的可接受值爲「off」(不使用壓縮),「on」(壓縮文本數據),「force」(在全部的狀況下強制壓縮)。
  • compressionMinSize:若是compression="on",則啓用此項。被壓縮前數據的最小值,也就是超過這個值後才被壓縮。若是沒有指定,這個屬性默認爲「2048」(2K),單位爲byte。
  • noCompressionUserAgents:對於如下的瀏覽器,不啓用壓縮
  • compressableMimeType:壓縮類型
  • disableUploadTimeout:相似於Apache中的keeyalive同樣.這個標誌容許servlet Container在一個servlet執行的時候,使用一個不一樣的,更長的鏈接超時。最終的結果是給servlet更長的時間以便完成其執行,或者在數據上載的時候更長的超時時間。若是沒有指定,設爲false。
  • enableLookups:爲了消除DNS的反向查詢對性能的影響咱們能夠關閉DNS查詢。這個功效和Apache中的HostnameLookups同樣,設爲關閉。
  • URIEncoding:URL編碼字符集。使得tomcat能夠解析含有中文名的文件的url,真方便,不像apache裏還有搞個mod_encoding,還要手工編譯
  • maxPostSize:設置post提交內容大小。經過將此屬性設置爲小於零的值,能夠禁用限制。若是未指定,則此屬性設置爲2097152(2兆字節)。
  • acceptorThreadCount:默認是1,通常調成和cpu的線程數保持一致,好比8線程的cpu,值就調成:8.
  • allowTrace:是否容許HTTP的TRACE方法,默認爲false
  • emptySessionPath:若是設置爲true,用戶的全部路徑都將設置爲/,默認爲false
  • proxyName:如這個鏈接器正在一個代理配置中被使用,指定這個屬性,在request.getServerName()時返回
  • scheme:設置協議的名字,在request.getScheme()時返回,SSL鏈接器設爲」https」,默認爲」http」
  • secure:在SSL鏈接器可將其設置爲true,默認爲false
  • useBodyEncodingForURI:主要用於Tomcat4.1.x中,指示是否使用在contentType中指定的編碼來取代URIEncoding,用於解碼URI查詢參數,默認爲false
  • xpoweredBy:爲true時,Tomcat使用規範建議的報頭代表支持Servlet的規範版本,默認爲false
  • bufferSize:設由鏈接器建立輸入流緩衝區的大小,以字節爲單位。默認狀況下,緩存區大的大小爲2048字節
  • disableUploadTimeOut:容許Servlet容器,正在執行使用一個較長的鏈接超時值,以使Servlet有較長的時間來完成它的執行,默認值爲false
  • maxKeepAliveRequest:服務器關閉以前,客戶端發送的流水線最大數目。默認值爲100
  • socketBuffer:設Socket輸出緩衝區的大小(以字節爲單位),-1表示禁止緩衝,默認值爲9000字節
  • toNoDelay:爲true時,能夠提升性能。默認值爲true
  • threadPriority:設JVM中請求處理線程優先級。默認值爲NORMAL-PRIORITY
  • maxProcessors與minProcessors:在 Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、可以獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最 大利用率的高效程序,使空閒時間保持最低,從而接受更多的請求。一般Windows是1000個左右,Linux是2000個左右。
  • useURIValidationHack:能夠看到若是把useURIValidationHack設成"false",能夠減小它對一些url的沒必要要的檢查從而減省開銷

  固然Connector標籤中的參數還有不少,這是隻是常見的參數設置;而且這些中的參數也不必定都要設置,須要根據項目的具體狀況去設置。

   最後不要忘了把8443端口的地方也加上一樣的配置,由於若是咱們走https協議的話,咱們將會用到8443端口這個段的配置:

<!--enable tomcat ssl-->
    <Connector port="8443" protocol="HTTP/1.1"

          URIEncoding="UTF-8"  minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"acceptCount="300"  maxThreads="300" 
      maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
      SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="d:/tomcat2/conf/shnlap93.jks" keystorePass="aaaaaa" />

 

線程池優化

   在tomcat中每個用戶請求都是一個線程,因此可使用線程池提升性能.在介紹Connector標籤中咱們看到已經有線程的相關參數的設置,爲何還要有線程池?其實這個和Java中的線程池是一個道理,使用線程池可使多鏈接公用線程,避免線程的頻繁的建立和銷燬帶來的資源消耗。 

  引入線程池的方法,使用Connector標籤中的executor的屬性,將其值設置爲Executor標籤的name的值。例如:

<Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"
            connectionTimeout="20000"  enableLookups="false" maxPostSize="10485760" URIEncoding="UTF-8" useBodyEncodingForURI="true" 
      acceptCount="100" acceptorThreadCount="2" disableUploadTimeout="true" maxConnections="10000" SSLEnabled="false" />
 <Executor name="tomcatThreadPool"   
         namePrefix="catalina-exec-"  maxThreads="1000" minSpareThreads="100" maxIdleTime="60000"  
         maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5"  
         className="org.apache.catalina.core.StandardThreadExecutor"/>  

   Executor線程池的參數介紹:

  • name:線程池名稱,用於 Connector中指定。
  • namePrefix:所建立的每一個線程的名稱前綴,一個單獨的線程名稱爲 namePrefix+threadNumber。
  • maxThreads:池中最大線程數。
  • minSpareThreads:活躍線程數,也就是核心池線程數,這些線程不會被銷燬,會一直存在。
  • maxIdleTime:線程空閒時間,超過該時間後,空閒線程會被銷燬,默認值爲6000(1分鐘),單位毫秒。
  • maxQueueSize:在被執行前最大線程排隊數目,默認爲Int的最大值,也就是廣義的無限。除非特殊狀況,這個值不須要更改,不然會有請求不會被處理的狀況發生。
  • prestartminSpareThreads:啓動線程池時是否啓動 minSpareThreads部分線程。默認值爲false,即不啓動。
  • threadPriority:線程池中線程優先級,默認值爲5,值從1到10。
  • className:線程池實現類,未指定狀況下,默認實現類爲org.apache.catalina.core.StandardThreadExecutor。若是想使用自定義線程池首先須要實現 org.apache.catalina.Executor接口。

 

優化IO模式

  tomcat中io模式通常分爲分別爲BIO(阻塞型IO),NIO,NIO2和APR。區別:

      

 

  其實從上面的分析咱們並不能簡單的認爲BIO的性能就必定不如 NIO,這幾種類型 Connector之間並無明顯的性能區別,但它們之間實現流程和原理不一樣,因此它們的選擇是須要根據應用的類型來決定的。

  • BIO:BIO(Blocking I/O),顧名思義,即阻塞式I/O操做,表示Tomcat使用的是傳統的Java I/O操做(即java.io包及其子包)。Tomcat在默認狀況下,是以bio模式運行的。遺憾的是,就通常而言,bio模式是三種運行模式中性能最低的一種。BIO配置採用默認便可。適用於鏈接數目比較小且固定的架構,處理簡單流程,如程序處理較快能夠當即返回結果,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4之前的惟一選擇,但程序直觀簡單易理解.
  • NIO:NIO(New I/O),是Java SE 1.4及後續版本提供的一種新的I/O操做方式(即java.nio包及其子包)。Java nio是一個基於緩衝區、並能提供非阻塞I/O操做的java API,所以nio也被當作是non-   blocking I/O的縮寫。它擁有比傳統I/O操做(bio)更好的併發運行性能。適用於鏈接數目多且鏈接比較短(輕操做)的架構,好比聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持;更適合後臺須要耗時完成請求的操做,如程序接到了請求後須要比較耗時的處理這已請求,因此沒法當即返回結果,這樣若是採用BIO就會佔用一個鏈接,而使用NIO後就能夠將此鏈接轉讓給其餘請求,直至程序處理完成返回爲止。
  • APR:APR(Apache Portable Runtime/Apache可移植運行時),是Apache HTTP服務器的支持庫。你能夠簡單地理解爲:Tomcat將以JNI的形式調用 Apache HTTP服務器的核心動態連接庫來處理文件讀取或   網絡傳輸操做,從而大大地提升 Tomcat對靜態文件的處理性能。能夠大大提高Tomcat對靜態文件的處理性能,同時若是你使用了HTTPS方式傳輸的話,也能夠提高SSL的處理性能;鏈接數目多且鏈接比較長(重操做)的架構,好比相冊服務器,充分調用OS參與併發操做,編程比較複雜,JDK7開始支持.

修改io模式:

 <Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>

  從上面代碼能夠看出修改io模式其實就是修改connector標籤中的protocol屬性的值,其餘幾種io模式對應的值以下:

//BIO  
protocol="HTTP/1.1"  
//NIO  
protocol="org.apache.coyote.http11.Http11NioProtocol"  
//NIO2  
protocol="org.apache.coyote.http11.Http11Nio2Protocol"  
//APR  
protocol="org.apache.coyote.http11.Http11AprProtocol"  

  

監聽器Listener配置

  另外一個影響Tomcat 性能的因素是內存泄露。Server標籤中能夠配置多個Listener,其中 JreMemoryLeakPreventionListener是用來預防JRE內存泄漏。此Listener只需在Server標籤中配置便可,默認狀況下無需配置,已經添加在 Server中

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  

 

壓縮

   壓縮也是tomcat性能優化比較中要的一部分,主要是經過connector標籤中的下面幾個參數來實現的

compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

  HTTP 壓縮能夠大大提升瀏覽網站的速度,它的原理是,在客戶端請求網頁後,從服務器端將網頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程HTML,CSS,Javascript , Text ,它能夠節省40%左右的流量。更爲重要的是,它能夠對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率驚人。

 

數據庫性能調優

  Tomcat性能在等待數據庫查詢被執行期間會下降。現在大多數應用程序都是使用可能包含「命名查詢」的關係型數據庫。若是是那樣的話,Tomcat會在啓動時默認加載命名查詢,這個可能會提高性能。另外一件重要事是確保全部數據庫鏈接正確地關閉。給數據庫鏈接池設置正確值也是十分重要的。我所說的值是指Resource要素的最大空閒數(maxIdle),最大鏈接數(maxActive),最大創建鏈接等待時間(maxWait)屬性的值。由於配置依賴與應用要求,我也不能在本文指定正確的值。你能夠經過調用數據庫性能測試來找到正確的值。固然數據庫調優自己就是一個功能好大且至關複雜的工做,後面咱們會專門研究如何進行數據調優!

tomcat原生庫

   Tomcat的原生庫基於Apache可移植運行時(Apache Portable Runtime簡稱APR),給程序員提供了超強的擴展性和性能,在產品運做中幫助融合原生的服務器技術以展示最佳的性能。想知道安裝說明的朋友請參考Tomcat Native Library – (APR) Installation

其餘優化措施

  • 開啓瀏覽器的緩存,這樣讀取存放在webapps文件夾裏的靜態內容會更快,大大推進總體性能。
  • 每當開機時,Tomcat服務器應當自動地重啓。
  • 通常狀況下HTTPS請求會比HTTP請求慢。若是你想要更好的安全性,即便慢一點咱們仍是要選擇HTTPS。
  • 經過nignx進行動靜分離

 

學習連接

tomcat配置文件詳解

tomcat配置詳解及相關面試題

tomcat小貓飛起配置

tomcat性能監控工具的使用

相關文章
相關標籤/搜索