一般Web應用程式的架構分為四層:用戶端層、HTTP伺服器層、Web應用程式層,以及資料庫層。使用者所操作、檢視的介面,是位於用戶端的瀏覽器。HTTP伺服器在小型的系統,有時會被省去,讓Web伺服器獨立負擔HTTP連線的處理。例如,現在頗多以Java開發的網站,直接利用Tomcat,讓它兼負Web應用程式伺服器及HTTP伺服器的雙重角色。
但對大型的網站而言,利用Tomcat這樣的Web應用程式伺服器,去處理大量並行的HTTP連線,能力並不足夠。因此,多半會以Apache或lighttpd之類的HTTP伺服器,先承接外界送進來的HTTP連線,再由HTTP伺服器將HTTP連線轉接至Web伺服器。
Web可能的效能瓶頸:頻寬、Server Pool、Thread Pool及資料庫
這樣的架構就決定了Web應用程式的效能特性。HTTP是一種無狀態(Stateless)的通訊協定。系統提供服務,是以成對的HTTP請求及HTTP回應為基本單位。所以,分析單一HTTP請求的執行路徑,可以了解和效能有關的因素有那些。
當HTTP請求從瀏覽器端被發送出來之後,會透過網路傳送至主機。接著主機上的HTTP伺服器,通常會透過獨立程序或獨立執行緒的方式,「伺服」此一請求。而這些獨立的程序或執行緒,概念上通常會利用「Server Pool」管理。
此時,HTTP伺服器上的伺服程序或執行緒,會再以HTTP的方式將所收到的請求,轉遞至Web伺服器。而Web伺服器通常也會利用獨立的執行緒「伺服」這個請求,而且同樣利用「Thread Pool」管理執行緒。Web伺服器上伺服請求的執行緒,便是執行Web應用程式的主要場域及載體。一般來說,Web應用程式多半會涉及到資料庫存取的動作,以實作出適宜的事務邏輯。
了解伺服HTTP請求的整個執行路徑之後,便可以藉此討論可能的瓶頸。可能的幾個限制包括:頻寬限制、Server Pool限制、Thread Pool限制及資料庫限制。
頻寬限制是網站對外的網路頻寬限制。倘若對外的網路頻寬消耗過大,就會影響到提供給用戶的效能表現。Server Pool的容量如果過小,那麼同時間能伺服的HTTP請求數就會很少。因此,Server Pool的容量倘若不夠大,便有可能形成效能的瓶頸。
這麼說起來,似乎將Server Pool的容量調得越大,就越能提供好的效能?不過,還有一個限制。當Server Pool設得越大,便會有越多的額外負擔產生:越多程序便會讓作業系統的Context Switch負擔加重,也會消耗更多的資源,例如記憶體空間。
因此,Server Pool的大小,必須視系統所擁有的資源而設定,同理可類推,Web伺服器的Thread Pool大小也具備相似的性質。最後,資料庫的限制:對資料庫同時進行太多的存取動作,一樣會導致效能低落。
|
|
| Web應用程式可能的效能瓶頸包括:頻寬限制、Server Pool限制、Thread Pool限制及資料庫限制。 |
以上4個部分,是Web應用程式可能發生效能問題的地點。當然,Web應用程式和一般的應用程式一樣,也可能出現處理器運算或檔案存取的效能障礙,但解決方法並沒有不同。
降低頻寬消耗方法1:檢討圖檔與JavaScript的設定
倘若透過效能量測的工具,發現效能的瓶頸發生在對外的頻寬。那麼,就必須降低由主機對外的頻寬消耗。這會需要由多方面一起努力。
首先要做的功課是審視網站對外輸出檔案的大小。你可以安裝一些用於網站偵錯工作的本地端Proxy(例如以Java寫成的Charles),或是使用FireFox可額外加裝的FireBug工具,以便了解瀏覽器所送出請求,以及取得回應的細節資訊。
最常發生的問題包括圖檔過大、內含太多不需要的JavaScript檔、未設定快取、過長的HTML及檔案未分流等原因。
圖檔過大的問題,其實透過降低所用的顏色數,或採用較高的壓縮比,都能夠在些微降低視覺效果的情況下,大幅減少檔案大小。
在Ajax當道的今日,許多程式人應用現成的AJAX Framework或JavaScript程式庫,提供更豐富多變的視覺效果及使用者體驗。但是,這些程式庫多半基於通用的考量,使得體積龐大。
即使有些網頁程式不用程式庫,但程式人可能疏於留意,在所有網頁上都將它們含括進來,使得使用者瀏覽每個網頁時,都得耗費許多時間下載,而這也同時迫使伺服器必須耗費頻寬。
降低頻寬消耗方法2:壓縮HTTP內容,可能省下90%的頻寬
HTTP協定中定義了伺服器端指示瀏覽器端進行內容快取的方式,所以適合快取的檔案,可以透過HTTP伺服器、Web伺服器,或甚至在網頁程式中,直接指定快取。
不過,程式人可能在JSP/ASP之類的網頁程式,輸出過長的HTML。由於這些網頁程式所產生的內容都是極為動態的,所以沒有辦法指示瀏覽器快取,以減少對頻寬使用的傷害。
有一個解決的方式可以處理,就是壓縮輸出的HTML內容。HTTP協定也考量到這一點,當瀏覽器告知伺服器支援壓縮(從HTTP請求的Accept-Encoding header)時,伺服器便可以對網頁內容進行GZIP之類的壓縮,並利用Content-Encoding的Header,告訴瀏覽器它所回傳的內容乃是經過壓縮的。
常見的Web伺服器都有內建壓縮的功能,只需設定即可。針對文字檔案的壓縮,功效頗大。我曾看過一個首頁60KB以上的網站,在壓縮後只剩下6KB左右的大小,幾乎都有接近10倍的效果。這意謂網站可以省下9/10的頻寬消耗。
降低頻寬消耗方法3:分流靜態檔案,鬆綁頻寬限制
許多網站是以主機代管的方式營運。這種情況下,頻寬的費用相對的高昂(起碼在臺灣如此)。但其實許多網站上提供的內容,並不一定要和主機放置在一塊。這些內容也許是靜態的圖檔或影片,並不倚靠任何動態邏輯產生,所以不見得需要放置在機房中,消耗那相較而言比較昂貴的頻寬。
事實上,有許多虛擬主機的服務(尤其是在美國),需要的費用都很低廉。倘若能夠將靜態的圖檔或影片,分流至機房外的虛擬主機,便可以讓輸入這些檔案的頻寬成本降低。
此外,某些ISP提供Reverse Proxy的服務,允許企業輕易地將內容發布到他們所提供的代理伺服器之上,不僅能將網路流量的消耗導到ISP端,透過Reverse Proxy自動取得主機內容的方式,更可以簡化發布方式。相較於另行採用外部虛擬主機的方式,可以說是輕鬆許多。
《作者簡介》王建興
清華大學資訊工程系的博士研究生,研究興趣包括電腦網路、點對點網路、分散式網路管理、以及行動式代理人,專長則是Internet應用系統的開發。曾參與過的開發專案性質十分廣泛而且不同,從ERP、PC Game到P2P網路電話都在他的涉獵範圍之內。
相關閱讀:
高效的系統開發要領(1)制定量化效能目標,作為調整基準
高效的系統開發要領(2)找出最關鍵的效能瓶頸
高效的系統開發要領(3)當瓶頸在運算量時,先從程式下手
高效的系統開發要領(4)當瓶頸在檔案存取時,善用快取
高效的系統開發要領(6)伺服器運用頁面快取,加速效果驚人
高效的系統開發要領(7)把關資料處理細節,效能過關很簡單
熱門新聞
2025-12-12
2025-12-16
2025-12-17
2025-12-15
2025-12-15
2025-12-16
