2008-09-09 39 views
5

Tôi có cấu hình Samurize hiển thị biểu đồ sử dụng CPU tương tự như Trình quản lý tác vụ.Tên của quy trình có mức sử dụng CPU cao nhất

Làm cách nào để hiển thị tên của quá trình với tỷ lệ sử dụng CPU cao nhất hiện tại?

Tôi muốn cập nhật điều này, nhiều nhất là một lần mỗi giây. Samurize có thể gọi một công cụ dòng lệnh và hiển thị đầu ra của nó trên màn hình, vì vậy đây cũng có thể là một tùy chọn.


Tiếp tục làm rõ:

tôi đã điều tra bằng văn bản của ứng dụng dòng lệnh C# .NET tôi để liệt kê các mảng trở về từ System.Diagnostics.Process.GetProcesses(), nhưng lớp Process dụ dường như không để bao gồm thuộc tính phần trăm CPU.

Tôi có thể tính toán điều này theo một cách nào đó không?

+0

đây có phải là một câu hỏi về cách sử dụng các gói Samurize? Có lẽ bạn có thể thuật lại câu hỏi lập trình? –

Trả lời

-3

Với PowerShell:

Get-Process | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName -hidetableheader 

lợi nhuận hơi như:

16.8641632 System 
    12.548072 csrss 
    11.9892168 powershell 
+1

loại bỏ các piope giữa định dạng bảng và cpua – JJS

+8

cũng, rõ ràng, CPU không cung cấp cho bạn phần trăm của CPU được sử dụng. đó là tổng thời gian xử lý tính bằng giây mà quá trình đã hoạt động. powershell "get-process | get-member | Chọn tên đối tượng, Định nghĩa | sắp xếp-đối tượng Tên | định dạng danh sách" CPU được định nghĩa là {get = $ this.TotalProcessorTime.TotalSeconds;} – JJS

1

Bạn có thể sử dụng Pmon.exe cho việc này. Bạn có thể lấy nó như một phần của Windows Resource Kit tools (liên kết đến phiên bản Server 2003, có thể được sử dụng trong XP).

6

gì bạn muốn để có được sử dụng CPU tức thời của nó (loại) ...

Trên thực tế, việc sử dụng CPU ngay lập tức cho một quá trình không tồn tại. Thay vào đó bạn phải thực hiện hai phép đo và tính toán việc sử dụng CPU trung bình, công thức khá đơn giản:

AvgCpuUsed = [TotalCPUTime (quy trình, time2) - TotalCPUTime (quy trình, time1)]/[time2-time1]

chênh lệch Time2 và Time1 thấp hơn, số đo của bạn càng "nhanh". Windows Task Manager tính toán việc sử dụng CPU với một khoảng thời gian một giây. Tôi đã tìm thấy đó là quá đủ và bạn thậm chí có thể xem xét làm việc đó trong khoảng thời gian 5 giây gây ra hành động đo chính nó chiếm các chu kỳ CPU ...

Vì vậy, trước hết, để có được thời gian CPU trung bình

using System.Diagnostics; 

float GetAverageCPULoad(int procID, DateTme from, DateTime, to) 
{ 
    // For the current process 
    //Process proc = Process.GetCurrentProcess(); 
    // Or for any other process given its id 
    Process proc = Process.GetProcessById(procID); 
    System.TimeSpan lifeInterval = (to - from); 
    // Get the CPU use 
    float CPULoad = (proc.TotalProcessorTime.TotalMilliseconds/lifeInterval.TotalMilliseconds) * 100; 
    // You need to take the number of present cores into account 
    return CPULoad/System.Environment.ProcessorCount; 
} 

bây giờ, cho "ăn liền" CPU load bạn sẽ cần một lớp học chuyên ngành:

class ProcLoad 
{ 
    // Last time you checked for a process 
    public Dictionary<int, DateTime> lastCheckedDict = new Dictionary<int, DateTime>(); 

    public float GetCPULoad(int procID) 
    { 
    if (lastCheckedDict.ContainsKey(procID)) 
    { 
     DateTime last = lastCheckedDict[procID]; 
     lastCheckedDict[procID] = DateTime.Now; 
     return GetAverageCPULoad(procID, last, lastCheckedDict[procID]); 
    } 
    else 
    { 
     lastCheckedDict.Add(procID, DateTime.Now); 
     return 0; 
    } 
    } 
} 

Bạn nên gọi lớp đó từ bộ hẹn giờ (hoặc bất kỳ phương pháp khoảng thời gian nào bạn muốn) cho mỗi quá trình bạn muốn theo dõi, nếu bạn muốn tất cả các quy trình chỉ sử dụng phương pháp tĩnh Process.GetProcesses static

0

Bạn cũng có thể làm theo cách này: -

public Process getProcessWithMaxCPUUsage() 
    { 
     const int delay = 500; 
     Process[] processes = Process.GetProcesses(); 

     var counters = new List<PerformanceCounter>(); 

     foreach (Process process in processes) 
     { 
      var counter = new PerformanceCounter("Process", "% Processor Time", process.ProcessName); 
      counter.NextValue(); 
      counters.Add(counter); 
     } 
     System.Threading.Thread.Sleep(delay); 
     //You must wait(ms) to ensure that the current 
     //application process does not have MAX CPU 
     int mxproc = -1; 
     double mxcpu = double.MinValue, tmpcpu; 
     for (int ik = 0; ik < counters.Count; ik++) 
     { 
      tmpcpu = Math.Round(counters[ik].NextValue(), 1); 
      if (tmpcpu > mxcpu) 
      { 
       mxcpu = tmpcpu; 
       mxproc = ik; 
      } 

     } 
     return processes[mxproc]; 
    } 

Cách sử dụng: -

static void Main() 
    { 
     Process mxp=getProcessWithMaxCPUUsage(); 
     Console.WriteLine(mxp.ProcessName); 
    } 
0

Bằng cách nào đó

Get-Process | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName,TotalProcessorTime -hidetableheader

đã không nhận được thông tin CPU từ máy tính từ xa. Tôi phải nghĩ ra điều này.

Get-Counter '\Process(*)\% Processor Time' | Select-Object -ExpandProperty countersamples | Select-Object -Property instancename, cookedvalue| Sort-Object -Property cookedvalue -Descending| Select-Object -First 10| ft -AutoSize

1

Cám ơn công thức, Jorge. Tôi không hiểu tại sao bạn phải chia cho số lõi, nhưng những con số tôi nhận được phù hợp với Task Manager. Đây là mã PowerShell tôi:

$procID = 4321 

$time1 = Get-Date 
$cpuTime1 = Get-Process -Id $procID | Select -Property CPU 

Start-Sleep -s 2 

$time2 = Get-Date 
$cpuTime2 = Get-Process -Id $procID | Select -Property CPU 

$avgCPUUtil = ($cpuTime2.CPU - $cpuTime1.CPU)/($time2-$time1).TotalSeconds *100/[System.Environment]::ProcessorCount 
+0

Cảm ơn ví dụ làm việc! Cuối cùng nhận ra rằng thuộc tính CPU là TotalSeconds của TotalProcessorTime cho quá trình và TotalSeconds chỉ có sẵn như là một đối tượng TimeSpan và không phải là một đối tượng DateTime. – RiverHeart

2

Xây dựng về câu trả lời Frederic và sử dụng mã ở dưới cùng của trang here (cho một ví dụ về việc sử dụng thấy this bưu điện) để tham gia toàn bộ các quá trình nhận được từ Get-Process, chúng tôi nhận như sau:

$sampleInterval = 3 

$process1 = Get-Process |select Name,Id, @{Name="Sample1CPU"; Expression = {$_.CPU}} 

Start-Sleep -Seconds $sampleInterval 

$process2 = Get-Process | select Id, @{Name="Sample2CPU"; Expression = {$_.CPU}} 

$samples = Join-Object -Left $process1 -Right $process2 -LeftProperties Name,Sample1CPU -RightProperties Sample2CPU -Where {$args[0].Id -eq $args[1].Id} 

$samples | select Name,@{Name="CPU Usage";Expression = {($_.Sample2CPU-$_.Sample1CPU)/$sampleInterval * 100}} | sort -Property "CPU Usage" -Descending | select -First 10 | ft -AutoSize 

Mà cho một đầu ra ví dụ về

Name     CPU Usage 
----     --------- 
firefox  20.8333333333333 
powershell_ise 5.72916666666667 
Battle.net    1.5625 
Skype     1.5625 
chrome     1.5625 
chrome   1.04166666666667 
chrome   1.04166666666667 
chrome   1.04166666666667 
chrome   1.04166666666667 
LCore   1.04166666666667 
+1

FYI - Join-Object không phải là lệnh PS gốc. – KERR

Các vấn đề liên quan