﻿# 網站效能調校經驗談

我之前在 [iT邦幫忙](http://ithelp.ithome.com.tw/) 參加 it實戰經驗大募集 的活動，在 [網站效能調校實戰經驗大募集，你有什麼精彩的調校經驗嗎？](https://ithelp.ithome.com.tw/questions/10005261) 的回答獲得了實戰王的獎賞(NT$ 1,000)，而昨天有朋友問我怎麼都沒有發表這方面的文章，我才想說這篇文章應該也可以寫在我的部落格中，以下是完整的文章，不過大多是以條列式的方式呈現，牽涉的領域也很廣泛，各位僅供參考。

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