Программно получать статистику по отдельным процессам в Windows?

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

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

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

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

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

5 ответов

Решение

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

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

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

После некоторых исследований вот что я придумал:

  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:-)

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

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

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

Редактировать: я замечаю, что он говорит "Programatics" (это было сказано, что вчера?)

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

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

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

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

Наслаждаться.

Используйте ETW с EVENT_TRACE_FLAG_NETWORK_TCPIP сделает всю работу.

Другие вопросы по тегам