最近幫朋友運營的平臺進行了性能調優,效果還不錯,因此寫出來一塊兒交流一下。若是本文中有您覺的錯誤的,或者不明白的,請加QQ羣:4656272,歡迎指正和一塊兒探討。(ps:鄙人文筆不好,看官請多擔待)html
背景
朋友的平臺網站屬於垂直型的資訊社區網站,原先是用ASP.NET 1.0開發的,後來升級到ASP.NET 2.0,數據庫爲SQL SERVER 2000,操做系統爲windows 2003 server,兩臺服務器,一臺WEB服務器,一臺數據庫服務器。目前大概有80幾萬的用戶賬戶,有30多萬條文章和200多W條帖子。隨着數據量的增加,負載也愈來愈大,常常出現沒法訪問,訪問出錯或訪問緩慢的狀況。前端
解決
由於已經處於生產環境下,因此進行性能調優的前提是不影響現有的業務運行,能夠進行無縫部署,若是出現問題能夠迅速回退恢復。因此我準備分幾回來作調優,這樣比較穩妥的進行性能提高而不影響正常的業務運行。nginx
第一步 運行環境調優
這一步很重要,在一個健康穩定的環境下,才能發揮平臺最大性能表現,因此先給平臺提供一個健康穩定的環境。
1 ASP.NET 環境調優
按照 《10 ASP.NET Performance and Scalability Secrets》http://www.tech-q.cn/thread-63-1-2.html裏面所講到的調優方法,通過跟開發人員的討論,減小了一些ASP.NET中沒必要要的MODULE,優化了一些配置文件。sql
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佔用最多的內存。
通過第一步的調優,性能有所提高,體如今沒法訪問或者訪問出錯的狀況減小了。因此開始進行第二步。windows
第二步 收集數據 找到平臺性能弱點
根據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。
至此此平臺的性能有了明顯提高,沒法訪問,訪問出錯或訪問緩慢的狀況再也沒出現過。