天天看點

小網站架構優化:從100并發抗到4000并發

前言:

小網站架構優化:從100并發抗到4000并發

很久前,在512m記憶體+access的vps裡,寫過了一個經典的秋色園技術原了解析系列。

後來的某一天,換上了1g記憶體+mssql2000,秋色園又跑過了一個多年頭。

秋色園的架構,基本上從簡單到複雜最後又回歸簡單,不斷做着減法,去掉了好多以前用于減輕負載的算法,包括aop+sqlite分壓和文本分壓等機制,還有一些緩存式算法。

好多時候,硬體不給力,這時候就會被逼着把整個系統架構複雜化。

一當硬體給力時,系統輕裝上陣,架構可以更簡單。

因為本質就是請求+傳回(硬體能加速的,軟體就不用搞太多算法了)。

小網站架構優化:從100并發抗到4000并發

下面在分享一下我記憶中還記得的秋色園關于負載測試的起緣:

1:某天,我發現秋色園cpu經常會跑滿100%:

小網站架構優化:從100并發抗到4000并發

經過一年的歲月,不知覺的最終被我發現是搜尋引擎引發的(雖然寫過iis日志分析工具,但是我自己都很少用,幾乎沒怎麼用,一用沒想到找到問題了)。

我發現秋色園的關鍵字(tag),由于是直接連結到搜尋,而搜尋這塊是全表的like搜尋,沒做緩存的優化,是以搜尋引擎心情好時就把它弄挂菜了。

小網站架構優化:從100并發抗到4000并發

2:某天,某人用幾百個并發,把秋色園又搞到cpu百分百了:

小網站架構優化:從100并發抗到4000并發

我很疑惑,秋色園幾乎都是半靜态+緩存,除了隊列緩存式更新通路計數,和除了背景,不可能頂這點并發就挂了。

通過檢視iis日志,我從日志裡發現,是由于url引發的:

由于秋色園是根據url緩存的,對方的并發通過在url後面補充一些随機參數,導緻每次請求的url都不一樣,結果系統每次會重新讀取并生成html,導緻cpu飄起來。

解決方法就是重整所有的url連結和對應的緩存機制了。

小網站架構優化:從100并發抗到4000并發

3:某天,我也玩起了負載工具,自己時不時的把秋色園弄到cpu百分百.

下面分享下,在負載推力下,對秋色園後續折騰的幾個優化方案:

經過不斷的負載測試,秋色園順路把一些常見的優化手段也用上了:

1:分離靜态資源域名:static.cyqdata.com

小網站架構優化:從100并發抗到4000并發

架構處理過程:

1:把模闆加載和圖檔處理的,都給處理到另一個域名。

2:新開一個網站,綁定static.cyqdata.com域名,位置仍指向原來的位置。

3:由于是靜态站點,可以關掉和.net無關的所有東西。

這樣變化後,圖檔的負載就是天與地的變化:

如果沒有分離出來,仍經過.net解析後再傳回圖檔,測試1-2千個并發cpu就近滿了。

經過分離,關掉和.net相關的資源後,跑了5000以上并發,cpu和記憶體也沒怎麼動靜。

主要自己三台機最多隻上到這5k左右的并發數,不能往上再測試,但是差距已經很明顯了。

小網站架構優化:從100并發抗到4000并發

2:http 304:這是用戶端緩存的應用:

除了伺服器緩存,用戶端緩存也是另一個重點,除了一些靜态資料處理緩存,動态資料也适時用上304。

如:秋色園上有一些動态的檔案“下載下傳次數”:

小網站架構優化:從100并發抗到4000并發

一般的程式,檔案下載下傳都是和文章内容分開的,單獨提供下載下傳。

如上,我需要在文章内容裡提供下載下傳,又要考慮下載下傳次數機制,用上了圖檔機制,通過動态一個請求傳回了圖檔資源。

由于下次數次實時性不強,而且變化少,通過來點手段,也可以304緩存。

3:關掉不常用的modules:

小網站架構優化:從100并發抗到4000并發

如果你重寫過url,或看過秋色園技術原了解析關于url重寫這塊文章,下面代碼應該會熟悉:

通過調試,看下圖:秋色園的modules隻剩下3個,那時因為其它的沒用的都關掉了。

本來session子產品也是要關掉,突然發現oauth2裡用到了,就保留了。

看下圖還會發現一段注釋的for語句,是列印出預設系統帶的十幾個moudules。

小網站架構優化:從100并發抗到4000并發
小網站架構優化:從100并發抗到4000并發

關掉也很簡單,web.config配置:

小網站架構優化:從100并發抗到4000并發

    <httpmodules>

      <add name="urlrewrite" type="web.urlrewrite.urlrewrite,web.urlrewrite" />

      <remove name="outputcache" />

      <!--<remove name="session"/>-->

      <remove name="windowsauthentication" />

      <remove name="formsauthentication" />

      <remove name="passportauthentication" />

      <remove name="rolemanager" />

      <remove name="urlauthorization" />

      <remove name="fileauthorization" />

      <remove name="anonymousidentification" />

      <remove name="profile" />

      <remove name="errorhandlermodule" />

      <remove name="servicemodel" />

      <!--<remove name="urlrewrite"/>-->

      <!--<remove name="defaultauthentication"/>-->

    </httpmodules>

小網站架構優化:從100并發抗到4000并發

4:盡早關閉資料庫連結:

以前喜歡這樣寫代碼:

小網站架構優化:從100并發抗到4000并發

using (maction action = new maction(u_qblogfileenum.blog_file))

            {

                action.setselectcolumns(files.id, files.hits, files.filepath);

                if (action.fill(id))

                {

                   document.load(action.data);

                   。。擷取資料庫資料處理一些業務邏輯顯示到界面。 

                }

            }

小網站架構優化:從100并發抗到4000并發

這種壞習慣,導緻資料庫連結會根據業務的時間延長了關閉連結,導緻并發性能下降,平時看不出來。

改進:

小網站架構優化:從100并發抗到4000并發

mdatarow row;

                   row=action.data;

if(row!=null)

{

document.load(action.data);

。。擷取資料庫資料處理一些業務邏輯顯示到界面。

}

小網站架構優化:從100并發抗到4000并發

把邏輯放到外面,提前關閉連結後再去處理事情,并發時性能會提升不少。

5:web園的抗并發能力:

小網站架構優化:從100并發抗到4000并發

基于不斷的優化改進,秋色園從100個并發挂菜-》基本優化-》到1000個并發挂菜-》經過架構調整優化-》抗到2000個并發左右。

最後,還有一個招,就是iis的web園,通過允許的設定了2個程序,發現能抗到4000并發,雖然cpu接近100%,但仍能正常通路,可見web園的确是個奇招。

開啟web園,意味着多程序負載,當然session預設的模式就不能用了。

小網站架構優化:從100并發抗到4000并發

如上所說,同樣的硬體配置:從100個并發,到4000個并發,改動并不多,路也并不長,但是常人又知多少。

以上的伺服器環境,都是美國vps 10m帶寬cpu雙核,配置如下:

小網站架構優化:從100并發抗到4000并發

6:如何對網站進行負載測試:

後話:

硬體能頂半邊天:一台好的伺服器,程式寫的爛一點,不做任何優化,也能跑的潇潇灑灑。

軟體能頂半邊天:好的優化機制和架構,窮的伺服器也能跑個安安穩穩。

現實時,隻有超過了那半邊天,你才會去想另一半的重要性。