性能測試之Tomcat配置

性能測試之Tomcat配置

當Tomcat服務器安裝好並開始運行後,需要對服務器進行一些基本配置,通常關於Tomcat服務器的配置包括兩部分:第一:編輯Tomcat的XML配置文件;第二:確定適當的環境變量;

1) XML配置文件

關於XML配置文件,Tomcat服務器有兩個很重要的XML配置文件需要配置:server.xml和web.xml。通常情況下這兩個文件存放Tomcat安裝目錄下的conf文件夾中。

server.xml文件是Tomcat最主要的配置文件,該文件主要是指定Tomcat啟動時的初時配置,並定義Tomcat啟動和構建的方式。server.xml文件中包含五類基本類別:頂層元素、連接器、容器、嵌套組件和全局設置。這些類別都有著很多屬性,在配置過程中可以對這些值進行微調,通常包括以下幾部分的內容:

頂層元素(Top Level Elements)

關於頂層元素主要包括服務器和服務兩類,服務器主要定義一個單個的Tomcat服務器,主要包括Logger和ContextManager配置,此外還包括服務器支持的“端口”、“關機”和“類名”屬性。服務則是一個元素,該元素嵌套在一個服務器中,服務包含一個或多個用於共享相同引擎的組件,該組件主要功能是定義一個單一服務器的組件,服務的名稱在“name”屬性中指定。

連接器(Connectors)

在服務器標籤中可以定義一個或多個連接器,通過Catalina從這些端口向引擎組件發送請求,Tomcat允許定義HTTP和AJP兩種連接器,關於這兩種連接器將在連接器部分的內容中進行詳細介紹。

容器(Containers)

這些元素使用Catalina直接處理設備的請求。

上下文(Context)

此元素是一個單一的web應用,並且包含如果查找到最適合的應用程序資源的路徑信息,當Catalina接收到一個請求後,它使用context去匹配最長的URL,直到找到正確的服務請求元素,context元素為每個元素設置一個最大的嵌套實例,雖然可以通過修改server.xml文件來修改context的內容,但一般情況下不應該修改context內容,因為這些配置如果不重啟Tomcat服務器不能被加載。

主機(Host)

這個元素嵌套在引擎元素中,用於關聯Catalina服務器所在網絡中的網絡服務器名,這個元素的功能只有在虛擬機註冊DNS管理域的過程中才能正確使用,該元素最大的作用是嵌套別名,可以為同一個虛擬機定義多個不同的別名。

集群(Cluster)

集群元素能夠提供上下文屬性複製、WAR部署、會話複製並且將其嵌套在一個引擎或主機元素中,雖然可以對這個元素進行配置,但一般情況下缺省設置就可以滿足用戶的需求。

全局命名資源(Global Naming Resources)

這個元素主要是為一個指定服務器指定全局Java名和目錄接口資源,可以在該元素中定義的查找特徵並且可以使用進行鏈接。如果使用該技術定義其它的參數,那麼必須指定和配置對象屬性。

範圍(Realm)

這個元素可以被嵌套在任何容器元素中,用於定義數據庫用戶名、密碼和容器的角色,如果嵌套在主機或引擎元素中,那麼Realm元素的特徵將會繼承低級別容器的特性。Realm元素中最生要的屬性是“classmate”,其主要提供不同類型容器的安全性,並且實現的方式有多種。

資源(Resources)

這個元素主要是用於通過web應用程序引導Catalina的靜態資源,常見的靜態資源有:類、HTML和JSP文件等。

Web.xml文件

Web.xml文件遵從Servlet規範,其主要包含的信息用於部署和配置web應用程序,如果是第一次配置Tomcat,那麼主要是定義Servlet映射到主要的部件(如JSP)。在Tomcat中,這個文件以同樣的方式在Servlet規範中描述這些功能。

2) 環境變量

在第一次配置Tomcat時,有幾個環境需要進行適當的修改,主要包括:JAVA_OPTS、CATALINA_HOME、CATALINA_OPTS。

JAVA_OPTS

使用該變量可以定義JVM中堆的大小,堆大小是一個很重要的指標,當在部署一個新的應用程序時,需要設置一個適當的堆大小的值,否則會影響系統性能,同時可以消除或減小OOME消息。

CATALINA_HOME

該變量用於指定Tomcat的安裝位置,當Tomcat腳本啟動時會自動去檢查這個變量的值,以確定設置是否正確,避免運行過程中出現問題。

CATALINA_OPTS

該變量用於設置Tomcat指定的不同的選項。

除了以上一些配置外,還有兩個相關的配置會影響系統性能:DNS查找和JSP編譯。

DNS查找

如果web應用服務器需要獲得客戶端的日誌信息,那麼通常有兩種方式:一是記錄客戶端機器的IP地址;第二是在DNS中查找客戶端主機名信息;而DNS查詢需要網絡流量,在查詢過程中可能會經歷多個服務器的往返查找,但也可能不需要,這樣就會導致出現延遲響應的情況,如果需要消除這些延遲響應,就必須關閉DNS查詢,在HTTP對象中有一個getRemoteHost的方法,通過這個方法可以找到一個唯一的IP地址,關於DNS的選項設置在server.xml文件中的connector(連接器)中設置,源代碼如下:

className="org.apache.coyote.tomcat4.CoyoteConnector"

port="8080" minProcessors="5" maxProcessors="75"

enableLookups="true" redirectPort="8443"

acceptCount="10" debug="0" connectionTimeout="20000"

useURIValidationHack="false"

/>

如果需要關閉DNS查找,那麼將該選項設置為“false”。除非需要指定一個完整的主機名去訪問網站,否則都需要將該選項設置為“false”,這樣不但可以節約帶寬、查找時間和內存。當然對於低流量的網站,這個設置項可能不會有明顯的效果,但是不能排除它某天變成了一個高流量的網站。

JSP編譯

在一個JSP頁面第一次被訪問時,它需要轉換為Java servlet源碼,並且編譯在JAVA字節碼,而當許多不同用戶同時訪問JSP頁面時,服務器可能會被處於一種高負載狀態,所以應該改善網站對JSP頁面的處理方法,進而優化JSP的性能。

1) Tomcat如何處理JSP頁面

JSP是Java servlet代碼與HTML標記的組合,Tomcat處理JSP是使用一個稱為Jasper 2的引擎,該引擎包括各種處理和解析JSP的組件,以及JSP的編譯器。在一個JSP頁面第一次被訪問時,Jasper引擎會將源碼轉換為Java servlet源碼,並且使用JAVA編譯器將其編譯成JAVA字節碼。

2) 審核動態內容

JSP性能改進的第一步是採取分析網站的結構、預期負載和JSP頁面需要實現的功能,如果創建的網站中混雜著動態和靜態,當網站可以完成定期更新靜態內容時,那麼應該是動態處理結束後才多的去處理靜態內容,例如網站的標題,這是一個動態的內容,但是一天可能才處理一兩次。

現在解決動態審核問題不完全是使用,現在有一些開源於JAVA模板來解決這個問題(如Velocity或Freemarker),在未來可能會成為一個新的功能。

3) JSP預編譯技術

當服務器運行JSP頁面時服務器會使用最大的性能來編譯JSP頁面,如果緩解這一問題,一般會對JSP進行預編譯操作,而不是等運行時才進行實時的編譯。通常有以下三種預編譯的方法來提高系統的性能。

第一:使用請求進行預編譯

預編譯的一次最簡單的方法是,在發送請求的過程中進行預編譯,因為在第一次發送請求時,JSP會自動進行編譯,這樣在第一個真實的用戶訪問該JSP頁面時就不需要再編譯了,如果只少數JSP頁面,並且不需要頻繁的啟動服務器,這樣可以在服務器啟動時,使用一個小腳本自動爬行所有的JSP頁面,這樣可以大大的提高性能。這個方法在開發過程中很有用,因為這種方法可以查找是那些用戶第一時間訪問JSP頁面,並且可以糾正一些錯誤。

第二:啟動時進行預編譯

JAVA中有一個Java servlet的模塊,它包括JSP指定的一些功能和語法元素,這些語法在Web應用程序啟動時會指定JSP進行編譯,在“WEB-INF/web.xml”文件中可以對JSP進行預編譯設置,如以下實例:

YourJSP.jsp

/path/to/yourjsp.jsp

1

整數“1”是用來指定編譯序順的,所以可以為預編譯創建一個層次結構,這樣可以消除第一個用戶訪問預編譯頁面的時間延遲,降低web程序重啟的所需要的資源。

第三:在編譯過程中進行預編譯

在編譯過程中進行預編譯是指在構建Web應用程序時,使用JspC進行預編譯JSP代碼,而不是在Tomcat服務器上進行動態編譯,在一些情況中下這種技術可以提高4%的系統性能。

JSP最佳實踐

前面介紹了通過修改Tomcat配置文件來提高JSP性能,而遵守一些編碼規則也可以提高JSP的性能,通常有兩種方法:高效緩存和對象控制。

第一:在代碼中如何有效提高JSP原始的緩存數據可以有效的提高性能,即如何有效的利用緩存中的數據或如何高效使用緩存方法來處理數據。

第二:目標控制,主要包括會話長度/範圍、線程池配置和緩存區大小。

1) JSP數據緩存

如果JSP頁面已經產生了一些靜態或動態內容,那麼這種情況不要它再出現,因為它可以通過會話或應用程序調用緩存數據,為了得到安全的動態內容,這樣會重複使用所有活動會話。

生成靜態文件使用了一次_jsplnit()方法,同時使用_jspService方法對數據進行備份,但不在每次請求頁面時使用out.print()。緩存中的動態數據有4個持久機制,Tomcat原始的持久機制、cookies、URL重寫和隱藏區域。

通常的一個解決方案是,平衡客戶端和服務器間的負載、安全緩存(Tomcat持續支持安全的存儲數據)和處理隱藏區域。

2) 對象控制

在關閉會話、重新使用標籤和配置緩存區時,很容易浪費服務器CPU時間週期,特別是在清理JSP代碼時需要考慮這個問題,所以可以考慮移除大數據和關閉會話、對象。在整個頁面生成過程中一次性移除大數據(如圖片),通常使用flush()方法移除,並且應該考慮設置緩存大小。在控制對象時,JSP包括處理會話、孤立對象和飢餓內存的處理機制,如超時和序列化。


分享到:


相關文章: