跳到主要內容

Glassfish 效能調校

Glassfish 是有 open source 版本的 Java EE Server
另一個在Java EE開發中常用到的Tomcat相較之下只涵蓋了web container的部分
以支援的規格、後台的豐富性來說,這是Glassfish較出色的部分

雖然Glassfish功能較多也較強大些,但配置的設定也會較為複雜
如果開發上用不到這麼多東西的話,較輕量且被大量運用的Tomcat會是較好的選擇

安裝時記得選用尚未被占用的 port
在 local 端預設登入管理主控台的路徑是 http://localhost:4848/

Glassfish 支援開發模式和生產模式
差別在於開發模式會開啟自動重新載入JSP的功能
處理每個頁面的請求時,內建的 listener 都會檢查該頁面是否有被修改過
讓改過的程式不需要重新部署就能直接顯示結果,也就是熱部署的效果
但是每次請求的檢查也包括了檔案的synchronized處理,會對效能產生影響
在生產模式則關閉這個功能,有任何程式碼的修改都必須經過重新部署才會生效

預設上Glassfish使用開發模式
調整成生產模式的方法是找到 domain目錄/config/default-web.xml 修改
domain目錄的預設以windows來說就會在Glassfish的安裝路徑下
例如 X:\Glassfish\glassfish\domains\domain1\config\default-web.xml
找到以下的設定碼

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
   .....

加入

    <init-param>
      <param-name>development</param-name>
      <param-value>false</param-value>
    </init-param>
<init-param>
      <param-name>genStrAsCharArray</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>

透過Glassfish的管理主控台我們可以做到更多操作
我的版本是用多國語言版,所以以下就直接用中文說明項目
<配置> -> <default-config> or <server-config> -> <JVM設定> -> <JVM選項>


JVM中的物件回收機制之一就是物件的世代劃分
存在時間越久的物件較容易被JVM分配在年老代
GC(垃圾回收器)也較不會動到年老代物件
反之我們建立用來臨時儲存的資料就會畫分在年輕代
GC就會較常來這裡回收已不被使用的物件

container在處理請求時會建立許多暫時性的 String 和 char 陣列
這些物件通常會在年輕代空間中被回收
但若年輕代空間太小,部分的物件就可能被迫晉升到年老代空間
從JDK 1.4開始,年輕代的空間大小是以JVM的 NewRatio 的值設定
值的意義是年輕代空間和年老代空間的大小比例
由<JVM選項>可以找到 -XX:NewRatio=2 ,也就是預設值是2
提高數值可以增加些效能

Glassfish和其他的 web containers 會內含一個 RMI server處理client端的請求
RMI server預設每1分鐘呼叫System.gc()來清除分散式垃圾
在 <server-config> 裡的 <JVM選項> -> <增加JVM選項>
設定垃圾回收時間間隔為無限大
-Dsun.rmi.dgc.client.gcInterval=Long.MAX_VALUE
-Dsun.rmi.dgc.server.gcInterval=Long.MAX_VALUE
再狠一點的就直接下 -XX:+DisableExplicitGC 關閉分散式垃圾處理
如果程式碼會倚賴頻繁的 reference processing 則不建議將gcInterval設無限大
數值是以毫秒計算,例如1分鐘是60000;直接設定適當的數值即可

執行緒池(thread pool)的大小也是影響效能重要的參數
我們可以從 <配置> -> <server-config> -> <執行緒池> 的 http-thread-pool 參數得知
Glassfish的thread pool預設值是5,對於開發者的機器已經是夠用的數值
但若是正式環境的大型 Server 則可以再調整這個參數值
注意若執行緒數目的最大值設定過高,反而會因為 context switches 或 cache error降低效能

在  <server-config> -> <網路配置> -> <網路偵聽程式> -> <http-listener> 的HTTP項目
其中可以設定是否啟用GZIP壓縮傳輸的資料

壓縮的選項共有 off/on/force,force會對所有類型的檔案(如圖檔等)都進行壓縮
<壓縮最小大小> 這個項目翻的不直覺,意思是在檔案超過設定的大小才會套用壓縮
關於壓縮流量的考量可以參考網路的資料壓縮考量

Glassfish中尚有相當多的項目可以調整
剩下的就不提了,直接操作更明確

留言