Подтвердить что ты не робот

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

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

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

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

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

Предпочитаются Windows XP, 2003, Vista, 2008 и 7. Win32 или COM OK.

4b9b3361

Ответ 1

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

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

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

Ответ 2

После довольно подробного исследования, в котором я придумал:

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

Итак...

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

Или...

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

Или...

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

Ответ 3

Вы были бы поражены тем, что вы можете выбраться из Перфмона.

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

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

Edit: Я замечаю, что он говорит "Программно" (вчера он сказал это?)

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

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

Ответ 4

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

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

Enjoy.