我之前在 iT邦幫忙 參加 it實戰經驗大募集 的活動,在 網站效能調校實戰經驗大募集,你有什麼精彩的調校經驗嗎? 的回答獲得了實戰王的獎賞(NT$ 1,000),而昨天有朋友問我怎麼都沒有發表這方面的文章,我才想說這篇文章應該也可以寫在我的部落格中,以下是完整的文章,不過大多是以條列式的方式呈現,牽涉的領域也很廣泛,各位僅供參考。
- 前端可採用 Squid 建置 Reverse Proxy Server 加速網站回應速度,且也能擴大每一台 Server 的網頁吞吐量(Throughput),不過網站的程式也需要送出適當的 HTTP Cache Header 跟 Reverse Proxy Server 做到充分搭配。流量大的網站也可以架設多台 Reverse Proxy Server 分流,除了可以用 Squid 之外,也可用 Nginx HTTP Server 做 Load Balance 或許多其他的 Reverse Proxy Server。除了用 Reverse Proxy Server 之外,也可以採用 Cluster 架構架設 Load Balancing 環境,向這類 Load Balancing 的商業產品一大堆,例如:F5, A10, Cisco, ... 都有,但免費的也很多,例如 Linux Virtual Server,而 Windows Server 2003 也有 Windows Cluster 與 Network Load Balance (NLB) 等機制。
- 徹底分離「靜態頁面/檔案」與「動態網頁」,妥善運用主機資源(CPU,Memory),主機也是有講究專業分工的,將個別主機負責的工作切割可有效提高網頁吞吐量與運行效率:
- 將靜態網頁/圖檔/Flash/JavaScript/CSS/...等,集中在特定幾台Web伺服器,這樣配置的主機資源利用率會更高,因為靜態頁面的CPU與Memory的資源消耗率低,純粹消耗頻寬而已,用專屬或小型的Web伺服器發送這些檔案可節省不少記憶體,且運作的效率也會比 Apache, IIS 這類多功能的 Web Server 來的效率還高,例如說:Nginx 或 TUX Web Server 或 Boa Webserver。
- 將動態網頁依照功能性與流量做水平分割或垂直分割,水平分割是指單一功能流量大,可採用 Load Balance 機制將主機負載分流,垂直分割是指依照單一服務拆分為多個子功能,每個功能配置獨立的主機專門提供此功能的相關資源運用與CPU運算。有個重點就是主機跟主機間、服務跟服務之間的關連性或耦合姓越低的話,網站架構的延展性(Scalability)越高,因為大型網站最需要的就是延展性,要讓網站經營突破甜蜜點(Sweet Point)時隨時可從 5 台主機擴充到 50 台而不用大幅修正網站架構與程式!
- 適度的使用多層快取(Cache)機制,從最前端的 HTTP Client Cache, Reverse Proxy Server 到 Server-side Cache 機制都要妥善規劃,才能達到最佳效能。
- 我有找到一篇介紹 HTTP Cache 的文章,寫的很棒,各位可以看看:Caching Tutorial - for Web Authors and Webmasters [ 用 Google Langage Tool 翻譯成中文的版本 ]
- 關連式資料庫的規劃架構尤其重要,除了可以採用叢集(Cluster)架構架設資料庫主機外,流量真的很大也可以採用資料庫分割的技巧,而資料庫分割技術也有分「水平分割」與「垂直分割」。
- 水平分割只指將一個資料庫中的表格拆分在不同的資料庫主機中,以分散資料量、降低資料庫伺服器負擔。
- 垂直分割就更複雜了,將「同一個表格的資料」拆分到不同資料庫伺服器中,這大概要到千萬流量才會用到這種架構吧,這時你可能要自行規劃演算法將資料拆分或資料搬移。
- 分析出主機的效能瓶頸是出在 IO 問題、CPU 問題、還是 Memory的問題。
- IO 問題:將部分 IO 改用 Memory 做快取(Cache),或看是否有辦法將檔案存取優化,若單一主機的 IO 優化已經到了極限,可改採 NAS 或 SAN 解決方案。
- CPU 問題:檢查程式的寫法是否有改善的空間,或是因為網站的 Exception 問題太多、或是 GC (Garbage Collection) 執行過於頻繁所致。
- Memory 問題:看是否是程式寫不好導致 Memory leak 的問題(通常是這樣),若無法再調校就加 RAM 吧,當然是越大越好摟,建議採用 64bits 的作業系統,對大量記憶體支援度較好。
- 要進行效能調校一定要先進行「效能檢測」或「壓力測試」,我也曾經寫了一篇使用 ApacheBench 工具進行壓力測試的文章,這應該是最「低級」的壓力測試方法了,只能測試單點功能的效能,無法測出整體網站的運作效能,但有興趣的人可以參考一下:使用 ApacheBench 進行網站的壓力測試。