Tomcat:性能優(yōu)化策略
一、背景
系統(tǒng)性能的衡量指標(biāo),主要是響應(yīng)時(shí)間和吞吐量。
1)響應(yīng)時(shí)間:執(zhí)行某個(gè)操作的耗時(shí);
2) 吞吐量:系統(tǒng)在給定時(shí)間內(nèi)能夠支持的事務(wù)數(shù)量,單位為T(mén)PS(Transactions PerSecond的縮寫(xiě),也就是事務(wù)數(shù)/秒,一個(gè)事務(wù)是指一個(gè)客戶機(jī)向服務(wù)器發(fā)送請(qǐng)求然后服務(wù)器做出反應(yīng)的過(guò)程。
Tomcat優(yōu)化從兩個(gè)方面進(jìn)行
1)JVM虛擬機(jī)優(yōu)化(優(yōu)化內(nèi)存模型)
2)Tomcat自身配置的優(yōu)化(比如是否使用了共享線程池?IO模型?)
學(xué)習(xí)優(yōu)化的原則提供給大家優(yōu)化思路,沒(méi)有說(shuō)有明確的參數(shù)值大家直接去使用,必須根據(jù)自己的真實(shí)生產(chǎn)環(huán)境來(lái)進(jìn)行調(diào)整,調(diào)優(yōu)是一個(gè)過(guò)程。
二、Jvm虛擬機(jī)運(yùn)行優(yōu)化
Java 虛擬機(jī)的運(yùn)行優(yōu)化主要是內(nèi)存分配和垃圾回收策略的優(yōu)化:
- 內(nèi)存直接影響服務(wù)的運(yùn)行效率和吞吐量
- 垃圾回收機(jī)制會(huì)不同程度地導(dǎo)致程序運(yùn)行中斷(垃圾回收策略不同,垃圾回收次數(shù)和回收效率都是不同的
1) Java 虛擬機(jī)內(nèi)存模型和相關(guān)參數(shù)
2) 垃圾回收(GC)策略垃圾回收性能指標(biāo)吞吐量:
- 工作時(shí)間(排除GC時(shí)間)占總時(shí)間的百分比, 工作時(shí)間并不僅是程序運(yùn)行的時(shí)間,還包含內(nèi)存分配時(shí)間。
- 暫停時(shí)間:由垃圾回收導(dǎo)致的應(yīng)用程序停止響應(yīng)次數(shù)/時(shí)間。
垃圾收集器
- 串行收集器(Serial Collector)
單線程執(zhí)行所有的垃圾回收工作, 適用于單核CPU服務(wù)器工作進(jìn)程
工作進(jìn)程-----|(單線程)垃圾回收線程進(jìn)行垃圾收集|---工作進(jìn)程繼續(xù)
- 并行收集器(Parallel Collector)
工作進(jìn)程-----|(多線程)垃圾回收線程進(jìn)行垃圾收集|---工作進(jìn)程繼續(xù)
又稱為吞吐量收集器(關(guān)注吞吐量), 以并行的方式執(zhí)行年輕代的垃圾回收, 該方式可以顯著降低垃圾回收的開(kāi)銷(xiāo)(指多條垃圾收集線程并行工作,但此時(shí)用戶線程仍然處于等待狀態(tài))。
適用于多處理器或多線程硬件上運(yùn)行的數(shù)據(jù)量較大的應(yīng)
- 并發(fā)收集器(Concurrent Collector)
以并發(fā)的方式執(zhí)行大部分垃圾回收工作,以縮短垃圾回收的暫停時(shí)間。
適用于那些響應(yīng)時(shí)間優(yōu)先于吞吐量的應(yīng)用, 因?yàn)樵撌占麟m然最小化了暫停時(shí)間(指用戶線程與垃圾收集線程同時(shí)執(zhí)行,但不一定是并行的,可能會(huì)交替進(jìn)行), 但是會(huì)降低應(yīng)用程序的性能
- CMS收集器(Concurrent Mark Sweep Collector)
并發(fā)標(biāo)記清除收集器, 適用于那些更愿意縮短垃圾回收暫停時(shí)間并且負(fù)擔(dān)的起與垃圾回收共享處理器資源的應(yīng)用
- G1收集器(Garbage-First Garbage Collector)
適用于大容量?jī)?nèi)存的多核服務(wù)器, 可以在滿足垃圾回收暫停時(shí)間目標(biāo)的同時(shí), 以最大可能性實(shí)現(xiàn)高吞吐量( JDK1.7之后)
三、Tomcat配置調(diào)優(yōu)
- 調(diào)整tomcat線程池
- 調(diào)整tomcat的連接器
調(diào)整tomcat/conf/server.xml 中關(guān)于鏈接器的配置可以提升應(yīng)用服務(wù)器的性能
- 禁用 AJP 連接器
- 調(diào)整 IO 模式
Tomcat8之前的版本默認(rèn)使用BIO(阻塞式IO),對(duì)于每一個(gè)請(qǐng)求都要?jiǎng)?chuàng)建一個(gè)線程來(lái)處理,不適合高并發(fā);Tomcat8以后的版本默認(rèn)使用NIO模式(非阻塞式IO)
當(dāng)Tomcat并發(fā)性能有較高要求或者出現(xiàn)瓶頸時(shí),我們可以嘗試使用APR模式,APR(Apache PortableRuntime)是從操作系統(tǒng)級(jí)別解決異步IO問(wèn)題,使用時(shí)需要在操作系統(tǒng)上安裝APR和Native(因?yàn)锳PR原理是使用使用JNI技術(shù)調(diào)用操作系統(tǒng)底層的IO接口)
- 動(dòng)靜分離
可以使用Nginx+Tomcat相結(jié)合的部署方案,Nginx負(fù)責(zé)靜態(tài)資源訪問(wèn),Tomcat負(fù)責(zé)Jsp等動(dòng)態(tài)資源訪問(wèn)處理(因?yàn)門(mén)omcat不擅?處理靜態(tài)資源)