2016/02/23

[轉] 使用Performance Monitor監控CPU、Memory、Network與Disks

(文章出處: [[使用Performance Monitor監控CPU、Memory、Network與Disks]] 阿兩的筆記本 Ryoutsu’s Notebook )

使用Performance Monitor監控CPU、Memory、Network與Disks

Purpose

我希望能夠在裝某個軟體後,知道它對系統效能的影響。我們使用Windows Vista之後所內建的Performance Monitor,去對CPU、Memory、Network與Disks四個項目做監控與評估。接下來將告訴大家如何使用這個工具去達到這個目的。

Create New Data Collector Set

首先, 開啟Performance Monitor工具: start > run > perfmon
在Data Collector Sets中,System Performance已提供大部分能滿足我們需求的內容。包含: (只列出我們需要的部分,實際有更多資訊)

CPU: CPU使用率。
Memory: Memory使用率。
Network: 每秒接收或送出的封包、接受與送出所使用掉的Bytes數。
Disks: 硬碟每秒的讀寫速度。
但我們還需要硬碟的使用量與定義收集資料的時間(預設1分鐘)。

首先來建立一個新的Data Collector Set:

在User Defined點右鍵 > New > Data Collector Set。
輸入自訂名稱,選擇Create from a template。
選擇System Performance為範本。
直接按Finish。(後續的設定不是這麼重要)

Change Properties

為了要設定我們想要的監控時間,我們可以做工作排程或設置停止監控的時間:

對Data Collector Set點右鍵。
選擇Properties。
切到Stop Condition的頁籤。
選擇多久後停止。

如果是為了要知道某些時段的效能,可以切到Schedule頁籤設定時間區段。

Change Performance Counter

在System Performance範本中,僅提供PhysicalDisk Counter。我們需要的剩餘空間(Free Space)是屬於LogicalDisk Counter,所以我們必須新增這個Counter。

選擇新增的Data Collector Counter。
雙擊右邊的Performance Counter會出現Performance Counter Properties對話盒。
點擊Add,並找尋LogicalDisk。
LogicalDisk包含許多項目,我選擇所有加入。
加入LogicalDisk 項目至右方,你也可以選擇你要監控的磁碟分割。
按OK關閉新增Counter與修改Properties對話盒,即新增完成。
在Properties對話盒中,你也可以針對不同Counter,選擇採樣Interval時間。

其實我們只需要Free Space,但想說反正都做一次功,就一起抓一抓。最後等到報表再選擇想要呈現的部分。

Running

對要執行的Data Collector Counter點右鍵並點Start,即開始執行(同時間只允許一個工作)。此時Reports對應目錄中會產生出顯示還在執行的報表:

Reports

在工作執行完成後,點擊Report會有文字報表,大致看這張就可以知道結果了。

但如果要提供更能說服人的圖表,如監控時間的效能變化折線圖,可以對Report右鍵>View>Performance Monitor:

圖表畫面如下:

a: 查看當前活動內容。
b: Performance Monitor的屬性。
c: 改變圖表種類。
d: 新增要顯示的Counter內容。
e: 目前顯示的Counters列表。

屬性對話盒主要可以讓你選擇資料來源與顯示的Counters項目,算是設定大雜燴:

Summary

整體來說,算是很勇猛的工具,光CPU、Memory、Network與Disks就足夠讓我判斷某個軟體吃不吃資源。在這篇文章中,我只講我所需要的部分,其中更詳細的設定,可能要等到我有需要才會深究吧! 最後附上一張我用的Counters:


(其中Network Interface是針對某張網卡顯示,Processor也可以針對某個Core顯示)

2016/02/16

windbg 要怎麼切換從32至64bits 模式: .effmach x86 或 !wow64exts.sw

(原文出處: How do I switch to 32bit mode when I use windbg to debug a dump of a 32bit application running on an x64 machine? )

這篇文章裡面會介紹, 當你使用windbg來除錯一個dump檔
而它又是32bits的應用程式跑在x64機器上的dump檔, 如何從 32bit mode切換到 x64 machine.

假如你是32bit或64bit版本的windbg, 去開啟 32bit Application跑在x64作業系統上的Dump檔, 預設就是指你用64bit的模式去看32bit的application, 如下例, 會出現很多 wow64xxxx的字串

0:001> k Child-SP RetAddr Call Site 00000000`027eebc8 00000000`7529ab46 wow64cpu!WaitForMultipleObjects32+0x3a 00000000`027eec70 00000000`7529a14c wow64!RunCpuSimulation+0xa 00000000`027eeca0 00000000`777305a8 wow64!Wow64LdrpInitialize+0x4b4 00000000`027ef200 00000000`776e68de ntdll!_LdrpInitialize+0x49db8 00000000`027ef2b0 00000000`00000000 ntdll!LdrInitializeThunk+0xe0:001> r rax=000000000af7e3b8 rbx=00000000778ecb94 rcx=00000000004b6a18 rdx=0000000000000018 rsi=00000000004b6a18 rdi=0000000000000000 rip=000000007577374f rsp=00000000027eebc8 rbp=0000000002a9fee0 r8=000000000000002b r9=00000000778c99fd r10=0000000000000000 r11=0000000000000212 r12=000000007efd8000 r13=00000000027efd20 r14=00000000027eec00 r15=0000000075773380 iopl=0 nv up ei pl nz ac pe nc cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000212 wow64cpu!WaitForMultipleObjects32+0x3a: 00000000`7577374f 418bbda0000000 mov edi,dword ptr [r13+0A0h] ds:00000000`027efdc0=00000000

這些wow64xxxx的字串在這些call stack根本無法給我們想要的訊息!
The wow64 stuff in the call stack and the x64 registers do not tell us much.

切換成用32bit的視角來看吧! 透過 .effmach x86 或 !wow64exts.sw 就可以囉!
To get the meaningful 32bit look of the application, you need to switch the processor mode that the debugger uses to 32bit by entering either .effmach x86 or !wow64exts.sw in windbg. The two commands are basically same. You should see output like the following:

0:001> !wow64exts.sw Switched to 32bit mode0:001:x86> k ChildEBP RetAddr 02a9fd4c 7794787d ntdll_77880000!NtWaitForMultipleObjects+0x15 02a9fee0 7730eccb ntdll_77880000!TppWaiterpThread+0x328 02a9feec 778fd24d kernel32!BaseThreadInitThunk+0xe 02a9ff2c 778fd45f ntdll_77880000!__RtlUserThreadStart+0x23 02a9ff44 00000000 ntdll_77880000!_RtlUserThreadStart+0x1b0:001:x86> r eax=00000000 ebx=778ecb94 ecx=00000000 edx=00000000 esi=004b6a18 edi=00000000 eip=778c99fd esp=02a9fd50 ebp=02a9fee0 iopl=0 nv up ei pl nz na po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202 ntdll_77880000!NtWaitForMultipleObjects+0x15: 778c99fd c21400 ret 14h

果然看起來很不一樣吧!
The call stack looks very different now. Particularly you do not see any wow64 and wow64cpu modules in the stack.

以上的方法也適用於x64 kernel dump 在32bits處理器
Note: The above solution works for the kernel mode dump of an x64 system too when you try to see the thread call stacks of a running 32bit process.