Отслеживание использования процессора и памяти на процесс

163

Я подозреваю, что одно из моих приложений съедает больше циклов ЦП, чем я хочу. Проблема в том, что это происходит в пакетном режиме, и просто просмотр диспетчера задач мне не помогает, поскольку он показывает только немедленное использование.

Есть ли способ (в Windows) отслеживать историю использования процессора и памяти для какого-либо процесса. Например, я начну отслеживать «firefox» и через час или около того увижу график использования процессора и памяти за этот час.

Я ищу либо готовый инструмент, либо программный способ для достижения этой цели.

Эли Бендерский
источник

Ответы:

167

Просто введите perfmonв Start > Runи нажмите клавишу ВВОД. Когда окно Performance открыто, нажмите на знак +, чтобы добавить новые счетчики на график. Счетчики - это разные аспекты работы вашего ПК, которые по сходству сгруппированы в группы, называемые «Объект производительности».

Для своих вопросов вы можете выбрать объекты производительности «Процесс», «Память» и «Процессор». Затем вы можете увидеть эти счетчики в режиме реального времени

Вы также можете указать утилиту, чтобы сохранить данные о производительности для проверки позже. Для этого выберите «Журналы и оповещения производительности» на левой панели. (Это прямо под консолью System Monitor, которая предоставляет нам вышеупомянутые счетчики. Если его там нет, нажмите «Файл»> «Добавить / удалить оснастку», нажмите «Добавить» и выберите «Журналы и оповещения производительности» в списке ".) В разделе" Журналы и оповещения производительности "создайте новую конфигурацию мониторинга в разделе" Журналы счетчиков ". Затем вы можете добавить счетчики, указать частоту выборки, формат журнала (двоичный или простой текст) и местоположение журнала.

Martin08
источник
1
Какой идеальный интервал для сбора выборки данных в журнале счетчиков?
Стеф Роуз
8
MS, очевидно, изменил пользовательский интерфейс на PerformanceMonitor, так как вы написали это. Любая идея, как вы делаете это в Windows 2008 R2?
Мартин Браун
5
@MartinBrown - нашел это . Это отлично
JNF
2
Кто-нибудь знает, как сделать вторую часть сохранения логов на Vista? Кажется, нигде нет «
Журналов
11
Щелкните правой кнопкой мыши Data Collector Sets-> User Defined. Выберите New-> Data Collector Set. Дайте ему имя и выберите «Создать вручную». Нажмите кнопку "Далее. Выберите Счетчик производительности. Нажмите кнопку "Далее. Добавьте счетчики производительности и введите интервал выборки. Затем в разделе «Сборщики данных» щелкните правой кнопкой мыши свой набор и нажмите «Пуск». Через некоторое время вы щелкните правой кнопкой мыши свой набор и нажмите «Стоп». Затем вы можете найти отчет в разделе Отчеты-> Пользовательский-> Ваш набор. Щелкните правой кнопкой мыши по графику и выберите «Сохранить данные как».
Гремио
43

Process Explorer может отображать общее время процессора, затраченное процессом, а также график истории для процесса.

Найл
источник
3
Итак, как бы вы использовали его, чтобы найти процесс, который случайным образом начинает использовать больше памяти или мощности процессора за короткий промежуток времени. Не могли бы вы уточнить?
Xitcod13
Щелкните правой кнопкой мыши заголовки столбцов, выберите «Выбрать столбцы», затем выберите «История ЦП» в разделе «Производительность процесса»
Laurent
Вы можете сбросить его на ноль?
Simon_Weaver
Могу ли я войти в файл, потребление памяти данным PID?
Рой
Просто хочу отметить для других пользователей: график ЦП для каждого процесса начинает запись только после того, как вы впервые его открываете, даже если Process Explorer был открыт, поэтому этот метод практически бесполезен для захвата спорадического события и попытки его изолировать в единый процесс. Я укажу, что если вы щелкнете по графику центрального процессора системы (который начинает записываться после открытия Process Explorer) и наведете указатель мыши на любую точку, он покажет процесс, который использовал процессор больше всего в этой точке.
SUM1
19

Используя perfmon.exe, я попытался использовать счетчик «Private Bytes» в разделе «Process» для отслеживания использования памяти, и он работает хорошо.

CppNoob
источник
1
Это правильный ответ. Вы также можете получить информацию о процессоре в разделе Процесс. Нажмите на Process, затем выберите ваше приложение (Firefox в вашем примере) под экземплярами выбранного объекта.
Крис
11

Может быть, вы можете использовать это. Он должен работать для вас и сообщит время процессора для указанного процесса.

@echo off
: Rich Kreider <rjk@techish.net>
: report processor time for given process until process exits (could be expanded to use a PID to be more
: precise)
: Depends:  typeperf
: Usage:  foo.cmd <processname>

set process=%~1
echo Press CTRL-C To Stop...
:begin
for /f "tokens=2 delims=," %%c in ('typeperf "\Process(%process%)\%% Processor Time" -si 1 -sc 1 ^| find /V "\\"') do (
if %%~c==-1 (
goto :end
) else (
echo %%~c%%
goto begin
)
)

:end
echo Process seems to have terminated.
Рич Крейдер
источник
7

Я согласен, perfmon.exe позволяет вам добавлять счетчики (щелкните правой кнопкой мыши на правой панели) для любого процесса, который вы хотите отслеживать.

Производительность объекта: проверка процесса «Выберите экземпляры из списка» и выберите Firefox.

Ади Романтика
источник
1
Спасибо. Как я могу увидеть историю использования процессора за определенное время, например, за час?
Эли Бендерский
6

WMI - это инструментарий управления Windows, и он встроен во все последние версии Windows. Это позволяет программно отслеживать такие вещи, как использование процессора, дисковый ввод-вывод и использование памяти.

Perfmon.exe является интерфейсом GUI для этого интерфейса и может отслеживать процесс, записывать информацию в журнал и позволяет анализировать журнал после факта. Это не самая элегантная программа в мире, но она выполняет свою работу.

doflynn
источник
5
Технически perfmon - это интерфейс к основному API-интерфейсу счетчика производительности Windows, который предшествовал WMI на многие годы. WMI также предоставляет API счетчика производительности в своем пространстве имен.
Роб Уокер
2

Process Lasso больше предназначен для автоматизации процессов и оптимизации классов приоритетов, а не графиков. Тем не менее, он делает предложение историю использования ЦП на процесс (нарисованный в виде белой линии на графике) , но это НЕ предлагают историю использования памяти каждого процесса.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я являюсь автором Process Lasso, но на самом деле я не одобряю его здесь - так как есть лучшие решения (perfmon - лучший).

Лучшая вещь - это монитор ресурсов и производительности Windows Vista +. Он может отслеживать использование процессором, памятью, сетью и диском доступов процессами с течением времени. Это отличная утилита для системной информации, которая должна была быть создана давно. Если я не ошибаюсь, он может отслеживать процессорные ресурсы процессора и использование памяти с течением времени (среди всего перечисленного).

dyasta
источник
2

Вы также можете попробовать использовать скрипт C # / Perl / Java для получения данных об использовании с помощью команд WMI, и ниже приведены шаги для этого.

Нам нужно выполнить 2 запроса WMI Select и применить формулу загрузки CPU%

1. Получить общее количество логических процессов

select NumberOfLogicalProcessors from Win32_ComputerSystem

2. Чтобы получить значения PercentProcessorTime, TimeStamp_Sys100NS (была применена формула использования ЦП для получения фактического процента использования) и WorkingSetPrivate (RAM) минимум 2 раза с интервалом ожидания 1 секунда

select * from Win32_PerfRawData_PerfProc_Process where IDProcess=1234

3. Применить формулу загрузки ЦП

CPU%= ((p2-p1)/(t2-t1)*100)/NumberOfLogicalProcessors

p2 указывает PercentProcessorTime, извлеченный во второй раз, а p1 указывает PercentProcessorTime, извлеченный в первый раз, t2 и t1 для TimeStamp_Sys100NS.

Пример Perl-кода для этого можно найти по ссылке http://www.craftedforeveryone.com/cpu-and-ram-utilization-of-an-application-using-perl-via-wmi/

Эта логика применяется ко всем языкам программирования, которые поддерживают запросы WMI

Kaarthikeyan
источник
WMI и Powershell?
PreguntonCojoneroCabrón
2

Хотя я не пробовал это, ProcDump кажется лучшим решением.

Описание с сайта:

ProcDump - это утилита командной строки, основной целью которой является мониторинг приложения для скачков ЦП и создание аварийных дампов во время скачка, которые администратор или разработчик может использовать для определения причины скачка. ProcDump также включает мониторинг зависших окон (используя то же определение зависания окон, что и в Windows и диспетчере задач), мониторинг необработанных исключений и может создавать дампы на основе значений счетчиков производительности системы. Он также может служить общей утилитой процесса, которую вы можете встроить в другие скрипты.

Sean
источник
1

Хм, я вижу, что Process Explorer может это сделать, хотя его графики не слишком удобны. Все еще ищу альтернативные / лучшие способы сделать это.

Эли Бендерский
источник
1

Под Windows 10 диспетчер задач может показывать суммарные часы работы процессора. Просто перейдите на вкладку «История приложений» и «Удалить историю использования». Теперь оставьте все запущенным на час или два:

Windows 10 совокупное время процессора

Что это НЕ делает, так это разбивает использование в браузерах по вкладкам. Довольно часто неактивные вкладки выполняют огромную работу, каждая открытая вкладка использует энергию и замедляет работу вашего ПК.

Брайс
источник
1

Требовалось получить статус и использование процессора / памяти некоторых конкретных серверов Windows. Я использовал ниже скрипт:

Это пример службы поиска Windows.

  $cpu = Get-WmiObject win32_processor
  $search = get-service "WSearch"
  if ($search.Status -eq 'Running')
  {
  $searchmem = Get-WmiObject Win32_Service -Filter "Name = 'WSearch'"
  $searchid = $searchmem.ProcessID
  $searchcpu1 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
  Start-Sleep -Seconds 1
  $searchcpu2 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
  $searchp2p1 = $searchcpu2.PercentProcessorTime - $searchcpu1.PercentProcessorTime
  $searcht2t1 = $searchcpu2.Timestamp_Sys100NS - $searchcpu1.Timestamp_Sys100NS
  $searchcpu = [Math]::Round(($searchp2p1 / $searcht2t1 * 100) /$cpu.NumberOfLogicalProcessors, 1)
  $searchmem = [Math]::Round($searchcpu1.WorkingSetPrivate / 1mb,1)
  Write-Host 'Service is' $search.Status', Memory consumed: '$searchmem' MB, CPU Usage: '$searchcpu' %'
  }

  else
  {
  Write-Host Service is $search.Status -BackgroundColor Red
  }
Просенджит Сен
источник
0

Я использую taskinfo для отображения истории скорости CPU / RAM / IO. http://www.iarsn.com/taskinfo.html

Но всплески неотзывчивости, больше напоминают время прерывания из-за сбойного HD / SS накопителя.

Террик
источник