程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 排錯案例分享

排錯案例分享

編輯:.NET實例教程

前幾天另一個組的同事遇到了一個問題,他們的服務器cpu總是很高,用性能監視器看來,情況更是奇怪,開始時cpu一直很低,接著忽然漲到25%,然後再也下不來了,隔一段時間cpu又漲25%,然後就一直保持50%以上,就這樣一漲25%,最多漲四次就100%,占用CPU的是w3wp進程,到了100%的時候,就不得不把w3wp強行終止

除了cpu外其他屬性均正常

在性能監視器裡添加ASP.Net 的Current Request(當前請求數),發現有一些請求始終沒有結束,對比cpu的使用率,可以看到當有一個這樣的請求,cpu為25%兩個則為50%,三個75%....


看到這個問題,我的第一個反應是請求為什麼不過期,而是一直占用cpu,第二個,奇怪的地方,是cpu增長的方式和幅度很有趣,固定每次增長25%,並且增長的時間不定.

開始我沒有什麼太好的想法,但是光cpu高,其他指標正常,讓我覺得起一定有某項工作在努力進行,而且不涉及大量內存和io操作,最簡單的模擬方法莫過於寫一個什麼都不做的死循環,於是我新建了一個web項目,在本機的的IIS上建立一個站點指向他,為了真實一些,我還給這個站點單獨設置了一個應用程序池,然後,我在一個空頁面的onload裡加上while(true){}看看效果,下面是訪問這個空頁面的時候的cpu情況,我們可以看到,占用率超過了50%



還有:對這個頁面的請求一直不超時,無論我回收甚至停止應用程序池,w3wp都執著的占用我50%的cpu,而我是一個雙核處理器,而有問題的那台是四核的.每次漲25%,呵呵,有點意思哈,是不是實際問題很像了呢?

那麼為什麼請求不超時呢?本地的代碼web.config中設置為debug="true",這時默認是不會超時的,但是發布後一般會改為debug="false",這時才有請求超時,推測另一組的開發人員出於某種原因,發布後沒有進行修改.所以造成了一直存在的請求.趕忙叫請人看了看,果然webconfig中debug="true"

但現在的問題是到底是什麼請求導致了這些超長時間請求呢?難道真是一個死循環嗎?

要解決這個問題,我們首先要找到有問題的請求,開始的時候我們不知道怎麼查看iis當前的具體請求,而iis只提供了當前請求數,但是起碼我們有IIS的日志吧,所以我想使用一個程序來監視cpu的值,一旦發生了25%的長期提升,我就記錄下發生的時間,然後到log裡面看看對應時間到底有些什麼請求,下面就是我的程序,使用的是程序操控perforMace counter,大概邏輯我會在下面講述
   public class TestPerformanceTool
    {
        static PerformanceCounter pc;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved