Контролировать использование процесса для каждого ядра ЦП
Есть ли способ запросить или вычислить использование ЦП одного процесса на каждое ядро отдельно?
Например,
Название - - - - Core1 - Core2 - Core3 - Core4
firefox.exe - 0,5% - - 0,1% - - 0,2% - - 0,3%
Я знаю программу, называемую "Process Explorer" (Марк Руссинович), которая может это сделать, но как это сделать на С#? Я посмотрел на пространство имен System.Diagnostics
, но не смог найти ничего подходящего для моих требований.
Вот картина того, чего я пытаюсь достичь,
![http://i.stack.imgur.com/XySpQ.png]()
Ответы
Ответ 1
Есть способ получить эту информацию, вам нужно будет использовать отладчик ядра.
Мой подозреваемый был в том, что если Visualizer Concurrency Visualizer может получить эту информацию для создания красивых отчетов и визуализации, вы также можете получить ее из ядра Windows, которое вы используете.
Здесь вы можете увидеть документацию http://msdn.microsoft.com/en-us/library/windows/hardware/ff552961(v=vs.85).aspx.
Но более интересные вещи можно найти, изменив файл Microsoft.ConcurrencyVisualizer.dll, который можно найти в каталоге установки Visual Studio 2012.
Я думаю, вы также можете напрямую использовать эту DLL в своем проекте, хотя вы не можете перераспределять ее по http://msdn.microsoft.com/en-US/vstudio/hh857605#files. Эта DLL доступна автономно здесь http://www.microsoft.com/en-us/download/details.aspx?id=41646.
Идея состоит в том, чтобы узнать, как эта DLL использует Kernel Trace, чтобы узнать, какая тема была в том, что Core и скопировать ее, чтобы получить точную статистику. Кроме того, я думаю, что ProcessExplorer действительно получает некоторую статистику, используя API-интерфейс Kernel Debugger, потому что Visual Studio конфликтует с ним, когда я запускаю инструмент Concurrency Visualizer.
Это будет весело и трудно сделать.
Ответ 2
Смотрите: http://msdn.microsoft.com/pt-br/library/system.diagnostics.performancecounter.aspx
И Как получить использование ЦП в С#?
Ответ 3
Попробуйте ниже (нашла здесь)
int coreCount = 0;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
coreCount += int.Parse(item["NumberOfCores"].ToString());
}
PerformanceCounter[] pc = new PerformanceCounter[coreCount];
for (int i = 0; i < coreCount; i++)
{
pc[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
Console.WriteLine(pc[i].CounterName);
}
Ответ 4
Этот вопрос привлек мое внимание, и я начал изучать его. Давным-давно я тоже имел аналогичное требование, но не смог найти ответ за то же самое.
В конечном счете мне пришлось использовать fall-back и единственный доступный для мониторинга время использования процессорного процессора в% (без какой-либо теоретически расчетной работы или исправлений сродства): Process/% Process Time.
Я увидел график - "Покажите один график для каждого процессора" (моментальный снимок) и начал исследовать "Проводник" сам с удивлением, чтобы выяснить, как ему удается показать, что вы или я (в прошлом) искали.
Ответ на ваш вопрос: "Нет, невозможно узнать об использовании основного процессора для каждого процесса", и ваше предположение о том, что отображается "Исследователь процессов", объясняется в приведенном ниже заявлении, которое я нашел в "procexp". chm "( доступно с загружаемым zip) topic > Process Explorer > System Information > Last Paragraph:
Обратите внимание, что подсказки мыши для графика процессора показывают название процесса, в котором потреблялось большинство процессоров на всей системе в соответствующее время, а не процесс, который потреблял большинство процессоров на конкретном процессоре.
Надеюсь, у меня есть смысл здесь.