在我們之前的測試中,如果你訪問你的WEB站點URL時不加任何上下文,實際上你看到的web界面是系統自帶的測試頁面index.jsp,位於/site/wwwroot/webapps/ROOT目錄下,是Tomcat默認的根目錄。
由於要檢測JVM的usage信息以便確定,定制化修改的Java參數是否生效,所以我們需要寫一些測試代碼,打印出當前JVM的參數信息;首先使用FileZilla連接到你的網站,進入到/site/wwwroot/webapps/ROOT目錄下,下載index.jsp文件到本地。
我寫了一個簡單的測試程序,測試Java運行時heap size大小,使用ManagmentBeans獲得的JVM參數,已經上傳到了github,請直接下載,或者你也可以打開index.jsp文件添加相關代碼如下:
https://github.com/kingliantop/azurelabs/blob/master/Java/websites/index.jsp
<[email protected]="java.util.*"%> <[email protected]="java.lang.management.*"%> <% ArrayListmainPageProps=newArrayList (); mainPageProps.add("java.version"); mainPageProps.add("java.vendor"); mainPageProps.add("os.arch"); mainPageProps.add("catalina.base"); mainPageProps.add("jetty.base"); mainPageProps.add("user.timezone"); for(Stringname:mainPageProps) { Stringvalue=System.getProperty(name); if(value!=null) { out.print(""+name); out.print(""+value); out.print(""); } } intMB=1024*1024; Runtimeruntime=Runtime.getRuntime(); out.print("RuntimeTotalmemory:"+runtime.totalMemory()/MB+"M"); out.print("RuntimeFreememory:"+runtime.freeMemory()/MB+"M"); out.print("RuntimeUsedmemory:"+(runtime.totalMemory()-runtime.freeMemory())/MB+"M"); out.print("RuntimeMaxmemory:"+runtime.maxMemory()/MB+"M"); Iteratoriter=ManagementFactory.getMemoryPoolMXBeans().iterator(); out.print(" MemoryMXBean
"); out.print("HeapMemoryUsage:"+ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()+""); out.print("Non-HeapMemoryUsage:"+ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()+""); out.print("MemoryPoolMXBeans
"); while(iter.hasNext()){ MemoryPoolMXBeanitem=(MemoryPoolMXBean)iter.next(); out.print(""+item.getName()+""); out.print("Type:"+item.getType()+""); out.print("Usage:"+item.getUsage()+""); out.print("PeakUsage:"+item.getPeakUsage()+""); out.print("CollectionUsage:"+item.getCollectionUsage()+""); } %>
3. 上傳修改後的index.jsp文件到ROOT目錄下,覆蓋原來的文件,重新打開你的web站點主頁,你可以看到測試程序會打印出當前運行環境下內存大小,heap size,non-heap size大小等相關信息:
4. 我們可以看到默認運行環境下,初始Heap大小為28664K,已經使用大約54M,最大內容使用量是433M,而當前測試環境使用的網站實例大小為小型,大約是一個core,1.75G內存:
對於PermGen大小,初始大小為:
init = 22020096(21504K) used = 41871616(40890K) committed = 41943040(40960K) max = 85983232(83968K)
5. 做個簡單的實驗,我們將web站點的實例升級,看看Azure website是否會自動根據當前系統實例的大小來調整JVM相關參數,在"縮放"頁面,我們將實例升級到中型實例,點擊保存:
這個時候你會看到默認的heap size也發生了變化:
那麼Azure是如何調整Tomcat的運行環境和配置的呢?這樣動態的調整是如何做到的呢?
其實沒有什麼magic,Azure的website底層是Windows Server,采用IIS來對其他第三方的服務器例如Tomcat進行管理。IIS有一個管理模塊,叫做HttpPlatformHandler,他會做這麼幾件事情:
所有以前直接處理Http請求的第三方應用服務器,如Tomcat,Jetty,Node.JS等等,HTTP請求都交由IIS來進行接受。
由IIS接管的請求,都會被轉發至後台真正處理的服務器,比如Tomcat等等,作用類似於Nginx,apache httpd
管理第三方程序,啟動第三方程序,設定啟動參數,定制化相應環境等等,所有這些操作都通過一個叫做web.config的文件來配置實現。
那麼經由上述介紹你可以知道,在Azure website這個PAAS平台上,如果我們需要做些定制化環境部署,需要使用這個機制,由HttpPlatformHandler通過web.config配置文件來實現。
在本測試場景中,我們假定用戶需要修改默認運行環境下的heap size和PermGen的大小,因為在常見的Java應用錯誤中,出現的OutOfMemory錯誤,有些就是由於PermGen大小設置過小引起的。
首先我們需要准備一個web.config文件,在本示例中我們使用Azure站點提供的Tomcat和JDK,我們需要配置的相關參數-Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m放在JAVA_OPTS下:
注意事項:
默認的系統的tomcat路徑是"%AZURE_TOMCAT7_HOME%\bin\startup.bat",需要注意正確設置
Java相關的參數設置放在JAVA_OPTS裡面如-Xms,-Xmx等
2. 我們先來記錄一下,默認設置下的Heap size,PermGen等大小設置,刷新測試頁面,可以看到:
Heap Size:Heap Memory Usage:init = 58712896(57336K) used = 150252200(146730K) committed = 360710144(352256K) max = 835190784(815616K)
Perm Gen:
Usage:init = 22020096(21504K) used = 42138168(41150K) committed = 42467328(41472K) max = 85983232(83968K)
3.使用你的FTP工具,將web.config文件上傳到你的Azure站點根目錄/site/wwwroot:
4. 重新刷新頁面,你會看到相關JVM參數值已經發生了變化:
Heap Memory Usage:init = 536870912(524288K) used = 118235616(115464K) committed = 660602880(645120K) max = 954728448(932352K)
Usage:init = 134217728(131072K) used = 37151352(36280K) committed = 134217728(131072K) max = 268435456(262144K)
可以看到,通過web.config和HttpPlatformHandler機制,可以對Azure的站點進行定制。