本文來源:http://www.cnblogs.com/chenkai/archive/2009/11/07/1597795.html
前言
最近幫朋友運營的平台進行了效能調優,效果還不錯,所以寫出來一起交流一下。如果本文中有您覺的錯誤的,或者不明白的,請加QQ群:4656272,歡迎指正和一起探討。(ps:鄙人文筆很差,看官請多擔待)
背景
朋友的平台網站屬於垂直型的資訊社區網站,原先是用ASP.NET 1.0開發的,後來升級到ASP.NET 2.0,資料庫為SQL SERVER 2000,作業系統為windows 2003 server,兩台伺服器,一台WEB伺服器,一台資料庫伺服器。目前大概有80幾萬的使用者帳戶,有30多萬條文章和200多W條文章。隨著資料量的增 長,負載也越來越大,經常出現無法訪問,訪問出錯或訪問緩慢的情況。
解決
因為已經處於生產環境下,所以進行效能調優的前提是不影響現有的業務運行,可以進行無縫部署,如果出現問題可以迅速回退恢複。所以我準備分幾次來做調優,這樣比較穩妥的進行效能提升而不影響正常的業務運行。
第一步 運行環境調優
這一步很重要,在一個健康穩定的環境下,才能發揮平台最大效能表現,所以先給平台提供一個健康穩定的環境。
1 ASP.NET 環境調優
按照 《10 ASP.NET Performance and Scalability Secrets》http://www.tech-q.cn/thread-63-1-2.html裡面所講到的調優方法,經過跟開發人員的討論,減少了一些ASP.NET中不必要的MODULE,最佳化了一些設定檔。
2 IIS環境調優
減少了IIS中的不必要的ISAPI載入,精簡了IIS訪問日誌的格式,設定了IIS中針對圖片檔案,JAVASCRIPT,CSS等檔案的內容到期,啟用了IIS的GZIP壓縮功能,按照http://support.microsoft.com/kb/922703/這篇文章,做了ETAG設定,以提高HTTP請求效能,根據實際情況對IIS的應用池進行設定調優。
3 SQL SERVER調優
將 SQL SERVER 2000 升級到 SQL SERVER 2005,按照《最佳化SQL Server 2000的設定》http://www.tech-q.cn/thread-1412-1-1.html 裡面講到的結合實際情況進行設定,並修改記憶體佔用。我的建議:如果是單獨的資料庫伺服器,那麼儘可能的讓SQL SERVER佔用最多的記憶體。
經過第一步的調優,效能有所提升,體現在無法訪問或者訪問出錯的情況減少了。所以開始進行第二步。
第二步 收集資料 找到平台效能弱點
根據IIS的訪問日誌,我做了一個24小時採樣。找出了其中10個訪問最多的頁面和10個回應時間比較長的頁面。根據MSDN《應用Profiler最佳化SQL Server資料庫系統》http://www.microsoft.com/china/msdn/library/data/sqlserver/Profiler.mspx?mfr=true所說的方法,找到其中執行次數最多的10條SQL語句和執行時間比較長的SQL語句。提供給開發人員,並給出建議進行最佳化。
(一) 前端最佳化
其中訪問最多的頁面都是文章最終頁和文章最終頁,這時我祭起目前已知最好的用戶端調試工具FIREBUG,按照《初識Firebug 全文 — firebug的使用》http://www.tech-q.cn/thread-686-1-2.html 和《34條網站加速方法》http://www.tech-q.cn/thread-680-1-2.html所講的進行最佳化。其中主要包括:
a) 將最終頁用DIV+CSS進行重構,合理的設定有效期間,加快用戶端下載和瀏覽器DOM引擎渲染和呈現的速度。
b) 因為平台用了JQUERY庫,直接引用GOOGLE上的JS檔案,減少傳輸位元組和串連數,提高訪問速度。
c) 將JS和CSS進行壓縮,和圖片動畫檔案放到單獨的網域名稱下,如http://images.xxx.com, 因為老的瀏覽器針對一個網域名稱限制了2個並發串連,採用這個方法可以解決,注意在這個網域名稱下設定有效期間。
d) 關閉不必要的ASP.NET中的VIEWSTATE,減少傳輸位元組。
(二) 平台系統最佳化
通過最多的10條SQL語句和執行時間比較長的SQL語句中發現,很多都是因為文章頁最終頁和文章最終頁更新訪問次數這種類似的更新引起的,起先是想加一台伺服器來做SQL SERVER的鏡像分發,插入、更新、刪除全在一台上操作,另外一台機器只能做查詢操作。
但是這樣增加的伺服器只能做資料庫伺服器,並且系統上更改比較大,不是最好的方案。經過考慮,既然是更新的資料操作不需要即時,那麼加一台伺服器用 CENTOS 5.x,裝上memcached,做累加式更新,而且那台伺服器剩下的資源可以做其他事情,實現思路是先更新到memcached中,如果發現更新數達到一 個闕值了,一次性更新到資料庫。平台的會員線上狀態,從資料庫也更改到了memcached中。
為了提高DAO層的效能,我建議他們的開發使用NHIBERNATE這個成熟的資料庫應用程式框架,使用了資料庫連接池,提高資料庫連接的重用性。
其中執行時間比較長的SQL語句是因為模糊查詢引起的,這時候增加的伺服器就又用到了,在上面裝上了 lucene,將資料庫的需要查詢的資料,提交到lucene中,搜尋全部放到lucene中去做,具體的這裡就不追溯了,有興趣的可以在這裡http://www.tech-q.cn/forum-19-1.html 找到相關資料。
經過第二步改造,效能提升到一個新的階段。無法訪問,訪問出錯或訪問緩慢的情況已經很少出現了。
但是最佳化時無止境的,而且目前的情況只適合目前這個訪問情況,等訪問量再增加到現在的幾倍後,還會出現問題,所以我準備下一步最佳化。
第三步 架構最佳化
在這裡,我將新上的伺服器再次利用上,安裝了SQUID快取服務器,經過調優後再次提高負載能力,並在SQUID前面安裝了NGINX,充分利用NGINX的使用EPOLL特性,並把前面設定的http://images.xxx.com/移動到nginx下面。其中NGINX,SQUID,MEMCACHED安裝配置的過程就不贅述了,http://www.tech-q.cn/forum-10-1.html這邊有很多,也可以加QQ群:4656272,來討論。
其他
在分析日誌的過程中,發現很多訪問時由於搜尋引擎的蜘蛛產生的,而由於此平台的文章最終頁沒有靜態化,所以引起了很多不必要的資料庫連接。我採取了以下方法:
1 合理的設定robots.txt,對於未知的或者不受歡迎的蜘蛛,在nginx中根據其agent直接rewrite到一個靜態頁面。
2 根據請求,產生靜態頁產生HTML。
至此此平台的效能有了明顯提升,無法訪問,訪問出錯或訪問緩慢的情況再也沒出現過。