การติดตามการใช้งาน CPU และหน่วยความจำต่อกระบวนการ


163

ฉันสงสัยว่าหนึ่งในแอปพลิเคชันของฉันกิน CPU รอบมากกว่าที่ฉันต้องการ ปัญหาคือ - มันเกิดขึ้นในระเบิดและเพียงแค่ดูที่ตัวจัดการงานไม่ได้ช่วยฉันเพราะมันแสดงการใช้งานได้ทันทีเท่านั้น

มีวิธี (บน Windows) เพื่อติดตามประวัติของการใช้งาน CPU และหน่วยความจำสำหรับบางกระบวนการหรือไม่ เช่นฉันจะเริ่มติดตาม "firefox" และหลังจากหนึ่งชั่วโมงหรือมากกว่านั้นจะเห็นกราฟของการใช้งาน CPU และหน่วยความจำในช่วงเวลานั้น

ฉันกำลังมองหาทั้งเครื่องมือสำเร็จรูปหรือวิธีการเขียนโปรแกรมเพื่อให้บรรลุนี้

คำตอบ:


167

เพียงแค่พิมพ์perfmonลงในStart > Runและกด เมื่อหน้าต่าง Performance เปิดขึ้นให้คลิกที่เครื่องหมาย + เพื่อเพิ่มตัวนับใหม่ในกราฟ ตัวนับเป็นลักษณะที่แตกต่างกันของวิธีการทำงานของพีซีของคุณและจัดกลุ่มตามความคล้ายคลึงกันในกลุ่มที่เรียกว่า "ประสิทธิภาพวัตถุ"

สำหรับคำถามของคุณคุณสามารถเลือกวัตถุประสิทธิภาพ "กระบวนการ", "หน่วยความจำ" และ "ตัวประมวลผล" จากนั้นคุณจะเห็นเคาน์เตอร์เหล่านี้แบบเรียลไทม์

คุณยังสามารถระบุยูทิลิตีเพื่อบันทึกข้อมูลประสิทธิภาพสำหรับการตรวจสอบของคุณในภายหลัง ในการทำเช่นนี้ให้เลือก "บันทึกและการแจ้งเตือนประสิทธิภาพ" ในแผงด้านซ้าย (มันอยู่ภายใต้คอนโซลการตรวจสอบระบบซึ่งให้เคาน์เตอร์ดังกล่าวข้างต้นหากไม่มีให้คลิก "ไฟล์"> "เพิ่ม / ลบสแน็ปอิน" คลิกเพิ่มและเลือก "บันทึกการทำงานและการแจ้งเตือน" ในรายการ ".) จาก" Performance Logs and Alerts "สร้างการกำหนดค่าการตรวจสอบใหม่ภายใต้" Counter Logs "จากนั้นคุณสามารถเพิ่มตัวนับระบุอัตราการสุ่มตัวอย่างรูปแบบการบันทึก (ไบนารีหรือข้อความธรรมดา) และตำแหน่งบันทึก


1
ช่วงเวลาที่เหมาะที่สุดในการจับตัวอย่างข้อมูลในบันทึกการตอบโต้คืออะไร?
Steph Rose

8
MS เปลี่ยน UI เป็น PerformanceMonitor อย่างเห็นได้ชัดตั้งแต่คุณเขียนสิ่งนี้ มีความคิดใดบ้างที่คุณทำสิ่งนี้ใน Windows 2008 R2
Martin Brown

5
@MartinBrown - พบนี้ มันยอดเยี่ยมมาก
JNF

2
ใครรู้วิธีการทำส่วนที่สองของการบันทึกเข้าสู่ระบบใน Vista? ดูเหมือนจะไม่มี "บันทึกการแจ้งเตือนและประสิทธิภาพ" ที่ใดก็ได้
Xitcod13

11
คลิกขวาที่ชุดตัวเก็บรวบรวมข้อมูล -> ผู้ใช้กำหนด เลือกใหม่ -> ชุดตัวเก็บรวบรวมข้อมูล ตั้งชื่อและเลือกสร้างด้วยตนเอง คลิกถัดไป เลือกตัวนับประสิทธิภาพ คลิกถัดไป เพิ่มตัวนับประสิทธิภาพและป้อนช่วงเวลาตัวอย่าง จากนั้นภายใต้ชุดตัวเก็บรวบรวมข้อมูลให้คุณคลิกขวาที่ชุดแล้วคลิก "เริ่ม" หลังจากนั้นสักครู่คุณคลิกขวาที่ชุดแล้วคลิก "หยุด" จากนั้นคุณสามารถค้นหารายงานได้ใน Reports-> User Defined-> Set ของคุณ คลิกขวาที่กราฟแล้วเลือกบันทึกข้อมูลเป็น
Gremio

43

Process Explorerสามารถแสดงเวลา CPU ทั้งหมดที่ดำเนินการโดยกระบวนการรวมถึงกราฟประวัติต่อกระบวนการ


3
ดังนั้นคุณจะใช้มันอย่างไรเพื่อค้นหากระบวนการที่สุ่มเริ่มใช้หน่วยความจำหรือพลังงานตัวประมวลผลมากขึ้นในระยะเวลาอันสั้น คุณสามารถทำอย่างละเอียด?
Xitcod13

คลิกขวาที่ส่วนหัวของคอลัมน์เลือกเลือกคอลัมน์จากนั้นเลือก "ประวัติ CPU" ภายใต้ "ประสิทธิภาพของกระบวนการ"
Laurent

คุณสามารถรีเซ็ตเป็นศูนย์ได้ไหม?
Simon_Weaver

ฉันสามารถเข้าสู่ไฟล์ที่ปริมาณการใช้หน่วยความจำของ PID ที่กำหนดได้หรือไม่
Royi

แค่ต้องการชี้ให้ผู้ใช้รายอื่นทราบ: กราฟ CPU สำหรับแต่ละขั้นตอนจะเริ่มบันทึกหลังจากที่คุณเปิดเป็นครั้งแรกแม้ว่า Process Explorer จะเปิดอยู่ดังนั้นวิธีนี้จึงไร้ประโยชน์จริง ๆ สำหรับการจับภาพเหตุการณ์ประปรายและพยายามแยกมันออก เพื่อกระบวนการเดียว ฉันจะชี้ให้เห็นว่าถ้าคุณคลิกกราฟ CPU ระบบทั่วโลก (ซึ่งเริ่มบันทึกเมื่อเปิด Process Explorer) และเลื่อนเมาส์ไปที่จุดใด ๆ มันจะแสดงกระบวนการที่ใช้ CPU มากที่สุด ณ จุดนั้น
SUM1

19

ใช้ perfmon.exe ฉันได้ลองใช้ตัวนับ "Private Bytes" ภายใต้ตัวนับ "กระบวนการ" สำหรับการติดตามการใช้งานหน่วยความจำและทำงานได้ดี


1
นี่คือคำตอบที่ถูกต้อง คุณยังสามารถรับข้อมูล CPU ภายใต้กระบวนการ คลิกที่กระบวนการจากนั้นเลือกแอปของคุณ (Firefox ในตัวอย่างของคุณ) ภายใต้อินสแตนซ์ของวัตถุที่เลือก
Chris McCowan

11

บางทีคุณสามารถใช้สิ่งนี้ ควรทำงานให้คุณและจะรายงานเวลาตัวประมวลผลสำหรับกระบวนการที่ระบุ

@echo off
: Rich Kreider <rjk@techish.net>
: report processor time for given process until process exits (could be expanded to use a PID to be more
: precise)
: Depends:  typeperf
: Usage:  foo.cmd <processname>

set process=%~1
echo Press CTRL-C To Stop...
:begin
for /f "tokens=2 delims=," %%c in ('typeperf "\Process(%process%)\%% Processor Time" -si 1 -sc 1 ^| find /V "\\"') do (
if %%~c==-1 (
goto :end
) else (
echo %%~c%%
goto begin
)
)

:end
echo Process seems to have terminated.

7

ฉันเห็นด้วย perfmon.exe ช่วยให้คุณเพิ่มเคาน์เตอร์ (คลิกขวาที่แผงด้านขวา) สำหรับกระบวนการใด ๆ ที่คุณต้องการตรวจสอบ

วัตถุประสิทธิภาพ: กระบวนการตรวจสอบ "เลือกอินสแตนซ์จากรายการ" และเลือก firefox


1
ขอบคุณ ฉันจะดูประวัติของการใช้ cpu ในเวลาที่กำหนดไว้ล่วงหน้าได้อย่างไรเช่นหนึ่งชั่วโมง
Eli Bendersky

6

WMI เป็นเครื่องมือการจัดการของ Windows และสร้างขึ้นใน Windows รุ่นล่าสุด ช่วยให้คุณติดตามรายการต่างๆเช่นการใช้งาน CPU, ดิสก์ I / O และการใช้หน่วยความจำโดยทางโปรแกรม

Perfmon.exe เป็น GUI front-end ของอินเตอร์เฟสนี้และสามารถตรวจสอบกระบวนการเขียนข้อมูลลงในบันทึกและช่วยให้คุณสามารถวิเคราะห์บันทึกหลังจากข้อเท็จจริง มันไม่ได้เป็นโปรแกรมที่สง่างามที่สุดในโลก แต่มันก็ทำงานได้สำเร็จ


5
ในทางเทคนิค perfmon เป็นส่วนต่อประสานกับ Windows Performance Counter API พื้นฐานซึ่งมี WMI มาหลายปี WMI ยังเปิดเผยตัวนับประสิทธิภาพ API ภายในเนมสเปซ
Rob Walker

2

Process Lasso ได้รับการออกแบบเพิ่มเติมสำหรับกระบวนการอัตโนมัติและการเพิ่มประสิทธิภาพระดับความสำคัญไม่ใช่กราฟ ที่กล่าวว่ามันไม่เสนอประวัติของการใช้งาน CPU ต่อกระบวนการ (วาดเป็นเส้นสีขาวบนกราฟ) แต่มันก็ไม่ได้เสนอประวัติการใช้งานหน่วยความจำต่อกระบวนการ

การปฏิเสธความรับผิด: ฉันเป็นผู้เขียน Process Lasso แต่ฉันไม่ได้รับรองที่นี่จริง ๆ เพราะมีวิธีแก้ปัญหาที่ดีกว่า (perfmon เป็นดีที่สุด)

สิ่งที่ดีที่สุดคือ Windows Vista + Resource and Performance Monitor สามารถติดตามการใช้งาน CPU, หน่วยความจำ, เครือข่ายและการเข้าถึงดิสก์โดยกระบวนการเมื่อเวลาผ่านไป มันเป็นยูทิลิตี้ระบบข้อมูลโดยรวมที่ยอดเยี่ยมที่ควรสร้างขึ้นมานานแล้ว เว้นแต่ว่าฉันเข้าใจผิดมันสามารถติดตาม CPU และการใช้หน่วยความจำต่อกระบวนการในช่วงเวลาหนึ่ง


2

คุณสามารถลองใช้สคริปต์ C # / Perl / Java เพื่อรับข้อมูลการใช้ประโยชน์โดยใช้คำสั่ง WMI และด้านล่างเป็นขั้นตอนสำหรับมัน

เราจำเป็นต้องดำเนินการ 2 WMI Select Queries และใช้สูตรการใช้ประโยชน์ CPU%

1. เพื่อดึงจำนวนกระบวนการตรรกะทั้งหมด

select NumberOfLogicalProcessors from Win32_ComputerSystem

2. ในการเรียกคืนค่า PercentProcessorTime นั้น TimeStamp_Sys100NS (สูตรการใช้งาน CPU ถูกนำไปใช้จะได้รับเปอร์เซ็นต์การใช้งานจริง) และ WorkingSetPrivate (RAM) ขั้นต่ำ 2 ครั้งด้วยช่วงเวลาพักเครื่อง 1 วินาที

select * from Win32_PerfRawData_PerfProc_Process where IDProcess=1234

3. ใช้สูตรการใช้ประโยชน์ CPU%

CPU%= ((p2-p1)/(t2-t1)*100)/NumberOfLogicalProcessors

p2 ระบุ PercentProcessorTime ที่ดึงมาเป็นครั้งที่สองและ p1 ระบุ PercentProcessorTime ที่ดึงมาเป็นครั้งแรก t2 และ t1 สำหรับ TimeStamp_Sys100NS

ตัวอย่างรหัส Perl สำหรับสิ่งนี้สามารถพบได้ในลิงค์ http://www.craftedforeveryone.com/cpu-and-ram-utilization-of-an-application-using-perl-via-wmi/

ตรรกะนี้ใช้กับภาษาการเขียนโปรแกรมทั้งหมดที่รองรับการสืบค้น WMI


WMI และ Powershell
PreguntonCojoneroCabrón

2

แม้ว่าฉันจะไม่ได้ลองสิ่งนี้ProcDumpดูเหมือนจะเป็นทางออกที่ดีกว่า

คำอธิบายจากเว็บไซต์:

ProcDump เป็นยูทิลิตี้บรรทัดคำสั่งที่มีวัตถุประสงค์หลักคือการตรวจสอบแอปพลิเคชันสำหรับ CPU spikes และสร้างความผิดพลาดในระหว่างการเก็บชั่วคราวที่ผู้ดูแลระบบหรือนักพัฒนาสามารถใช้เพื่อกำหนดสาเหตุของการขัดขวาง ProcDump ยังรวมถึงการตรวจสอบหน้าต่างแบบแขวน (ใช้ข้อกำหนดเดียวกันของหน้าต่างที่ใช้ Windows และ Task Manager) การตรวจสอบข้อยกเว้นที่ไม่สามารถจัดการได้และสามารถสร้างการถ่ายโอนข้อมูลตามค่าของตัวนับประสิทธิภาพของระบบ นอกจากนี้ยังสามารถใช้เป็นยูทิลิตี้การถ่ายโอนข้อมูลกระบวนการทั่วไปที่คุณสามารถฝังในสคริปต์อื่น ๆ


1

อืมฉันเห็นว่าProcess Explorerสามารถทำได้แม้ว่ากราฟของมันจะไม่สะดวกเกินไป ยังคงมองหาทางเลือก / วิธีที่ดีกว่าที่จะทำ



1

คุณอาจต้องการที่จะมีลักษณะที่กระบวนการเชือก


1

ใน Windows 10 ตัวจัดการงานสามารถแสดงชั่วโมง CPU ที่สะสมได้ เพียงไปที่แท็บ "ประวัติแอพ" และ "ลบประวัติการใช้งาน" ตอนนี้ปล่อยให้สิ่งต่าง ๆ ทำงานเป็นเวลาหนึ่งหรือสองชั่วโมง:

เวลา CPU Windows 10 สะสม

สิ่งนี้ไม่ได้เป็นการแบ่งการใช้งานในเบราว์เซอร์โดยแท็บ บ่อยครั้งที่แท็บที่ไม่ใช้งานจะทำงานอย่างมหาศาลโดยแต่ละแท็บที่เปิดใช้พลังงานและทำให้พีซีของคุณช้าลง


1

มีความต้องการรับสถานะและการใช้งาน cpu / หน่วยความจำของเซิร์ฟเวอร์ windows บางตัว ฉันใช้สคริปต์ด้านล่าง:

นี่คือตัวอย่างของ Windows Search Service

  $cpu = Get-WmiObject win32_processor
  $search = get-service "WSearch"
  if ($search.Status -eq 'Running')
  {
  $searchmem = Get-WmiObject Win32_Service -Filter "Name = 'WSearch'"
  $searchid = $searchmem.ProcessID
  $searchcpu1 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
  Start-Sleep -Seconds 1
  $searchcpu2 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
  $searchp2p1 = $searchcpu2.PercentProcessorTime - $searchcpu1.PercentProcessorTime
  $searcht2t1 = $searchcpu2.Timestamp_Sys100NS - $searchcpu1.Timestamp_Sys100NS
  $searchcpu = [Math]::Round(($searchp2p1 / $searcht2t1 * 100) /$cpu.NumberOfLogicalProcessors, 1)
  $searchmem = [Math]::Round($searchcpu1.WorkingSetPrivate / 1mb,1)
  Write-Host 'Service is' $search.Status', Memory consumed: '$searchmem' MB, CPU Usage: '$searchcpu' %'
  }

  else
  {
  Write-Host Service is $search.Status -BackgroundColor Red
  }

0

ฉันใช้ taskinfo สำหรับกราฟประวัติของความเร็ว CPU / RAM / IO http://www.iarsn.com/taskinfo.html

แต่การระเบิดของการไม่ตอบสนองเสียงดังขึ้นเหมือนเวลาขัดจังหวะเนื่องจากไดรฟ์ HD / SS falty

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.