Программно получать статистику по отдельным процессам в Windows? - PullRequest
12 голосов
/ 10 марта 2009

Я хотел бы узнать, какие процессы используют мою сеть. Это довольно просто в Linux, но я озадачен тем, как это сделать в Windows.

По сути, я бы хотел, чтобы каждый процесс знал, сколько байтов он прочитал / записал в сеть за определенный период времени. Если бы я мог знать IP-адреса / номера портов и т. Д., Это было бы здорово.

Есть указатели? Windows Vista / Windows 2008, кажется, в состоянии сделать это в Resource Monitor. Как они это делают? Что за накладные расходы?

Я хочу сделать это в своем собственном коде, поэтому утилиты (TCPView, PerfMon) мне не нужны. Мне также хотелось бы иметь отдельные счетчики дискового и сетевого ввода-вывода, поэтому стандартных счетчиков производительности недостаточно.

Windows XP, 2003, Vista, 2008 и 7 предпочтительнее. Win32 или COM OK.

Ответы [ 5 ]

3 голосов
/ 05 июля 2013

После тщательного исследования вот что я придумала:

  1. На разных форумах есть несколько постов с такой же информацией.
  2. Единственное возможное программное решение, которое я видел, заключалось в использовании Event Tracing для Windows (ETW). Это займет небольшую книгу, чтобы объяснить / понять.
  3. Счетчики PERF, которые можно получить из реестра, не являются дружественными к Powershell. Они используют структуры данных, которые предназначены для использования программами C / C ++. URL довольно полного примера: http://msdn.microsoft.com/en-us/library/windows/desktop/aa372138(v=vs.85).aspx
  4. SysInternals имеет TCPVIEW, который показывает использование сети процессом. Когда вы запускаете его, большинство процессов не показывают никакого использования. Похоже, он собирает информацию об использовании только за период времени, в течение которого он работает. Что придает вес идее об использовании ETW.
  5. Если бы я просматривал веб-сайты с помощью IE9, я увидел бы процессы, создаваемые в TCPVIEW. В большинстве случаев процессы исчезают (прекращаются) в течение минуты или около того - вместе со статистикой процесса.
  6. Как и в ProcessExplorer, при создании процессов они выделяются зеленым цветом, а при разрушении - красным.
  7. Процессы, выделенные красным цветом, исчезают после следующего обновления. Частота обновления может составлять 1, 2 или 5 секунд. Однако есть параметры реестра, HKEY_CURRENT_USER \ Software \ Sysinternals \ TCPView \ Settings, которые можно изменить для установки других частот обновления. If - DWORD со смещением 0x98 и в миллисекундах.
  8. В TCPVIEW есть пункт меню «Сохранить» / «Сохранить как». Выходными данными является текстовый файл с разделителями-пробелами, который имеет статистику использования каждого процесса, которая в настоящее время отображается в графическом интерфейсе. Ниже приведен пример строки из файла. Числа в конце строки - это принятые пкц / сек, принятые байты / сек, переданные пкц / сек и байты / сек (не обязательно в этом порядке) iexplore.exe 864 TCP tin 61207 a96-17-203-64.deploy.akamaitechnologies.com http ESTABLISHED 2 12,928 8 9,420

Итак ...

Возможное решение - использовать TCPVIEW и управлять им с помощью нажатий клавиш, сгенерированных программно из скрипта. Вы можете установить интервал обновления в 1, 10, 30 и т. Д. Минут, и скрипт будет отправлять нажатия клавиш, чтобы TCPVIEW сохранял вывод в файл. Возможно, вы захотите, чтобы скрипт отправлял нажатия клавиш с половиной или третью интервала обновления, чтобы убедиться, что вы получаете снимок, который по меньшей мере равен 1/2 или 2/3 интервала обновления. Вы можете импортировать файл с помощью Import-CSV и легко манипулировать им в скрипте.

Или ...

Вы можете стать мазохистом и использовать ETW.

Или ...

Вы можете выйти из глубокого конца и портировать файловую систему proc в Linux (которую, как вы заметили, намного проще использовать из скриптов) в Windows: -)

1 голос
/ 10 марта 2009

Вам нужно будет использовать IPHelper API.

Вот хорошая статья, подробно описывающая его использование из .NET: http://www.codeproject.com/KB/IP/iphlpapi.aspx

Наслаждайтесь.

1 голос
/ 27 марта 2009

Я написал решение для этого.

Драйвер фильтра TDI для сбора статистики, сервис, который связывается с драйвером и получает статистику один раз в секунду. Поскольку фильтр находится на уровне TDI, я знаю, какие сокеты и к каким приложениям принадлежат. Служба является сервером для этих данных, предлагая их через общую память произвольным сторонним клиентам через API, который я написал. Я написал графический интерфейс и клиент командной строки.

Вы также можете отправлять формы полосы пропускания (для интерфейса и / или приложения и / или сокета) и наблюдать за передачей данных в реальном времени через сокет в окне.

1 голос
/ 10 марта 2009

Вы будете поражены тем, что вы можете получить от Perfmon.

Поднимите его, щелкните правой кнопкой мыши в области графика и выберите «Добавить счетчики ...». Погуляй вокруг и посмотри, что делает, что хочешь.

Из моего прочтения того, что вы спрашиваете, я выбираю «Процесс» в качестве объекта производительности и начинаю выбирать наиболее вероятных виновных из списка процессов, причем возможно отслеживание счетчиков «IO Data Bytes / sec». Если вы возитесь там, то можете найти что-то более полезное для вас.

Редактировать : Я замечаю, что в нем написано «Программно» (вчера это говорилось?)

Что ж, вы можете получить практически всю информацию, которую Perfmon получает из реестра, с помощью ключа HKEY_PERFORMANCE_DATA. Я думаю, что это то, что Perfmon перечисляет и использует, так что вы должны иметь возможность поэкспериментировать с perfmon, чтобы увидеть, что там работает и работает для вас, а затем написать код для чтения в реальном времени в вашей собственной программе.

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

0 голосов
/ 19 февраля 2019

Использование ETW с EVENT_TRACE_FLAG_NETWORK_TCPIP выполнит эту работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...