uso solucion procesos prioridad porcentaje nada mucha liberar hacer denegado consume como cambiar bajar acceso windows performance operating-system

solucion - uso de cpu 100 windows 7



Nombre del proceso con mayor uso de la CPU (8)

Tengo una configuración de Samurize que muestra un gráfico de uso de CPU similar al Administrador de tareas.

¿Cómo también visualizo el nombre del proceso con el porcentaje de uso de CPU más alto actual?

Me gustaría que esto se actualice, como máximo, una vez por segundo. Samurize puede llamar a una herramienta de línea de comando y mostrar su salida en pantalla, por lo que esta también podría ser una opción.

Más aclaraciones:

He investigado la escritura de mi propia línea de comando aplicación c .NET para enumerar la matriz devuelta por System.Diagnostics.Process.GetProcesses (), pero la clase de instancia de proceso no parece incluir una propiedad de porcentaje de CPU.

¿Puedo calcular esto de alguna manera?




Con PowerShell:

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

devuelve algo así como:

16.8641632 System 12.548072 csrss 11.9892168 powershell


Lo que desea obtener es el uso instantáneo de la CPU (tipo de) ...

En realidad, el uso de CPU instantáneo para un proceso no existe. En su lugar, debe hacer dos mediciones y calcular el uso promedio de la CPU, la fórmula es bastante simple:

AvgCpuUsed = [TotalCPUTime (proceso, tiempo2) - TotalCPUTime (proceso, tiempo1)] / [tiempo2-tiempo1]

Cuanto menor es la diferencia de Time2 y Time1, más "instantánea" será su medición. El Administrador de tareas de Windows calcula el uso de la CPU con un intervalo de un segundo. He descubierto que es más que suficiente y que incluso podría considerar hacerlo en intervalos de 5 segundos porque el acto de medir en sí mismo requiere ciclos de CPU ...

Entonces, primero, para obtener el tiempo promedio de CPU

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

ahora, para la carga "instantánea" de la CPU necesitarás una clase especializada:

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

Debe llamar a esa clase desde un temporizador (o cualquier método de intervalo que desee) para cada proceso que desee supervisar , si desea que todos los procesos solo usen el método estático Process.GetProcesses


También puedes hacerlo de esta manera:

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

Uso:-

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


De algun modo

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

no obtenía la información de la CPU de la máquina remota. Tenía que pensar en esto.

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


Gracias por la fórmula, Jorge. No entiendo muy bien por qué tienes que dividir por el número de núcleos, pero los números que obtengo coinciden con el Administrador de tareas. Aquí está mi código powershell:

$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


Basándonos en la respuesta de Frederic y utilizando el código al final de la página aquí (para un ejemplo de uso, consulte esta publicación) para unirnos al conjunto completo de procesos obtenidos de Get-Process , obtenemos lo siguiente:

$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

Lo que da una salida de ejemplo de

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