由於程式人通常會在Web伺服器之前配置HTTP伺服器,藉以提供更穩定的HTTP連線處理能力。此類的HTTP伺服器幾乎都透過Pooling的機制,管理提供HTTP服務的程序或執行緒,而和Pooling有關的幾個參數,都必須適宜的設定,以匹配系統的特性。

幾個Pooling機制可調整的參數
基本上,此類的Pooling機制,都會有幾個概念上類似的參數。以Apache httpd的prefork模組為例,即有StartServer、MinSpareServers、MaxSpareServers、ServerLimit及MaxClients等值得探討的參數,而其他的HTTP伺服器多半都有類似的參數,只不過是名稱與設定方式有所差異。

以StartServer來說,它是系統啟動時在Pool中已預先建立好的服務程序(Server)數。當你的網站使用者時常都保持在較高的數目時,可以想見的,會需要較大的StartServer。每當系統重新啟動時,由於使用者大量湧進,倘若未將此數值設定得較大,Pool中的服務程序數不足以處理,便會需要花費時間建立全新的服務程序,以滿足大量使用者的請求。這麼一來,使用者在系統重啟時,便會需要花費一段時間,才能連接上網站,這自然會影響到網站的服務品質。

而MinSpareServers代表的是Pool中至少保留的閒置服務程序數。假若這個數字設得太小,當流量突然湧入時,同樣會造成Pool得多花時間建立新的服務程序。但這個數字如果設得過大,又會有浪費資源的問題,因為容易造成Pool中保有過多閒置、耗費系統資源,卻又派不上用場的服務程序。

MaxSpareServers則是約束Pool中閒置之服務程序數的設定。當Pool的管理機制發現,Pool中的閒置服務程序數逾越了這個數字,此時,便會開始「收拾」過多的閒置服務程序,以使這些程序保持在MinSpareServers與MaxSpareServers之間。

ServerLimit設定的是MaxCients的上限,而MaxClients所代表的意義,則是同時間能處理的用戶端請求數。很明顯的,這個數字和網站的最大同時線上人數息息相關。因此,設定上必須依據網站尖峰時間的同時線上人數。同樣的,這個數字過大會浪費資源,過小則會拉長使用者的等待時間。

除了HTTP伺服器的Pool需要設定之外,Web伺服器也具備了處理HTTP連線的Pool。這些調整設定的概念與HTTP伺服器類似,而各家伺服器亦各自有各家專門的調校技巧,於此便不多加贅述。

靜態內容可於用戶端運用頁面快取
在妥善設定好HTTP伺服器及Web伺服器的相關效能參數後,再介紹一個有用的技巧,就是Page Cache。儘管程式人可以利用HTTP協定中定義的快取機制,讓瀏覽器將靜態的內容,例如圖片影像快取在用戶端,避免消耗頻寬。但這樣的快取方式,只對靜態內容有效,對於由網頁程式動態產生的內容(例如動態網頁)便不能起作用。

快取動態網頁是風險很高的動作。因為倘若針對動態網頁快取,意謂著若使用者透過代理伺服器(Proxy)時,代理伺服器也有可能將它快取,導致同一個代理伺服器的使用者,因為檢視的網頁網址相同,所以看到了相同的內容,將因此引發安全性的問題。

此外,這樣的快取機制,是針對用戶端,但一般網站上,使用者的平均檢視頁面數多半只有幾十次,而且有很多網站,甚至都在10次以下,何況使用者所檢視的頁面還多半不重複,這表示在用戶端快取頁面的成效並不大。

於網站伺服器運用頁面快取,可大幅節省重新產生頁面的成本
但是,倘若這頁面快取的機制是運作在網站伺服器端,它的效果就大大不同了。頁面的快取有一個很重要的目的,就是節省系統重新產生頁面的成本。因為所有的動態頁面,都是由網頁程式(JSP/PHP/ASP)依據事務邏輯動態執行所產生的。倘若能對動態頁面進行快取,那麼這些事務邏輯便毋需執行,進而減少執行網頁程式的時間,同時省去連帶的相關資源消耗(例如資料庫存取)。這對系統的效能自然會有很大的改善。

以Yahoo!這樣的大型入口網站為例,它的首頁有很大的比例,像是頭條新聞、服務列表等,是所有的使用者共用的。倘若每個使用者在每次造訪時,系統都重新產生頁面的內容,那麼以Yahoo!所提供的服務規模,肯定會耗去極多的計算資源。

但是,如果針對這些變動性不大、對每個使用者來說都一樣的頁面內容,在產生之後就快取起來,之後當各個使用者需要這段頁面內容時,直接從快取中取得,毋需再重新執行網頁程式。這麼一來,便能大大減少程式的執行負擔,而且速度更快。

記憶體快取適合存取頻繁且共用性高的內容
整體而言,伺服器端的頁面快取,相較於用戶端的頁面快取,有以下諸多優點:

● 控制靈活:伺服器端可以依據各種動態的決策,決定刷新頁面快取的內容(例如不同頁面的不同更新周期,或是已經知道資料已有所變動時,主動更新快取)。

● 安全控制:伺服器端上的快取,不致於讓有安全考量的頁面遺留在代理伺服器或用戶端的電腦。

● 成效更大:因為伺服器端的頁面快取能夠被多個(甚至是全體)使用者所共用,無論有多少個使用者檢視該頁面,都只需要一段時間後重新產生一份頁面內容即可,所以快取所帶來的好處,遠大於用戶端的頁面快取。

程式人可以選擇以檔案的方式實作頁面快取,也可以考慮將頁面快取放置到主記憶體中。由於HTTP伺服器以I/O的方式直接輸出檔案,過程中都經過最佳化,所以速度很快。

但如果只是將大部分的頁面內容快取,而少部分內容仍是個人化時,放置到主記憶體中是較佳的選擇,因為這使得程式人可以輕易地組合大眾共用及個人使用的頁面內容。

另外,由於主記憶體容量多半受限,當需要快取的頁面內容很多時,使用檔案做為快取的媒介則比較適合,主記憶體只適合儲存頻繁存取且共用性高的內容。

利用快取伺服器省掉自行開發的苦工
談到了快取,下回我們繼續探討資料庫內容的快取。但是,無論是對資料庫的快取或頁面內容的快取,都會需要有個快取的機制。程式人當然可以自行實作自己的快取(無論是在檔案或主記憶體中),但是其實坊間已經有許多高效而且穩定的快取伺服器可用,有些語言的應用程式平臺,甚至支援頁面快取的模組,例如RoR的Page Cache。

所謂的快取伺服器,便是專職快取的伺服器。程式人可以透過一個既定通訊協定下的API(Application Programming Interface,應用程式開發介面),連接至快取伺服器,操作相關的快取動作。這意謂採用此類伺服器,便不需要自行實作快取機制,只需利用現成的API。

有些伺服器甚至具備分散式存取的能力。這表示當網站主機數量多於一臺時,即便是將這些主機叢集(Cluster)起來,一樣能夠獲得各主機共用的一份快取,避免資源的重複與浪費。例如像最近聲名大噪的Facebook,它就採用了高達兩百臺以上的Memcached(相當著名的快取伺服器)做為快取伺服器,為數實在驚人。

《作者簡介》王建興
清華大學資訊工程系的博士研究生,研究興趣包括電腦網路、點對點網路、分散式網路管理、以及行動式代理人,專長則是Internet應用系統的開發。曾參與過的開發專案性質十分廣泛而且不同,從ERP、PC Game到P2P網路電話都在他的涉獵範圍之內。

相關閱讀:
高效的系統開發要領(1)制定量化效能目標,作為調整基準
高效的系統開發要領(2)找出最關鍵的效能瓶頸
高效的系統開發要領(3)當瓶頸在運算量時,先從程式下手
高效的系統開發要領(4)當瓶頸在檔案存取時,善用快取
高效的系統開發要領(5)努力瘦身,輕鬆通過對外頻寬的瓶頸
高效的系統開發要領(7)把關資料處理細節,效能過關很簡單

熱門新聞

Advertisement