不論是電子商務網站,或是應用程式導向網站,甚至僅僅是企業形象網站,都有可能面臨種種效能的問題,iT邦小財神在這裡要募集各位邦友們的實戰經驗。
在你經手過的網站中,曾經發生過哪些狀況,讓你必須去調整網站效能的問題?你是從程式架構下手,還是調整硬體設備解決?還是有什麼更為精妙獨到的方法?
本題邀請的實戰專家是王建興先生,由他選出回答得最有參考價值、最精彩的「實戰王」,iT邦小財神將贈送1000元pchome線上購物金給這位獲選的最佳實戰經驗回答者。
另外,實戰專家也將挑選兩位認真回答的邦友,分別致贈IT書籍一本。
本題贈送的認真獎書籍是《ASP.NET AJAX應用剖析立即上手》(本次活動認真獎書籍由微軟贊助)。
本題最後回答時間訂於7/4(五),超過該日的回答均不列入評選名單。實戰專家將於7/6日選出「實戰王」,並公佈結果。
各位邦友們,快來亮出你們的實戰經驗吧~
我提供一些網站效能調校的經驗:
1.前端可採用 Squid 建置 Reverse Proxy Server 加速網站回應速度,且也能擴大每一台 Server 的網頁吞吐量(Throughput),不過網站的程式也需要送出適當的 HTTP Cache Header 跟 Reverse Proxy Server 做到充分搭配。
1.1. 流量大也可以架設多台 Reverse Proxy Server 分流,除了可以用 Squid 之外,也可用 Nginx Web Server 做 Load Balance 或許多其他的 Reverse Proxy Server。除了用 Reverse Proxy Server 之外,也可以採用 Cluster 架構架設 Load Balancing 環境,向這類 Load Balancing 的商業產品一大堆,例如: F5, A10, Cisco, ... 都有,但免費的也很多,例如 Linux Virtual Server。
2.1. 將靜態網頁/圖檔/Flash/JavaScript/CSS/...等,集中在特定幾台Web伺服器,這樣配置的主機資源利用率會更高,因為靜態頁面的CPU與Memory的資源消耗率低,純粹消耗頻寬而已,用專屬或小型的Web伺服器發送這些檔案可節省不少記憶體,且運作的效率也會比 Apache, IIS 這類多功能的 Web Server 來的效率還高,例如說:Nginx 或 TUX Web Server 或 Boa Webserver
2.2. 將動態網頁依照功能性與流量做水平分割或垂直分割,水平分割是指單一功能流量大,可採用 Load Balance 機制將主機負載分流,垂直分割是指依照單一服務拆分為多個子功能,每個功能配置獨立的主機專門提供此功能的相關資源運用與CPU運算。有個重點就是主機跟主機間、服務跟服務之間的關連性或耦合姓越低的話,網站架構的延展性(Scalability)越高,因為大型網站最需要的就是延展性,要讓網站經營突破甜蜜點(Sweet Point)時隨時可從 5 台主機擴充到 50 台而不用大幅修正網站架構與程式!
適度的使用多層快取(Cache)機制,從最前端的 HTTP Client Cache, Reverse Proxy Server 到 Server-side Cache 機制都要妥善規劃,才能達到最佳效能。
關連式資料庫的規劃架構尤其重要,除了可以採用叢集(Cluster)架構架設資料庫主機外,流量真的很大也可以採用資料庫分割的技巧,而資料庫分割技術也有分「水平分割」與「垂直分割」。
4.1. 水平分割只指將一個資料庫中的表格拆分在不同的資料庫主機中,以分散資料量、降低資料庫伺服器負擔。
4.2. 垂直分割就更複雜了,將「同一個表格的資料」拆分到不同資料庫伺服器中,這大概要到千萬流量才會用到這種架構吧,這時你可能要自行規劃演算法將資料拆分或資料搬移。
提供一個實務上的網站架構,前端用一台Layer 4 switch,後面接三台web server,之後再接一台DB,這個架構有下列的好處:
另外網頁AP應加入cache機制,避免太頻繁的DB query,造成效能的瓶頸!
多年前公司的商業網站是放在美國的某一個ISP,當時那個網站主要是負責產品資訊、試用下載、使用者註冊以及少少的網路購物。那個時候租用了4個機櫃空間,以及大約70Mb的頻寬。由於每個月的費用將近100萬台幣,同時頻寬也不夠用,算算要升級頻寬每個月要150萬,還看不到效益。主要原因是公司是一個國際上小有知名的公司,使用者遍及全球,光靠美國一地的網路不足以支撐全球存取的需求。
當時的想法是想要把網站擴散到其他的地區,像歐洲、亞洲,但是後來評估之後發現成本過高,並且有些設備重複投資,後續的維護成本超出預計。後來究暫時擱置。幾個月後我和幾家ISP的業務談到這件事,於是一個計劃開始浮出台面。
我公司的網站算是多層架構,第一層是WEB,第二層是AP server當時用的是Cold Fusion,後面才是DB。另外資料流的部份以FTP最多約佔70%,其次是靜態網頁約佔20%,最後是AP的流量大概2%,其餘的是送廣告郵件的流量。
最後的計畫是這樣,由一家ISP出面幫我們談其他地區的網站空間以及頻寬,這部分是放靜態網頁及FTP的DATA。同時ISP要負責F5的設備做全球的load balance。另一家ISP離公司比較近的就負責我們AP server的網站代管以及AP的頻寬。這樣建置下來,就只有AP server有硬體設備,其餘的設備都是租用的。全部真正在管的設備只有一個機櫃。而總頻寬由70Mb暴升到175Mb,但是費用一個月只有75萬,帳面上節省的看起來是25萬/月,但實際上是25萬+1個人力費用5萬+設備攤提約15萬+設備維護約4.5萬+多的頻寬費用。同時效益提升不只一倍。
雖然之後加薪等等讓自己高興了好一陣子,但是最值得高興的是這樣子的一個專案是我提出來並且完成的。
把網站的網路連線全部換掉.使用傳統的網路電纜連線.再接一台新型網路調整流量的寬頻分享器.這可以加高每部電腦的網路使用量.一般平均計算.再加高網路設備.請參考.WATER.0911115854.( macosorawater@pchome.com.tw ). http://www.macosorawater.pchome.com.tw .小禮.Thanks. 11111111 .
我的web server總共有四部windows 2003架設的,但是是在上面架設apache. 資料是透過NAS放在第三、四台SERVER作成的cluster架構,確保資料放置資料的伺服器任何一台故障的時候伺服器仍然能夠正常運作。
為了存取資料的順暢,我將四台web server加入一個AD Domain中,可以避免透過nas架構讀取資料時候產生錯誤。也可以避免來自網域外的電腦不正常的存取資料。
第一二台伺服器上面使用的是 apache的web server可以執行php程式。而兩者則透過microsoft 的 NLB建立起Loading Balance架構也可以避免單點伺服器存取過量。
apache在windows下長時間執行時候會有記憶體無法正常釋放的問題,php程式會出現memory buffer錯誤的訊息。解決方法是在離峰時間讓不同的伺服器分別重新啟動。而因為有nlb的架構與cluster的架構搭配使用 基本上外部使用者感受不到伺服器的中斷。
apache在windows下執行的時候不像在 linux下有良好的 rotatelog機制,目前網路上面找到的幾個機制長時間執行時候都會發現記憶體一直鎖定沒有正常釋放。所以我就利用前項說明的重開機時間寫一個批次檔將現在執行的log檔案 move成為另外一個檔案。這樣可以避免伺服器上面的log檔暴增而使主機停止服務。
真正LOg的部份則透過Google Analytics的協助來分析流量。