13 May 2007

只是基本設定的筆記

1. 設定 JVM 參數,我的習慣是寫死在 bin/catalina.sh 的最上面:

JAVA_OPTS=" -Xmx1024M -Xms512M 
-XX:MaxNewSize=128m -XX:MaxPermSize=128m 
-server 
-Djava.awt.headless=true 
-Dcom.sun.management.jmxremote $JAVA_OPTS "

上面的設定要寫成一行。-Xmx 表示 heap 最大的 size,-Xms 表示一開始 heap 的 size。一般 -Xmx512M -Xms256M 應該很夠用了,但如果你寫程式像我一樣完全不管記憶體,那設大一點也行。不過,heap size 越大,GC 的週期會被拖長,而每一次 GC pause 的時間也會變長,請小心調整。

-XX:MaxNewSize=128m -XX:MaxPermSize=128m 則是設定 permenant generation (permGen) 的記憶體大小。permGen 是放 class定義等固定的資料,基本上不會被 GC 掉的。jvm 的預設值大小只有 64MB,一般小系統勉強可以用,但如果你的系統用了 hibernate/spring/lucene/struts... 一大堆的 jar 檔,那麼 64MB 就不夠放了,跑一陣子就會出現 out of memory error,所以這裡我們調整到 128 MB,以策安全。

-server 是開啟針對 server 的最佳化。請注意如果一旦決定使用 -server flag,那麼開發階段就要加 -server 來開發與測試,尤其是 multithread 的程式。(因為最佳化不同可能會出現不同的結果... 有興趣的請參見 Java Concurrent in Practice)

-Djava.awt.headless=true 是關掉 AWT 找去 x window 的顯示。用 jfreechart 之類需要 java2d 的工具常會遇到這種問題。先關了好。

-Dcom.sun.management.jmxremote 開啟 jmx 的管理,這樣就可以用 jconsole 查看 tomcat 的狀態。

2. 設定 conf/server.xml

<Connector port="8080" protocol="HTTP/1.1" 
               maxThreads="200" connectionTimeout="20000" 
               redirectPort="8443" 
               URIEncoding="UTF-8"
               compression="on"
               compressionMinSize="2048"
               compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 
               noCompressionUserAgents="gozilla, traviata" 
    />

maxThreads 是 server thread pool 的上限值,如果沒寫預設就是 200,一般小站是夠用了。系統上線後可以用 jconsole 監控 JVM 的 peak thread 是多少,如果超過 200,再往上調整看看有沒有用。

URIEncoding="UTF-8"。如果網站是用 utf-8,而且有用到 ajax,那這個設定一定要設,不然 ajax 中文會變亂碼。

接下來四個參數是跟壓縮有關的,可以大幅減少頻寬的使用,compressionMinSize="2048" 表示檔案要大於 2k 才啟用 gzip 壓縮。我自己做個小實驗,發現 800 byte 的檔案還是可以壓到 600 byte的,所以不見得小檔案就一定有反效果,只是效果不大罷了。compressableMimeType 則是設定成符合 html/xml/js/css 的檔案就壓縮。

主文 html 要壓縮我想沒啥問題啦,至於 js 和 css,建議先將散落在網頁上的小檔案合併成二個大檔案: all.js, all.css。一來這樣可以大幅減少 client 對 server 的 request 數。二來套用 gzip 的壓縮時也可以得到很好的壓縮比。純文字的壓縮比可以到 1/8~1/10,相當可觀。有興趣的人可以看看 google, amazon, yahoo 等等大站通通都有做壓縮,yahoo 甚至還有個工具專門檢查有沒有漏掉哪個檔案忘記壓縮咧!所以建議一開始就把壓縮打開,省得日後麻煩 (當然這算是 premature optimization,不過 cost 只是切換個 xml attribute 而已,沒啥大礙)

欲檢查 gzip 壓縮的效果可以安裝 firefox 的神奇 plugin firebug,記得每次測試前都要清除 browser 的 cache,不然看不出效果。

一開始上線先從上述的基本設定開始,然後再視情況調整其他的參數。