咨詢電(diàn)話(huà):023-88959644    24小(xiǎo)時(shí)服務熱線:400-023-8809
NEWS CENTER ·
新聞動态
關注中技(jì)互聯 關注前沿

網站(zhàn)性能越來(lái)越差怎麽辦?對網站(zhàn)優化有(yǒu)什麽影(yǐng)響!該怎麽改進

發表日期:2011-01-29    文章編輯:王東    浏覽次數(shù):9    标簽:

新的一年裏你(nǐ)的老闆或客戶是否曾和(hé)你(nǐ)抱怨公司的網站(zhàn)性能愈來(lái)愈差?網站(zhàn)開(kāi)發很(hěn)多(duō)人(rén)都會(huì)的,現在的社會(huì)技(jì)術(shù)人(rén)員是不缺的,但(dàn)同樣的一個(gè)畫(huà)面,背後的性能卻可(kě)能是天差地遠,更惶論多(duō)人(rén)同時(shí)上(shàng)線的企業網站(zhàn),而程序員的身價也因此有(yǒu)所差别。本文提供一些(xiē)改善網站(zhàn)性能的點子,從硬件、軟件、程序技(jì)巧的層面都有(yǒu),也歡迎大(dà)家(jiā)分享自己的經驗或秘技(jì)。

又是新的一年,在此建站(zhàn)學全體(tǐ)編輯人(rén)員提前給您拜年了

新的一年裏你(nǐ)的老闆或客戶是否曾和(hé)你(nǐ)抱怨公司的網站(zhàn)性能愈來(lái)愈差?網站(zhàn)開(kāi)發很(hěn)多(duō)人(rén)都會(huì)的,現在的社會(huì)技(jì)術(shù)人(rén)員是不缺的,但(dàn)同樣的一個(gè)畫(huà)面,背後的性能卻可(kě)能是天差地遠,更惶論多(duō)人(rén)同時(shí)上(shàng)線的企業網站(zhàn),而程序員的身價也因此有(yǒu)所差别。本文提供一些(xiē)改善網站(zhàn)性能的點子,從硬件、軟件、程序技(jì)巧的層面都有(yǒu),也歡迎大(dà)家(jiā)分享自己的經驗或秘技(jì)。


(1) 重新調整或重新設計(jì) DB schema、索引 (index)

一個(gè)在線系統的性能不佳,主要原因都是來(lái)自于數(shù)據庫規劃及 SQL 語句層面,至于 .NET 程序撰寫不良都還(hái)在其次。

先将數(shù)據庫适度地做(zuò)正規化,如:一個(gè) Table 中,避免把常用的字段、很(hěn)少(shǎo)用的字段,都塞在同一個(gè)表中,而影(yǐng)響數(shù)據掃描的速度。
應該将很(hěn)少(shǎo)用的字段,另切割出來(lái)成為(wèi)另一個(gè)表。

 

----------------------------------------------

(2) 改寫 SQL 語句,注意 index 是否在查詢時(shí)有(yǒu)真的被用到

* 同樣的功能,一個(gè)不良的「關聯子查詢」和(hé)良好的「獨立子查詢」,之間(jiān)的 SQL 性能差距,是不到一秒(miǎo)鍾和(hé)好幾分鍾以上(shàng)的差距。

* 一些(xiē) SQL 關鍵詞,隻要一出現在 SQL 語句中,就可(kě)能造成表的「索引 (index)」完全失效或部分失效,變成要整個(gè)表去逐行(xíng)逐列地掃描,
例如: NOT、NOT IN、!=、<>、OR ...等關鍵詞,
還(hái)有(yǒu)「LIKE '%關鍵詞'」的模糊查詢,也會(huì)造成索引失效,但(dàn)「LIKE '關鍵詞%'」就不會(huì)造成索引失效。

 

----------------------------------------------

(3) 使用 Native 的 DataProvider

放棄 OleDb,改用 ADO.NET Native 的 DataProvider,如: SqlClient、OracleClient。但(dàn)若您公司堅持要用 Sybase 這種從 2003 年之後,就不曾更新 DB driver 的數(shù)據庫,就隻好繼續用性能不佳的 OleDb 去聯機了。

據版工我用 Visual Studio 內(nèi)建的 stress test 工具,測試 OleDb 和(hé) SqlClient 的性能差距,模拟 30 人(rén)同時(shí)上(shàng)線,用浏覽器(qì)撷取一萬筆數(shù)據,兩者的速度就差了一秒(miǎo)鍾;且當數(shù)據庫的數(shù)據越多(duō),或越多(duō)人(rén)同時(shí)上(shàng)線時(shí),性能差距會(huì)更明(míng)顯。

----------------------------------------------

(4) 用程序或軟件做(zuò)緩存

用程序做(zuò)緩存,如 ASP.NET 從 1.x 時(shí)代,就已內(nèi)建的 Cache (緩存) 機制(zhì);或用一些(xiē)第三方的輔助軟件、Framework,這方面若有(yǒu)其它網友(yǒu)知道(dào)好用的軟件,亦懇請(qǐng)留言告知。

----------------------------------------------

(5) 用硬件做(zuò)快取或緩沖、砸錢(qián)加裝 AP Server

ITHome - 遊戲基地網頁效能提升的關鍵人(rén)物

 

以下引用自原文:

種種缺失使得(de)網站(zhàn)的使用人(rén)數(shù)銳減。面對網站(zhàn)一堆問題,陳xx也決定要将網站(zhàn)再次大(dà)幅度調整,将之前的網頁程序,以及 SQL 查詢語句全部重寫,他們花(huā)了三個(gè)月的時(shí)間(jiān)執行(xíng)。

陳xx還(hái)在原本的網頁服務器(qì),與數(shù)據庫服務器(qì)的架構中,加入一組應用程序服務器(qì),作(zuò)為(wèi)網頁服務器(qì) cache 數(shù)據的來(lái)源。

改版之後的新網站(zhàn),搜尋速度提升許多(duō),先前每日的統計(jì)數(shù)據中,處理(lǐ)速度超過 3 秒(miǎo)的數(shù)據超過 50 萬筆;而改版後,每星期超過 3 秒(miǎo)的查詢不到 10 筆,而這少(shǎo)數(shù)反應速度不夠快的查詢,也多(duō)是內(nèi)部作(zuò)業執行(xíng)大(dà)量批處理(lǐ)導緻的。

由于原本使用的 L4 Switch 較為(wèi)老舊(jiù),負載量比較差,因此陳xx選擇将它汰換新的設備,加強負載量;恰好那(nà)時(shí)正好準備将應用服務器(qì)的架構上(shàng)線,就藉此機會(huì)将網絡架構更新。陳xx說,這樣的架構搭配負載較強的 L4 交換器(qì),強化網站(zhàn)的處理(lǐ)性能,并憑借此抵禦網絡攻擊。在此之後,網站(zhàn)依然會(huì)受到零星攻擊,但(dàn)都不會(huì)對造成太大(dà)影(yǐng)響。

----------------------------------------------

(6) 用硬件做(zuò)快取或緩沖、砸錢(qián)加裝 AP Server

數(shù)字之牆 - 網站(zhàn)外銷的個(gè)人(rén)實踐(二)運營

 

以下引用自原文:

全盛時(shí)期,來(lái)自美國 blog 的流量每天達 80 萬次。這個(gè)數(shù)字其實不高(gāo),對程序高(gāo)手來(lái)說是小(xiǎo)菜一碟,但(dàn)筆者是半吊子工程師(shī),知識有(yǒu)限也因此可(kě)能程序寫得(de)不好,頻頻被主機供貨商發信警告,要求改善網站(zhàn)系統性能。最後,我決定開(kāi)發 cache system。

cache system 緩存系統上(shàng)線後,将數(shù)據庫讀寫,從每天 80 萬次降低(dī)到每天 16 萬次。這期間(jiān)也請(qǐng)高(gāo)手朋友(yǒu)幫忙進行(xíng)數(shù)據庫結構優化,幫助很(hěn)大(dà)。筆者在過程中學習到,一個(gè)良好的「緩存系統 (cache system)」對于提供 Widget 功能的網站(zhàn)來(lái)說非常重要。

&hellip;中間(jiān)略…

能夠做(zuò)到随時(shí)搬遷整個(gè)網站(zhàn)到另一家(jiā)主機供貨商,除了程序本身的調整外,還(hái)要歸功于網站(zhàn)管理(lǐ)軟件的盛行(xíng)。在此要推薦的一套稱為(wèi) Plesk 的網站(zhàn)管理(lǐ)軟件。有(yǒu)的主機供貨商會(huì)直接幫你(nǐ)安裝 Plesk ,免費或另外付費。 Plesk 的所有(yǒu)管理(lǐ)功能都是透過 Web 界面,方便到無以複加,大(dà)大(dà)降低(dī)對技(jì)術(shù)能力的要求。

除了 Plesk 以外,網站(zhàn)管理(lǐ)軟件還(hái)有(yǒu)其它選擇。還(hái)有(yǒu) WHM 加上(shàng) cPanel 的組合,也是常見的網站(zhàn)管理(lǐ)解決方案。不過筆者還(hái)是比較偏好使用 Plesk,畢竟使用起來(lái)容易,也難怪他們的市場(chǎng)占有(yǒu)率一直是獨大(dà)。隻是,功力高(gāo)的工程師(shī)可(kě)能會(huì)喜歡 WHM + cPanel,因為(wèi)彈性比較大(dà)。不論選擇哪一種,都可(kě)以幫助你(nǐ)節省許多(duō)時(shí)間(jiān)。

----------------------------------------------

(7) 加裝實體(tǐ)機器(qì)做(zuò) Loading Balance (負載平衡)。一些(xiē) Server OS 亦內(nèi)建此類設定功能。

----------------------------------------------

(8) 程序技(jì)巧 - ADO.NET

能用 DataReader 就不要用 DataSet / DataTable,前者讀取速度快又不耗內(nèi)存;後者雖較有(yǒu)彈性,但(dàn)速度較慢又會(huì)每個(gè)使用者消耗許多(duō)內(nèi)存。若您連 DropDownList 控件的數(shù)據來(lái)源,都用 SqlDataSource 控件的默認值 - DataSet,則當頁面裏塞了一堆下拉選單時(shí),性能當然會(huì)受影(yǐng)響。

但(dàn)前提是程序員對 ADO.NET 要有(yǒu)一定程度的了解,若隻會(huì)用 Visual Studio 透過圖形界面,拖拉 TableAdapter、DataTable、.xsd 就免談了。

若為(wèi) DataTable 建立 Primary Key,DataTable 會(huì)建立一個(gè)索引,追蹤新增到 DataTable 中的數(shù)據是否符合此條件約束 (constraint)。ADO.NET 2.0 會(huì)使用 algorithm 的「紅黑(hēi)樹(shù)算(suàn)法 (Red-Black Tree,是一種「平衡樹(shù)」算(suàn)法) 去處理(lǐ)索引,讓 DataTable 的數(shù)據量大(dà)時(shí),較方便維護索引;但(dàn)缺點是建立索引時(shí)會(huì)降低(dī)一些(xiē)性能。


此外,數(shù)據庫的訪問和(hé)撈值,應該盡量在一次 DB connection 做(zuò)完,一個(gè) connection 可(kě)搭配多(duō)個(gè) DbCommand 對象使用,不用每次都一個(gè) DbConnection 配一個(gè) DbCommand。

 

----------------------------------------------

(9) 程序技(jì)巧 - .NET 語法

* 避免一些(xiē)書(shū)上(shàng)教的,把 DataTable 或大(dà)量數(shù)據,直接塞進 Session 裏,此舉在真正要上(shàng)線的系統必死無疑。Session 在多(duō)人(rén)同時(shí)上(shàng)線時(shí),內(nèi)存的消耗是很(hěn)可(kě)觀的,因為(wèi) Session 是每個(gè)用戶各存一份在服務器(qì)的內(nèi)存裏,而非像「緩存 (cache)」是所有(yǒu)的用戶共享服務器(qì)的一塊內(nèi)存。在很(hěn)多(duō) ASP.NET 的需求中,可(kě)用 HiddenField 控件或  ViewState 取代 Session。

* 能用「泛型 (Generics)」就不要用舊(jiù)版的寫法,Generics 除了安全外,亦可(kě)避免 .NET 類型在 Boxing / Unboxing 轉型時(shí)影(yǐng)響性能,例如:
能用 List<string> 就不要用舊(jiù)的 ArrayList,能用 Dictionary<TKey,TValue> 就不要用 Hashtable 或跑雙層的循環 (loop),因 ArrayList、Hashtable 的 element 屬于 object 類,在存儲或檢索如 int 等「值類型 (Value Type)」時(shí),會(huì)引發 Boxing / Unboxing。
在大(dà)多(duō)數(shù)的情況下,List、Dictionary 等泛型類,擁有(yǒu)較佳的效率,而且是類型安全的。

當然上(shàng)述前提,是系統要用 .NET 開(kāi)發,還(hái)在靠 ASP 或非 OOP 語言硬撐的舊(jiù)系統就免談了。

 

----------------------------------------------

(10) 程序技(jì)巧 - 數(shù)據庫「事務 (Transaction)」

您是否知道(dào) SQL Server 的默認「事務隔離等級 (Isolation Level)」,是「ReadCommitted」,當您在寫 ADO.NET 用了 SqlTransaction 時(shí),默認是當某個(gè)人(rén)在修改某一筆記錄時(shí),其它所有(yǒu)讀取這一筆記錄的人(rén),都會(huì)被「鎖定 (lock)」住,造成其它全部用戶的浏覽器(qì)都在等待中,無法做(zuò)其它工作(zuò)。

而 Oracle 事務的特性,是絕不會(huì)有(yǒu)類似無法讀取的情形,至少(shǎo)會(huì)用類似 SQL Server 2005 新增的「快照隔離 (Snapshot Isolation)」,讓用戶至少(shǎo)能先讀取到未 Commit 或 Rollback 的記錄,而不用呆坐(zuò)在浏覽器(qì)前面傻等。

不過 SQL Server 2005 的「快照隔離」默認未啓用。用 SQL Server 開(kāi)發的系統,若怕用戶被鎖定的問題,可(kě)視(shì) project 需求,改用最寬松的「ReadUncommitted」事務隔離等級,其特性為(wèi)不會(huì)造成任何鎖定,但(dàn)可(kě)能會(huì)造成 Dirty Read。SQL Server 有(yǒu)下列七種「事務隔離等級」,有(yǒu)興趣的網友(yǒu)可(kě)去查詢 ADO.NET 書(shū)籍或 MSDN Library:

Chaos
ReadCommitted  // SQL Server 默認值
ReadUncommitted // 最寬松,會(huì)有(yǒu) Dirty Read
RepeatableRead
Serializable    // 最嚴,會(huì)有(yǒu)大(dà)量的鎖定
Snapshot
Unspecified

 

----------------------------------------------

(11) ASP.NET 分頁

GridView + SqlDataSource 的默認行(xíng)為(wèi),就是每次換頁或排序時(shí),不管數(shù)據庫有(yǒu)幾筆記錄都全部重撈一次;當數(shù)據庫有(yǒu)一百萬筆數(shù)據,就在每個(gè)用戶換頁時(shí),都一百萬筆全部重撈出來(lái),此舉消耗了大(dà)量的 Web server/ AP server 內(nèi)存、數(shù)據庫系統資源、網絡頻寬,結果網站(zhàn)性能可(kě)想而知。

很(hěn)多(duō)企業內(nèi)的小(xiǎo)型網站(zhàn),為(wèi)了省錢(qián),随便外包給低(dī)價搶标的工作(zuò)室,或沒經驗的學生(shēng)和(hé) SOHO 族,可(kě)能因此埋下了恐怖的後遺症。最可(kě)怕的是這些(xiē)未爆彈,在開(kāi)發期間(jiān)和(hé)系統剛上(shàng)線、數(shù)據量還(hái)很(hěn)少(shǎo)時(shí),都感覺不出來(lái),有(yǒu)如癌症一樣,會(huì)在将來(lái)忽然爆發。

 

----------------------------------------------

 (12) ASP.NET AJAX 的 UpdatePanel 控件不是萬能的

以下引用自 MSDN Magazine:

不論好壞,UpdatePanel 控件都是 ASP.NET AJAX 社區(qū)所喜愛(ài)的。我說“好”,是因為(wèi) UpdatePanel 使部分頁面呈現變得(de)相當簡單,而說“壞”,是因為(wèi)它的簡便和(hé)易用性是以效率和(hé)令人(rén)啼笑皆非的帶寬為(wèi)代價的。

UpdatePanel 可(kě)以為(wèi)一般的網頁帶來(lái) AJAX 神奇的好處,但(dàn)是它不能提供我們與 AJAX 正常關聯的高(gāo)效性。例如,您是否知道(dào),當 UpdatePanel 控件對服務器(qì)執行(xíng)異步 AJAX 回調以更新其內(nèi)容時(shí),這個(gè)請(qǐng)求包含了常規 ASP.NET 回發所包含的一切,其中還(hái)包括 ViewState 呢?具有(yǒu)太多(duō) ViewState 的頁面會(huì)降低(dī)性能,并且具有(yǒu)太多(duō) ViewState 的頁面在 ASP.NET 應用程序中都太常見。

如果您準備使用 UpdatePanel 控件,您需要清楚您在準備幹什麽。在許多(duō)情況下,從性能的角度而言,應用程序最好是不使用 UpdatePanel,而是使用對 WebMethods 或頁面方法的異步調用。

…中間略…

當您使用 UpdatePanel 在一個(gè)頁面上(shàng)執行(xíng)無閃爍更新時(shí),您可(kě)能會(huì)認為(wèi)您在進行(xíng)高(gāo)效構建。畢竟,UpdatePanel 使用的是 AJAX,不是嗎?不幸的是,如果您在 UpdatePanel 更新時(shí)檢驗一下網絡中的通(tōng)信,您會(huì)發現您根本就沒有(yǒu)保存什麽東西,至少(shǎo)是在發送的時(shí)候沒有(yǒu)保存。通(tōng)常在回發期間(jiān)傳送到服務器(qì)的 ViewState 數(shù)據(與其他數(shù)據)也會(huì)在 UpdatePanel 回調期間(jiān)傳送。事實上(shàng),來(lái)自 UpdatePanel 的異步 XML-HTTP 請(qǐng)求中所增長的數(shù)據,幾乎與在标準 ASP .NET 回發中增長的數(shù)據相同。下面是有(yǒu)關 ASP.NET AJAX 不可(kě)告人(rén)的秘密:UpdatePanel 雖易于使用,但(dàn)是通(tōng)信效率不高(gāo)。

幾乎沒有(yǒu)什麽辦法可(kě)讓您提高(gāo) UpdatePanel 的效率,但(dàn)是您可(kě)以放棄使用 UpdatePanel,并轉而使用 ASP.NET AJAX 的其他功能來(lái)更新頁面內(nèi)容,它不僅同樣流暢,而且更加高(gāo)效。它隻需要多(duō)一點點力氣,但(dàn)是最後的結果往往讓人(rén)覺得(de)是值得(de)付出的,因為(wèi)您可(kě)以大(dà)大(dà)降低(dī)在客戶端與服務器(qì)之間(jiān)傳輸的數(shù)據量。

 

----------------------------------------------

(13) Design Patterns

雖然「設計(jì)模式」不是為(wèi)解決性能問題而誕生(shēng)的,但(dàn)可(kě)适度防止沒經驗的新人(rén)做(zuò)出蠢事。多(duō)學一些(xiē) .NET 技(jì)術(shù)敵營注重的系統架構、OOAD、Design Patterns 和(hé)相關的 Framework,對提升自己的身價和(hé)薪資也有(yǒu)幫助。

如沒特殊注明(míng),文章均為(wèi)中技(jì)互聯原創,轉載請(qǐng)注明(míng)來(lái)自www.zjcoo.com
上(shàng)一篇:視(shì)頻推廣方法詳細介紹 下一篇:已經是最後一篇了
相關新聞

CopyrightZJCOO technology Co., LTD. All Rights Reserved.    

渝ICP 備11003429号

  • qq客服
  • 公衆号
  • 手機版
  • 新浪微博