不用windbg解決High CPU的乙個案例

2022-02-14 19:07:26 字數 2087 閱讀 1075

基礎:本文著重在於講述分析問題的過程。lixiong寫的windows使用者態程式高效排錯一書從一開始就在講述乙個道理:找到問題的關鍵不在使用windbg的過程,而在於對問題的分析。

首先,這是乙個用於web聊天和訊息投遞的web應用程式,所以一般情況下不存在對大資料的傳輸和處理。cpu在75-90%之間波動。而且程式使用了lion的異常捕獲元件,也就是說所有能看到的asp.net的導致yellow screen of death的情況,是都能捕獲到的。那麼asp.net的程式出問題了,就先從perfmon裡看看情況。

開啟perfmon,新增了幾個counter,等一會,看看平均值:

那virtual bytes=4倍大小的private bytes,這個看起來有點問題,通常來說,virtual bytes不會大於2倍大小的private bytes,否則應該考慮是不是有fragment的問題了,檢查web.config,debug=false沒問題,這時候覺得fragment的可能性也比較小了。

# bytes in all heaps這個值應該是只有gc在collect的時候才會變化,但是virtual bytes和private bytes都是平穩的,memory leak的可能性基本沒有,程式也沒有使用有特別問題的非託管**。那# bytes in all heaps活動比較頻繁,是為什麼?

既然常用的counter不能解釋更多問題了,就再加上了幾個與.net相關的計數器。一下子# of exceps thrown / sec的值讓我大吃一驚:這個程式每秒鐘丟擲480個異常!

# of exceps thrown / sec計數器是指示每秒種出現的異常的個數,這裡的異常包括已經catch到的。一般來說該值在20一下是正常的。前文已經提到過我並沒有log到這麼多的exception,也就是說這些exception全部是.net或asp.net丟擲來的。這裡我把.net和asp.net分開說是因為原因有2個:

如果.net平台呼叫的一些非託管資源返回一些不正確的hresult格式,那就會有乙個異常出來。

asp.net框架在某些地方也會拋乙個異常,但是自己就處理了。只不過我們沒有注意到。

cpu只所以這麼high,exception功不可沒。

幾乎每個請求都會丟擲異常,但肯定不是所有的請求都丟擲異常(否則應該是接近正比關係)

總有一些請求每次丟擲不止乙個異常(還是通過不是正比關係來判斷)

往往乙個大型的web應用程式只有固定的幾個頁面會有較大較頻繁的訪問量(當然在spider活動不頻繁的時段就是特殊情況了)。什麼樣的**會這麼頻繁被呼叫?通常來說三種可能性:httpmoudle、httphandler和像自定義的page基類一樣的東西。

按照順序逐個去找,最好找到了乙個地方,在httphandler裡使用了context.server.transfer()方法。httpserverutitility類的transfer()方法用reflector來看一下:

1public

void

transfer(

string

path, 

bool

preserveform)28

this

.execute(path, 

null

, preserveform);

9this

._context.response.end();

10}1

public

void

end()28

elseif(

!this

._flushing)916

}17} 這些handler都是在處理那些被頻繁請求的頁面,乙個請求就至少有2個異常。

這裡想留下兩個要點一起與大家討論:

為什麼cpu高?撇開其他部分不說,建立exception,把callstack和那些資料收集起來是很昂貴的操作。之後gc有要負責清理這些,也是expensive way。

一開始就提到了virtual bytes和private bytes的比例是在4倍左右,virtual bytes為為什麼這麼高?僅僅因為cpu多嗎?(在taskmgr裡可以看到4 cpu,x86)

請您一定留下寶貴的想法和分析思路。謝謝您。

解決WinDbg下不能用 ClrStack a

在這要噴一下,有時候我們最鬱悶的是,買一本書按照例子做結果老是不對。當然筆者就遇到這樣的問題。我在看 net 高階除錯 這本書就總感覺有些例子都沒辦法實現書中例子中的效果,如 3.7.4 陣列的轉儲 章時,要使用 clrstack a 老是出現,百思不得其解,就拿紅色框裡面的類容一搜,找到一篇類式的...

分析日誌不用愁,shell命令來解決

以nginx 為例 awk access.log sort uniq wc lawk 文字處理,輸出第一段 ip位址 access.log 處理的日誌 sort對上一段輸出結果排序 uniq去重 wc l對行數統計 grep index.html access.log wc lgrep index....

Tomcat埠被占用解決方法(不用重啟)

很多時候執行tomcat 的時候總是會提示tomcat 的埠被占用,但是任務管理器裡面還找不到是哪個埠被占用了 因此很多人就重新配置tomcat 或者去修改tomcat的埠號 其實這麼做太麻煩了 在這裡告訴你乙個非常簡單的方法。1.在開始選單中選擇執行 然後輸入cmd 進入dos介面。2.在dos視...