اسم العملية ذات أعلى استخدام لوحدة المعالجة المركزية

StackOverflow https://stackoverflow.com/questions/51684

سؤال

انا املك ساموريزي التكوين الذي يعرض رسمًا بيانيًا لاستخدام وحدة المعالجة المركزية مشابهًا لمدير المهام.

كيف يمكنني أيضًا عرض اسم العملية مع أعلى نسبة استخدام لوحدة المعالجة المركزية حاليًا؟

أرغب في تحديث هذا، على الأكثر، مرة واحدة في الثانية.يمكن لـ Samurize استدعاء أداة سطر الأوامر وعرض مخرجاتها على الشاشة، لذلك قد يكون هذا أيضًا خيارًا.


مزيد من التوضيح:

لقد قمت بالتحقق من كتابة تطبيق c# .NET لسطر الأوامر الخاص بي لتعداد المصفوفة التي تم إرجاعها من System.Diagnostics.Process.GetProcesses()، ولكن لا يبدو أن فئة مثيل العملية تتضمن خاصية النسبة المئوية لوحدة المعالجة المركزية.

هل يمكنني حساب هذا بطريقة ما؟

هل كانت مفيدة؟

المحلول

مع باورشيل:

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

يعود إلى حد ما مثل:

  16.8641632 System
   12.548072 csrss
  11.9892168 powershell

نصائح أخرى

ما تريد الحصول عليه هو الاستخدام الفوري لوحدة المعالجة المركزية (نوعًا ما) ...

في الواقع، الاستخدام الفوري لوحدة المعالجة المركزية لعملية ما غير موجود.بدلاً من ذلك، يتعين عليك إجراء قياسين وحساب متوسط ​​استخدام وحدة المعالجة المركزية، فالصيغة بسيطة للغاية:

AvgCpuUsed = [TotalCPUTime(process,time2) - TotalCPUTime(process,time1)] / [time2-time1]

كلما كان الفرق بين Time2 وTime1 أقل، كلما كان قياسك "فوريًا" أكثر.يقوم Windows Task Manager بحساب استخدام وحدة المعالجة المركزية بفاصل زمني قدره ثانية واحدة.لقد وجدت أن هذا أكثر من كافي وقد تفكر في القيام بذلك بفواصل زمنية مدتها 5 ثوانٍ لأن عملية القياس نفسها تستهلك دورات وحدة المعالجة المركزية ...

لذا، أولاً، للحصول على متوسط ​​وقت وحدة المعالجة المركزية

    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;
}

الآن، من أجل التحميل "الفوري" لوحدة المعالجة المركزية، ستحتاج إلى فئة متخصصة:

 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;
    }
  }
}

يجب عليك استدعاء هذا الفصل من جهاز توقيت (أو أي طريقة فاصلة تريدها). كل عملية تريد مراقبتها, ، إذا كنت تريد جميع العمليات فقط استخدم عملية.احصل على العمليات طريقة ثابتة

بناءً على إجابة فريدريك واستخدام الكود الموجود أسفل الصفحة هنا (للحصول على مثال للاستخدام انظر هذا post) للانضمام إلى المجموعة الكاملة من العمليات التي تم الحصول عليها منها Get-Process, ، نحصل على ما يلي:

$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

الذي يعطي مثالا لإخراج

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

قد تكون قادرا على استخدام بمون.exe لهذا.يمكنك الحصول عليه كجزء من أدوات مجموعة موارد Windows (الرابط هو إصدار Server 2003، والذي يبدو أنه يمكن استخدامه في XP أيضًا).

بطريقة ما

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

لم يكن الحصول على معلومات وحدة المعالجة المركزية من الجهاز البعيد.كان علي أن أتوصل إلى هذا.

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

شكرا على الصيغة، جورج.لا أفهم تمامًا سبب ضرورة القسمة على عدد النوى، لكن الأرقام التي أحصل عليها تتطابق مع مدير المهام.إليك رمز بوويرشيل الخاص بي:

$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

يمكنك أيضًا القيام بذلك بهذه الطريقة:-

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];
    }

الاستخدام:-

static void Main()
    {
        Process mxp=getProcessWithMaxCPUUsage();
        Console.WriteLine(mxp.ProcessName);
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top