熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

性能瓶頸診斷與初步調優

2013-11-13 10:11:10  來源: .NET編程 
    服務端的要處理的請求越多無疑服務端的壓力也就越大尤其是有些請求需要訪問一些比較昂貴的資源例如數據庫服務端的文件等但是我們必須知道在到達服務端的請求中有些請求時我們希望的例如網站的用戶的請求有些請求其實是不必要甚至是我們不想要的為此我們要避免這樣的請求節省服務端的資源從而提高性能
    搜索引擎
    首先來看看有關搜索引擎的問題
    然後搜索引擎爬到我們的站點是一件好的事情很多的SEO可以進行推廣站點同時在站點中有些文件或者資源比較的私密或者我們不希望被搜索引擎請求和收錄的因為每次搜索引擎在請求這些資源的時候就是發送請求到我們的站點服務器勢必會加重服務器的負載
    不需要被搜索引擎請求的文件一般如下
           圖片資源
           Js腳本css等
           一些需要身份驗證或者授權才能看的頁面(如果頁面需要驗證之後才能看搜索引擎收錄了也作用不大)
    我們可以設置一下告訴搜索引擎的蜘蛛程序如何爬我們的站點
    步驟如下
           在站點的根目錄下面創建一個robotstxt的文件
           寫入文件如果我們希望阻止所有的搜索引擎來爬我們的站點的頁面那麼就可以在文件中寫入下面的配置
    Useragent: *
    Disallow: /
    如果希望阻止搜索引擎爬某個文件夾可以配置如下
    Useragent: *
    Disallow: /images/
    Disallow: /js/
    Disallow: /css/
    Disallow: /private/
    更有趣的是對於某些搜索引擎我們還可以改變他們的蜘蛛程序爬我們站點的頻率設置如下
    Useragent: *
    Crawldelay:
    大家可以去上網找下一些如何影響Google百度等蜘蛛程序的設置
    熱鏈接問題
    就是在A網站上面顯示一個來自B網站的圖片鏈接例如我們在自己的站點上面有一個鏈接如下<img src=/>那麼在別人在浏覽我們的站點的時候就回去別人的那個站點()去請求這個圖片那麼勢必會消耗他們的服務器的資源發過來如果別人在他們的站點上采用了我們的圖片或者其他的鏈接資料那麼用戶在浏覽別人的站點的時候就會消耗我們站點的服務端資源和帶寬
    為一個組件就可以阻止這種情況的發生
    aspx?tabid=&i=&g=大家去看看
    驗證碼(CAPTCHA)
    我們常常在站點中加入一些驗證碼的功能來防止網絡注冊機一般是生成一張有文字的圖片然後根據驗證用戶輸入的文字和圖片中的文字是否一樣來判斷此時的用戶是人還是注冊機
    通過驗證碼阻止了注冊機隨意的消耗站點資源(如果沒有驗證碼注冊機可以不斷的注冊信息大小服務器和數據庫資源而且產生很多的垃圾數據)
    我們自己寫生成驗證碼的程序一般通過GDI+來做同時也可以采用一些第三方的庫實現例如reCAPTCHA: 大家上網找下很多的


    網絡刮刀(Scrapers)與Dos
    這個問題必須引起重視如果我們的站點上面有很多的有用的信息那麼別人可能就可能開發一個程序來到我們的站點抓取信息然後把這些內容放到自己的站點上面例如很多的內容型的站點每天都從博客園的首頁上面來抓取信息然後放到他們的站點上增加他們的訪問量
    本來站點被搜索引擎抓就有點消耗性能了如果還被很多的這樣的網絡刮刀來抓內容對站點的性能影響可想而知
    如果那些網絡刮刀程序的的IP地址變化不頻繁而且請求我們站點的頻率比較的由規律那麼我們就可以采用一些代碼的方式來防止這樣的請求例如我們可以監測同一個IP是否在min之內發送了個請求如果是我們就推測可能是別人在抓我們的站點內容我們就拒絕這個IP的請求
    當然了上面只是一些簡單的方法對於一些復雜的Dos攻擊上面的監測代碼基本沒有作用因為Dos攻擊中攻擊的IP地址是變化的
    下面我們就寫一些代碼來防止簡單的網絡刮刀程序和簡單的Dos攻擊基本的思想就是如果在給定的時間段內如果某個用戶的請求很多超過了一定的數量那麼我們就認為這個用戶可能是網絡刮刀程序然後就拒絕下面的請求一段時間之後再次允許這個從這個IP發出的請求
    下面的代碼中假設如果一個用戶在秒之內發出了個請求那麼我們就認為這是網絡刮刀程序或者是網站的攻擊者當然我們還考慮這個發送請求的用戶是否是搜索引擎的蜘蛛程序(下面的代碼只是簡單作為演示不是實際生產的代碼拋磚引玉)
    private const int intervalSeconds = ;
    private const int maxRequestsInInterval = ;
    如果認為這個用戶是攻擊者那麼我們就阻止用戶的請求阻止時間是
    private const int blockedPeriodSeconds = ;
    下面我們創建一個類來描述一個訪問者的信息如下
    代碼
    private class VisitorInfo
    {
    public int nbrHits;
    public bool blocked;
    public VisitorInfo()
    {
    nbrHits = ;
    blocked = false;
    }
    }
    在BotDefence類中加入一個方法IsBotAttach來判斷一個請求是否是攻擊性的請求如下
    代碼
    public static bool IsDosAttack()
    {
    string visitorIP = HttpContextCurrentRequestUserHostAddress;
    VisitorInfo visitorInfo = (VisitorInfo)HttpContextCurrentCache[visitorIP];
    if (visitorInfo == null)
    {
    HttpContextCurrentCacheInsert(
    visitorIP new VisitorInfo() null
    DateTimeNowAddSeconds(intervalSeconds)
    SystemWebCachingCacheNoSlidingExpiration)
    }
    else
    {
    if (visitorInfoblocked)
    {
    return true;
    }
    visitorInfonbrHits++;
    if (visitorInfonbrHits > maxRequestsInInterval)
    {
    visitorInfoblocked = true;
    HttpContextCurrentCacheInsert(
    visitorIP visitorInfo null
    DateTimeNowAddSeconds(blockedPeriodSeconds)
    SystemWebCachingCacheNoSlidingExpiration)
    return true;
    }
    }
    return false;
    }
    上面的代碼都是自解釋的很容易看懂就不贅述了
    當然了上面的代碼很簡單我們可以保存每個請求IP的地址然後分析相關的方法網絡上面有很多大家自己找!
    本篇就到這裡了下一章就詳細的講述如何解決內存的性能瓶頸敬請關注


From:http://tw.wingwit.com/Article/program/net/201311/12823.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.