Контролировать использование процесса каждым ядром процессора
Есть ли способ запросить или рассчитать загрузку ЦП одного процесса для каждого ядра отдельно?
Например,
Имя - - - - Core1 - Core2 - Core3 - Core4
firefox.exe - 0,5% - - 0,1% - - 0,2% - - 0,3%
Я знаю программу под названием "Process Explorer" (Марк Руссинович), которая может это сделать, но как я могу это сделать в C#? Я посмотрел на System.Diagnostics
пространство имен, но я не смог найти ничего подходящего моим требованиям.
Вот картина того, чего я пытаюсь достичь,
4 ответа
Есть способ получить эту информацию, вам нужно будет использовать отладчик ядра. Я подозревал, что если Visual Studio Concurrency Visualizer может получить эту информацию для создания красивых отчетов и визуализаций, то вы также можете получить ее из ядра Windows для своего использования.
Вы можете увидеть некоторую документацию здесь http://msdn.microsoft.com/en-us/library/windows/hardware/ff552961(v=vs.85).aspx.
Но более интересные вещи можно найти, перевернув файл Microsoft.ConcurrencyVisualizer.dll, который находится в каталоге установки Visual Studio 2012. Я думаю, что вы также можете использовать эту библиотеку напрямую в своем проекте, хотя вы не можете повторно развернуть ее в соответствии с http://msdn.microsoft.com/en-US/vstudio/hh857605. Эта DLL-библиотека доступна отдельно здесь http://www.microsoft.com/en-us/download/details.aspx?id=41646.
Идея состоит в том, чтобы узнать, как эта DLL использует трассировку ядра, чтобы узнать, какой поток был на каком ядре, и воспроизвести его, чтобы получить точную статистику. Кроме того, я думаю, что ProcessExplorer действительно получает некоторую статистику, используя API отладчика ядра, потому что Visual Studio конфликтует с ним, когда я запускаю инструмент Concurrency Visualizer.
Это будет весело и сложно сделать.
Этот вопрос попался на глаза, и я начал изучать его. Долгое время назад у меня тоже было похожее требование, но я не смог найти ответ на этот вопрос.
В конечном итоге мне пришлось использовать запасной вариант и единственный доступный вариант для контроля времени использования процессорного процесса в% ( без каких-либо теоретически рассчитанных работ или исправлений сходства): Процесс / % времени процесса.
Я увидел график - "Показывать один график для каждого процессора" (снимок) и начал с удивлением исследовать "Process Explorer", чтобы выяснить, как удается показать, что вы или я (в прошлом) искали.
Ответ на ваш вопрос таков: "Нет, невозможно выяснить использование процессора одним ядром для каждого процесса", а ваше предположение о том, что показывает "Проводник процессов", объясняется в приведенном ниже предложении, которое я нашел в "procxp.chm" ( доступно с загружаемым zip-файлом) тема> Process Explorer > Информация о системе> Последний абзац:
Обратите внимание, что всплывающие подсказки мыши для графика процессора показывают имя процесса, который потреблял больше всего процессора во всей системе в соответствующее время, а не процесс, который потреблял больше всего процессора на конкретном процессоре
Я надеюсь, что здесь есть смысл.
Попробуйте ниже (нашел это здесь)
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);
}