在任何一個(gè)的生產(chǎn)系統(tǒng)上線前,系統(tǒng)性能調(diào)優(yōu)(Tuning)都是很重要的一步。通常,應(yīng)用系統(tǒng)的軟硬件的缺省值都是給開發(fā)平臺(或小規(guī)模系統(tǒng))設(shè)計(jì)的,用來跑生產(chǎn)系統(tǒng)幾乎都無法發(fā)揮出軟硬件的最佳性能。有時(shí),系統(tǒng)調(diào)優(yōu)前后的性能會(huì)差好幾倍。另一方面,由于應(yīng)用程序的開發(fā)人員通常都是針對功能作開發(fā)的,因此,開發(fā)硬件都是比生產(chǎn)環(huán)境要小的機(jī)器。例如,生產(chǎn)系統(tǒng)是一臺8個(gè)CPU,64GB內(nèi)存的服務(wù)器,而開發(fā)服務(wù)器可能只有1個(gè)CPU和4GB內(nèi)存。所以,在開發(fā)人員中常常不具備做性能方面測試的軟硬件環(huán)境。另外,有的程序員甚至在開發(fā)時(shí)都沒有考慮到多用戶并發(fā)的環(huán)境,程序中存在單點(diǎn)瓶頸等問題。在做壓力測試和調(diào)優(yōu)時(shí),往往就會(huì)發(fā)現(xiàn)這些關(guān)鍵點(diǎn)。
由于應(yīng)用系統(tǒng)是個(gè)軟硬件的完整統(tǒng)一體,系統(tǒng)調(diào)優(yōu)往往需要涉及硬件、網(wǎng)絡(luò)、操作系統(tǒng)、中間件,應(yīng)用程序和數(shù)據(jù)庫等方面。在調(diào)優(yōu)的過程中,往往需要發(fā)現(xiàn)存在瓶頸的地方(也就是導(dǎo)致系統(tǒng)變慢的部分),分析原因,從而改進(jìn)和確定較優(yōu)的參數(shù)。
我們在作JVM的調(diào)優(yōu)前,通常先要了解運(yùn)行的硬件平臺,操作系統(tǒng)和中間件,然后針對這些情況配置相應(yīng)的系統(tǒng)參數(shù),在測試中不斷完善參數(shù)。由于性能調(diào)優(yōu)需要對系統(tǒng)非常了解,并且需要豐富的經(jīng)驗(yàn),因此不是一件容易的事情。這里介紹一些很好的參考資料,就是SPEC.org的網(wǎng)站。這是硬件廠商公布benchmark測試結(jié)果的地方,通常硬件廠商會(huì)把系統(tǒng)調(diào)到最優(yōu)化才公布結(jié)果的,因此很有借鑒意義。常見和JVM有關(guān)的benchmark值主要有SPECjAppServer2004和SPECjbb2005。前者是J2EE應(yīng)用服務(wù)器的性能指標(biāo),后者是服務(wù)器端Java虛擬機(jī)的性能指標(biāo)。給大家介紹這個(gè)網(wǎng)站的目的是說大家可以參考硬件廠商給出的JVM配置,在根據(jù)自己應(yīng)用環(huán)境的特點(diǎn),較快的得出較好的參數(shù)。例如,這個(gè)網(wǎng)頁給出了SUN公司T5120服務(wù)器+應(yīng)用服務(wù)器9.1
+JDK1.5的SPECjAppServer2004值是8,439.36:
http://www.spec.org/jAppServer2004/results/res2007q4/jAppServer2004-20071106-00092.html
我們現(xiàn)在要關(guān)心的不是Benchmark的值(注:實(shí)際上,Sun公司的這個(gè)值是個(gè)很不錯(cuò)的結(jié)果),而是留意在這種環(huán)境下JVM的參數(shù)配置,可以找到一個(gè)欄目“Notes
/ Tuning Information”:
JVM Options: -server -XX:+AggressiveHeap
-Xmx2560m
-Xms2560m -Xmn1024m
-Xss128k
-XX:PermSize=256m
-XX:+DisableExplicitGC
-XX:ParallelGCThreads=24
-XX:LargePageSizeInBytes=256m
-XX:+UseParallelOldGC
-XX:+AggressiveOpts
-DAllowManagedFieldsInDefaultFetchGroup=true
-DAllowMediatedWriteInDefaultFetchGroup=true
-XX:-UseBiasedLocking
-Dcom.sun.ejb.containers.readonly.relative.refresh.mode=true
-Dcom.sun.jts.dblogging.insertquery=insert
into
txn_log_table_0 values ( ? , ? , ?
)
-Dcom.sun.jts.dblogging.deletequery=delete
from
txn_log_table_0 where localtid = ? and servername
=
?
-Dcom.sun.jdo.spi.persistence.support.sqlstore.
MULTILEVEL_PREFETCH=true
那么上面那些參數(shù)是什么意思呢?上述段落中“-XX”的參數(shù)是SUN JVM的擴(kuò)展選項(xiàng),其中以下的這些都是和垃圾回收(GC)有關(guān):
-XX:PermSize=256m
-XX:+DisableExplicitGC
-XX:ParallelGCThreads=24
-XX:+UseParallelOldGC
-XX:+AggressiveHeap
下面這個(gè)選項(xiàng)是選擇大的內(nèi)存頁面:
-XX:LargePageSizeInBytes=256m
"-XX:+AggressiveOpts"是一些試驗(yàn)性優(yōu)化參數(shù),“-XX:-UseBiasedLocking”是非競爭性的同步選項(xiàng)。
而選項(xiàng)“-Xmx2560m -Xms2560m -Xmn1024m
-Xss128k”則是初始堆棧的內(nèi)存值,注意-Xmx和-Xms的值是一樣的,這樣系統(tǒng)性能會(huì)較平穩(wěn)些。
至于這些參數(shù)詳細(xì)代表什么意義,大家可以google一下就很容易了解。這是Sun網(wǎng)站上的說明,有興趣的可以讀一下:
http://java.sun.com/performance/reference/whitepapers/tuning.html
如果你的應(yīng)用系統(tǒng)是JDK1.5,硬件是T5120,操作系統(tǒng)是Solaris,那么這些參數(shù)就很有借鑒意義。如果你的硬件系統(tǒng)不是T5120,但是使用SUN的JDK1.5
,這些參數(shù)也是有一定參考作用。當(dāng)然,最理想的是選擇一個(gè)和自己的環(huán)境最近似的結(jié)果來參考。大多數(shù)軟硬件的測試結(jié)果都可以在SPEC.org上找到,如果你的系統(tǒng)是J2EE的3層架構(gòu),可以用jAppServer2004指標(biāo),如果是純JAVA的應(yīng)用,可用jbb2005的結(jié)果:
http://www.spec.org/jAppServer2004/
http://www.spec.org/jbb2005/
需要注意的是,這些調(diào)優(yōu)參數(shù)只是提供了一個(gè)思路,具體是否合適你的應(yīng)用還要看實(shí)測結(jié)果。