星期一 四月 09, 2007

Sun Web Server 連線要求處理機制

時常被問到 Sun Java System Web Server (SJSWS) 有那些調校的空間。其實可調的參數很多,看你要調的是那一方面的功能。完整的調校除了 Web Server 本身設定之外、也必須包括底層作業系統的 TCP/IP 參數及檔案系統等非直接由 Web Server 控制但會被利用到的元件。建議先詳閱 Sun 官方調校文件,7.0版的文件為 Sun Java System Web Server 7.0 Performance Tuning, Sizing, and Scaling Guide,6.1 版的文件為 Sun Java System Web Server 6.1 SP4 Performance Tunning, sizing, and Scaling Guide,二個版本的調校原理是一樣的,能調的參數也差不多,最大的不同點是在於 7.0 大改管理架構,所以很多參數的名稱及設定位置在 7.0 及 6.1 是不一樣的。

由於參數很多,初閱調校文件時,你大概不太能了解每個參數彼此間的差異。我想最重要的是先了解 SJSWS 處理 HTTP 要求整個流程,才不會迷失在冗長的調校文件中。這是本篇重點,OK,進入主題吧 !

當遠端使用者以瀏覽器向你的 SJSWS 伺服器存取網頁時,在伺服器端發生下面的動作:

  1. TCP 連線 (Connection) 建立。
  2. 由接收緒 (Acceptor Thread) 接收來自遠端的 TCP 連線。
  3. 將接收的 TCP 連線排入佇列,等待工作緒 (Session Thread) 處理
  4. 工作緒處理 Http Request 。
  5. JVM 處理及回應 。

請不要忘記:雖然大多數人佈署 Java Web Application (WAR file) 在 SJSWS 上,但是這只是其中一種應用。SJSWS 並不是僅能處理 Servlet/JSP 要求。它是一個多功能的 HTTP Server ,也非常適合佈署 PHP、Perl、CGI 等程式。在以上的五個動作中,1-3 是處理 Connection 的動作,是由 Native Code 執行,4-5才是處理 HTTP 要求的動作,視所要求的程式為何,若為 Servlet/JSP 要求則由內部 in-process 的 JVM 處理,若為 PHP要求 則由 PHP 的 plugin 處理。習慣用 Apache 或是 Tomcat 的人常希望能以 Apache vs SJSWS 或 Tomcat vs SJSWS 來做評比,我認為以功能面來看,SJSWS = Apache + Tomcat。有與趣的請參考我之前的 Blog

好,細說各動作如下。

TCP 連線 (Connection) 建立

這一個階段和 SJSWS 沒有直接關連,而是使用者及伺服器二方 TCP/IP 層的互動。HTTP 依賴 TCP/IP,所以瀏覽器要送 HTTP request 前需先建立 TCP 連線。連線建立過程是利用所謂的 three way handshake (見 RFP 793 3.4 節) ,如下:

  1. 瀏覽器 --- [SYN] ---> Web伺服器
  2. 瀏覽器 <--- [SYN+ACK] --- Web伺服器
  3. 瀏覽器 --- [ACK] ---> Web伺服器

此時連線正在建立(也就是還沒有建立完成), 伺服器端 TCP 層需暫存住已發出 SYN+ACK 但還未收到 ACK 的連線要求。這一個暫存空間的大小由作業系統控制,以 Solaris 為例,是 tcp_conn_req_max_q0 參數(預設值為 1024)。

由接收緒 (Acceptor Threads) 接收來自遠端的 TCP 連線

當 handshake 完成後,二端 Socket Pair 確立,連線建立完成,SJSWS 隨時可接收(accept) 這一個連線。在被接收前,會被暫放在 listen backlog 中,SJSWS 的 listenQ 參數 (預設值為 128) 及 Solaris tcp_conn_req_max_q (預設值為 128) 都會對這個 backlog 的大小有影響,調整時二個參數要一起調。

官方文件建議將 tcp_conn_req_max_q0, tcp_conn_req_max_q, 以及 Web Server 的 listenQ 參數設定成同樣的值,如 8192 (視伺服器大小而異)。

接收連線是 Acceptor 的工作,SJSWS 的 Acceptor 是指一個或多個 Acceptor Thread(s),負責將 listen backlog 中的連線接收進來放到 Connection Queue 中。可調的參數為 Acceptor Thread 數目 (預設值為 1),建議設定值為 CPU 的數目,但 loading 很大的伺服器可調為 CPU 數的二倍。

將接收的 TCP 連線排入佇列,等待工作緒 (Session Threads) 處理

如前所述,連線被Acceptor 接收後即被丟入 Connection Queue 中,等著被 Session Thread 處理。後方 Session Thread 的執行往往是最花時間的(真正在執行 Servlet/JSP, PHP 等程式碼),所以連線在 Connection Queue 中等待的時間通常會最久。Connection Queue 的大小是由 SJSWS 的 connQueueSize 參數 (預設 4096) 決定。

HTTP 1.1 版有所謂的 Connection Keep Alive 功能,不必每一個 HTTP Request 都重建 TCP Connection,這一類的 Connection 在第一次被 Acceptor 接近來並處理後,就會由 Keep Alive Thread 及單獨的 Poll 接管以處理後續的 HTTP 要求。SJSWS 對於 Keep Alive 機制也有參數可調,如 MaxKeepAliveConnections 指定同時可保留的數目、 KeepAliveTimeout 指定連線最大閒置時間 (防止不負責任的客戶端程式不結束連線) 等。


工作緒處理 Http Request

到此之前,SJSWS 都是在消化及暫存 TCP 連線 ,還沒正真開始處理 HTTP 要求。處理 HTTP 要求是工作緒 (Session Thread) 的責任。

當連線進了 Connection Queue 後,SJSWS 會檢查是否有空閒的 Session Thread 可消化 Queue 中的連線,若有,則將其拉出 Queue 並等給一個空閒的 Session Thread 處理。若沒有空閒的 Session Thread,則會視設定來判定是否要動態增加 Session Thread。Session Thread 的數量等於是伺服器能同時平行處理 HTTP 要求 (通常是指執行 JSP/Servlet) 的能力。Session Thread 的多少是由 SJSWS 的 RqThrottle (預設值為 128) 及 RqThrottleMin (預設值為 48) 來決定。

RqThrottleMin 決定伺服器在剛啟動後或空閒時最少要保持的 Session Thread 數目;RqThrottle 則決定伺服器最多能保有的 Session Thread 數目。調整這個參數要小心,不要太大以免用光系統資源。RqThrottle 是 128,通常不會加到 500 以上。

JVM 處理及回應

Session Thread 是 Language Neutual 的,也就是說 Session Thread 並不是專門處理 JSP/Servlet。在處理 HTTP 要求時,Session Thread 會依據 mine.conf 及 obj.conf 檔中所定義的指令來決定由何種 plug-in (Perl Plug-in, PHP Plug-in, J2EE Plug-in, 或 ReverseProxy Plug-in)來接手。 各種不同型式的 plug-in 也都有自有的調較方法,而且這程調校通常對效能影響最直接也最大。

例如你若用 SJSWS 來佈署 Java Web Application (JSP/Servlet) ,就不要忘記調校 JVM 的設定。最常調的 JVM 設定就是 Heap Memory Size,若 Heap Size 不夠會嚴重影響 Java 程式效能。它的大小由 SJSWS 的 JVMOPTION Xms 及 Xmx來設定。要小心,不要太大,否則易導致 Out of Memeory Exception。

SJSWS 還有很多很多的參數可以調,實在是族繁不及備載。一般在做效能調校時最常要動到的有 :

  • SJS Web Server (以 SJSWS 6.1 為例)
    • JVM Heap size (server.xml)
    • RqThrottle, RqThrottleMin (magnus.conf)
    • connQueueSize (magnus.conf)
    • listenQ (magnus.conf)
    • MaxKeepAliveConnections (magnus.conf)
    • Access & Error Log (server.xml)
  • TCP/IP (以 Solaris 為例)
    • tcp_conn_req_max_q (ndd command)
    • tcp_conn_req_max_q0 (ndd command)
    • tcp_time_wait_interval (ndd command)
    • file descriptor size (etc/system)

效能調校是取捨的藝術,管理者必須決定應該來者不拒(但回應超慢);或是拒絕過多要求(但保持原有連線的服務品質)。盲目地加大參數值只會吃掉資源,但不見得真的會用到 ?

還有,參數和實際效能不是線性關係,只有"合理"的壓測結果才能推估真實的效能。有時會看到效能需求如 "系統應可承受2000人同時使用".....但是沒有服務水準的要求。若平均回應速度慢到 3 分鐘,是否也合乎客戶的要求 ? 還有 "2000 人同時" 的情境要如何在壓測中模擬,也要很小心。2000 Active Users 和 2000 Concurrent Connections 和 2000 Concurrent Requests 是很不一樣的。

星期四 二月 01, 2007

試用 Sun Java System Web Server 7.0

下一版的 Web Server 是7.0。約在明年年初會和 JES 一同推出。新版本最大的不同是全新的管理介面,以及對 Web Service 的支援。

  • 支援 Solaris 64-bit
  • 全新的管理平台
    • Cluster 管理
    • 快速進入常用工作介面
    • 以往較複雜的工作現在有 Wizards 協助
    • 完整的指令行功能,可用 script 來撰寫及自動管理工作
    • 簡化 SSL certificates 管理
  • 更多 regular expression 支援以強化 URL rewriting 及 mass hosting 的功能
  • Cluster 內可回復 Java session
  • 內建 Java 支援,包括 Servlets 2.4, JSP 2.0, JSF 1.1, JSTL 1.1, JWSDP 2.0
  • NetBeans 5 整合, Java Studio Enterprise 8.1 整合,Java Creator 整合。
  • 更多 WebDAV content publishing 支援
  • 新的加密運算法 Elliptic Curve Cryptography (ECC)
  • 內建 Reverse Proxy 功能,不需要再下載 plug-in

目前已有 Technology Preview 3 的版本可供免費下載試用。該版本支援的平台有

  • SUSE Linux Enterprise Server 9
  • Red Hat Enterprise Linux 3.0, 4.0
  • Windows 2003 Server Enterprise Edition, Windows XP Professional
  • Solaris 9/10, x86
  • Solaris 10 AMD x64
  • Solaris 8/9/10, SPARC

你可以下載在 Windows XP 的 ldaptop 上,安裝完後很快就可以測試了。下載時需要以 Sun Online Account 登入,這是一個免費的 account,可當場註冊。

你可以用 SJS Web Server 來架 Wiki ,以下的連結做為參考:

\* 如何利用 SJS Web Server 7.0 安裝 JSPWiki (English)

星期二 一月 03, 2006

你還在 Apache 嗎 ?

本來我還在計劃寫一篇 點將錄(Part II)來介紹 SJS Web Server,不料今天收到幾個 Benchmark,覺得很興奮,決定先 blog 一下。

提到 Web Server,大家想到的不外乎 Apache, Microsoft IIS, Zeus, 以及 SunONE(希望..)。以普及程度來說,Apache 最高,次為 IIS,再來是 Sun or Zeus (見 Netcraft 2005/12 Web Server survey)。前二個是耳熟能詳的"紅牌",Apache 是掛了 OpenSource 的光環,只要標榜 OpenSource 的軟體都 by default 支援,IIS 是拜"置入性行銷"之賜,裝了 Windows Server 就有一票。昇陽的 Web Server 在只此不公平的環境之下仍能保有第三位,實在是因為其技術及安全性上有過人之處。

本篇只針對 Sun Java System Web Server 6.1 (之前的 SunONE or iPlanet or Netscape Enterprise...名字改太多次了) 及 Apache 作討論,IIS 因為平台同質性不高,不多說。

SJS WS6 和 Apache 最大不同的地方在於 Apache 只是一個單純的 HTTP Server + CGI container ,而 SJS WS6 是 HTTP Server + CGI container + JSP/Servlet container。以建置的角度來看,二者都可以在同一個 process 中跑 PHP, Perl 或 CGI 的程式,但是若要跑 JSP/Servlet,Apache 就要依賴別人了,最常用的是 Tomcat。Apache + Tomcat 在管理上就比較複雜,很多 site 根本就直接用 Tomcat,但是 performance 以乎不是很好。然而 SJS WS6 本身就是一個 JSP/Servlet conatiner,你可以把你的 J2EE Web Application 直接deploy 上去,就可以跑了,這樣的組合不僅使架構單純,也可以同時顧及 HTTP connection performance 以及 Java 平台的方便性,最近幾版的 SJSWS6 還支援 JDBC connection pool等功能,其實如果你不用EJB,實在沒有理由去裝一個 J2EE Application Server,用 SJSWS6 就搞定了。Sun 的 Access Manager, Portal Server 就可以完全跑在 SJSWS6 上。

以管理者的角度來看,Apache 的管理是十分"直接"的,沒有 Web UI。而 SJS WS6 有 Web UI 的管理介面可以對 Server 的所有設定做修改、重啟伺服器、設定及產生憑證及憑證申請要求等,十分好用。

那 SJSWS 是不是只能跑在 Solaris 上 ? Certainly NOT !! 最新版的 SJSWS6.1SP5 支援以下的平台:

  • Windows Server 2003, Enterprise Edition
  • Windows 2000 Server SP4
  • Windows XP
  • Red Hat Enterprise Linux 3.0
  • Red Hat Linux Advanced Server 2.1
  • Solaris 9, 10 - x86
  • Solaris 8,9,10 - SPARC
  • Solaris 10 - SPARC 64-bit
  • HP-UX 11i
  • AIX 5.1, 5.2, 5.3
夠用了吧 !!! 此外,SJSWS6.1 從SP4 開始支援高效能的 FastCGI,像 PHP 就能因此受惠不少 ,Zend (PHP 提供者) 還特別針對 SJS WS 提供文件說明及工具來支援此功能。據說效能會提昇好幾成。

然後....很重要的一點...Benchmark !!

www.spec.org 的  SPECWeb2005 (JSP based) 測試結果,SJSWS6.1 64-bit 締造 world record。數字是 14001,本年度其他家 (IBM, DELL) 以  Zeus 64-bit 跑出來的數字從來沒有超過 5000。硬體上是用 Sun 最新的 T1 chipset (只有一顆 CPU 但是有 8 個core,每個 core 有4的硬體 threads,共有32個 threads),但是也可以看出來 SJSWS6.1 在硬體許可的情況下,可以 Scale UP。有趣的是IBM及DELL為何不敢用 Apache HTTP Server 放在前台做 benchmark,而用要費錢的 Zeus ?

另一個單純以 Apache 為對象的測試是由 KeyLabs 所做的 Benchmark。以同樣的 AMD optreon based 機器,根據 www.spec.org 所提供的方法及工具來測量二者所能負載的 connection 數,結果 SJSWS6 以 22% 的優勢 beat Apache。

另外還有很多安全性上面的比較,以後有機會再 blog 給大家。

很多人都用 Apache/Tomcat,我想是因為免錢又可以下載,並不是因為它是 OpenSource。請問你去改 Apache 的  source code 來 fix the problem 或是增加功能嗎 ?遇到問題也大部份都自己解決吧 !! 如果你是這樣的行為模式,我想不出理由 SJSWS 不能替代 Apache。如果你能自行管理,那完全免錢。如果你的公司政策需要大廠背書,畢竟 SJSWS 還有一個原廠可以給你買 support service,你不用扛責任,Why NOT !!! 如果你是 ISV,我更強烈推 SJSWS,因為它會使你的產品效能更好。

有興趣的話,可以單獨下載 SJSWS6.1SP5來玩玩看。他的產品文件在這裡。另有一個中文的版本說明

Have Fun !!!

About

純粹個人經驗分享,並非官方立場。

Search

Archives
« 四月 2014
星期日星期一星期二星期三星期四星期五星期六
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今日