天天看點

對ASP.NET網站高性能和多并發的設計的讨論

對以下文章内容我要說明下,在财大氣粗的網際網路公司或為财大氣粗的客戶服務的不缺錢的主,請立即繞行,以下内容不适合您。

以下内容為客戶計算資源緊缺,預算緊缺,無法通過增大帶寬,增多伺服器,購買各種進階服務的程式員們進行讨論。

謝謝

對于如何提高應用程式的性能(無論是網際網路應用還是企業級應用)我的觀點一直是考慮一個核心:IO處理。因為我認為目前的CPU的處理能力已經是非常高了,正常編寫的在記憶體中處理的代碼沒有太嚴重的問題都不會對CPU造成很大的影響,性能往往是被IO所限制。由于我和我的團隊溝通時間比較長,是以我們之間的一個簡單的IO說明往往覆寫了很多的含義,這些IO包括了磁盤IO、網絡IO、記憶體IO以及各種裝置的IO處理。我們的團隊經驗是盡可能的在各種IO進行中尋找出可以提升的效率。

以下,我将從後向前說明我們團隊在提升IO處理的經驗和認識

1 資料庫

資料庫是最明顯的消耗磁盤IO的元件,提高資料的性能有多種,SQL語句寫的好,也是減少了表的掃描(明顯是IO動作),設計合理的索引又是提高了IO處理能力,将不在變化的曆史資料獨立的存儲也減少了複雜IO的處理,為表設計備援的字段也是為了減少IO讀寫提高性能,将資料表分布在不同的磁盤上也是提升IO效率。還有其他的各種方式,比如查詢緩存、連接配接池神馬的,原則同樣如此。

總之,減少資料庫和磁盤之間過度的活動,能盡可能的提升資料庫效率。

2 資料緩存

記憶體IO的處理效能自然要遠高于磁盤IO,資料的緩存就是減少磁盤操作,或至少減少性能更低的資料庫操作。對于頁面的結果資料緩存我們的通常簡單方案是準備兩個緩存區:一個記憶體,一個檔案

記憶體的緩存區,我們直接用HttpRuntime.Cache,在這個緩存區中我們放置特征碼和資料(資料往往是頁面需要的資料,一般我們放置JSON格式),過期政策上我們自然選擇NoAbsoluteExpiration。

當資料需要從記憶體緩存區中被撤掉時,我們會将這個過期資料再次處理,我們在Cache中有一個集合,這個集合放置了被撤掉的緩存資料的特征碼,而對應的資料寫入磁盤上的一個檔案中。

使用者請求資料時,先檢查特征碼是否在正常的緩存中,如果不在,則檢查是否在過期區,如果是過期區,則去讀取磁盤檔案(至少減少了資料庫開銷),都沒有,那去查資料庫吧。

3 對集合的代碼處理

無論是頁面的javaScript,還是背景的java,C#,在目前的業務中對集合/數組的操作肯定是最頻繁的,考慮用一些細節上的優化,也可以提高性能

類似很多技巧都是減少對集合Length/Count的反複确認對高頻的集合操作是有益的。當然集合中不能動态的加減資料。數組優先、泛型其次,arrayList最後考慮,這些選取的原因都是減少IO開銷。

還有很多代碼的細節都是可以提高效率,比如對string的認知什麼的。

(林永堅MVP 提示我沒有表達清楚以上意思,我的想法是:集合我的測試是,如果反複的判斷count會比較慢,不如for的時候吧count先求出來,還有就是盡可能的用數組,因為數組初始化的時候已經指派完畢了,且又是強類型,不知道我表達的對不)

4 網絡傳輸

背景資料最終要傳遞給浏覽器,減少網絡傳輸的位元組也是提高吞吐的重點,簡單的說,就是對網絡IO處理優化。減少webform中的ViewState資訊,或者幹脆不用webform,改用MVC,或者直接httpcontext自己來控制所有狀态資訊。我們采用ashx并且為不同的服務開辟不同的ashx通道提高性能。由于ashx不必做一系列動作、不用經過一連串的事件處理、一大堆的控件狀态管理(加載并解析ViewState,還原、更新控件的值、儲存ViewState等),直接傳回操作結果,也就不用耗費更多的伺服器資源,傳回的格式也非常好靈活,所有用ashx在基于文檔型的網站中我們運用的很好。

另外一點ashx對開發成員的工作隔離也是非常好。

除了程式設計影響傳輸,頁面需要的圖檔和css檔案,js檔案合理的處理減少HTTP請求也能提高網絡IO效率:比如将圖檔合并,js、css壓縮等簡單的方式雖然改變不多,但并發的時候降低伺服器的壓力總是好的。

5 頁面渲染和體驗

優化頁面的html結構,有時候為了加快渲染,不必完全符合W3C的規範,減少div嵌套,使用固定寬度,主要javaScript的細節可以提高很好的體驗。我在chrome中的測試結果可以發現,很多情況下網絡的速度遠遠高于渲染的速度,是以能提高頁面的處理,對個體使用者的體驗是很有效的。

4 資料送出

在可靠的情況下,多考慮異步模式或多線程。對資料庫的送出,web服務的通路都可以使用異步模型,當然是在可靠的情況下。

頁面的ajax自然也是異步的一種方式,另外js檔案的加載也可以異步的方式。

5 鎖

太累了,先不寫了

林永堅MVP還提出了用noSQL,恩,是的,不過我還沒有好好用呢,不能講出什麼來

繼續閱讀