2009-03-10 17 views
11

Me gustaría saber qué procesos están usando mi red. Esto es bastante fácil en Linux, pero no estoy seguro de cómo hacerlo en Windows.¿Obtiene programáticamente estadísticas de red por proceso en Windows?

Básicamente, me gustaría, para cada proceso, saber cuántos bytes ha leído/escrito en la red durante un período de tiempo. Si pudiera conocer las direcciones IP/números de puertos, etc., sería increíble.

¿Alguna sugerencia? Windows Vista/Windows 2008 parece ser capaz de hacer esto en el Monitor de recursos. ¿Cómo lo hicieron? ¿Cuál es el costo?

Quiero hacer esto en mi propio código, por lo que las utilidades (TCPView, PerfMon) no son útiles para mí. También me gustaría tener contadores de E/S de disco y red separados, por lo que los contadores de rendimiento predeterminados no son suficientes.

Se prefieren Windows XP, 2003, Vista, 2008 y 7. Win32 o COM OK.

+0

De las respuestas hasta el momento, parece que la gente piensa que está buscando una utilidad para hacer esto. ¿Estás buscando una herramienta o estás buscando programarla tú mismo en tu propia aplicación? Sugiero aclarar y dejarnos saber qué entorno de programación está utilizando, si es necesario, etc. – Jay

Respuesta

1

Escribí una solución para esto.

Un controlador de filtro TDI para recopilar las estadísticas, un servicio que se comunica con el controlador y obtiene las estadísticas una vez por segundo. Como el filtro está en la capa TDI, sé qué sockets pertenecen a qué aplicaciones. El servicio es un servidor para estos datos, ofreciéndolo a través de memoria compartida a clientes arbitrarios de terceros a través de una API que escribí. Escribí una GUI y un cliente de línea de comando.

También puede enviar envíos de forma de ancho de banda (por interfaz y/o aplicación y/o zócalo) y ver los datos pasando por un zócalo en tiempo real, en una ventana.

+1

¿dónde está tu solución? – mustafabar

+0

¡Lo sé! Yo también me preguntaba por qué me dieron "solución aceptada". –

+2

Voy a tomar su palabra de que usted miró este problema y decidió que "escribir un controlador de filtro TDI personalizado" era la mejor solución. Supuse que si tenía un código que podría haber publicado, lo habría hecho, y yo no soy una de esas personas que dice "¡demuestre m3 el códice!". Señalarme en la dirección correcta es mucho, gracias. –

1

Se sorprenderá de las cosas que puede obtener de Perfmon.

Despláguelo, haga clic derecho en el área del gráfico y seleccione "Agregar contadores ...". Navegue alrededor y vea si algo hace lo que quiere.

Al leer lo que está preguntando, seleccionaría "Proceso" como mi objeto de rendimiento, y comenzaría a seleccionar probables culpables de la lista de procesos, con tal vez observadores "IO Data Bytes/sec". Sin embargo, si te metes por ahí, puede que encuentres algo más útil que puedas mirar.

Editar: estoy notando que dice "Programatically" (Qué decía que ayer?)

Bueno, en realidad se puede conseguir casi toda la información que recibe de Monitor de rendimiento del registro con la clave HKEY_PERFORMANCE_DATA. Creo que eso es lo que Perfmon enumera y usa, por lo que debería poder hojear perfmon para ver qué hay allí y funciona para usted, luego, escriba el código para leerlo en tiempo real en su propio programa.

Una de las cosas realmente buenas de este método es que incluso funciona de forma remota, si tiene los privilegios correctos.

+2

-1: los bytes de IO en la función enrollan el disco y la red IO juntos. –

+0

Eso es verdad. Sin embargo, si no está ejecutando nada que tenga alguna razón para hacer muchas E/S de disco, debería funcionar bastante bien para usted. –

1

Deberá utilizar la API de IPHelper.

Aquí es un buen artículo que detalla el uso de .NET: http://www.codeproject.com/KB/IP/iphlpapi.aspx

disfrutar.

+0

Eso no parece contener estadísticas por proceso. –

+0

No, pero sí vincula un proceso a una conexión de red. Es una pieza del rompecabezas. –

+0

Se agradecerán algunos detalles. –

3

Después de bastante de investigación aquí es lo que he llegado con:

  1. Hay una serie de puestos en diversos foros que piden esta misma información.
  2. La única solución programática posible que vi fue utilizar Event Tracing para Windows (ETW). Eso tomaría un pequeño libro para explicar/entender.
  3. Los contadores PERF, que se pueden obtener del registro, no son compatibles con Powershell. Usan estructuras de datos diseñadas para ser consumidas por los programas C/C++. URL de un ejemplo bastante completo: http://msdn.microsoft.com/en-us/library/windows/desktop/aa372138(v=vs.85).aspx
  4. SysInternals tiene TCPVIEW que muestra el uso de la red por proceso. Cuando lo inicias, la mayoría de los procesos no muestran ningún uso. Parece que solo recopila información de uso para el período de tiempo que se está ejecutando. Lo que da peso a la idea de que ETW se está utilizando.
  5. Si navegué por sitios web con IE9, vería procesos creados en TCPVIEW. En la mayoría de los casos, los procesos desaparecerían (terminarían) en un minuto más o menos, junto con las estadísticas del proceso.
  6. De forma similar a ProcessExplorer, cuando se crean procesos, se resaltan en verde, y cuando se destruyen se resaltan en rojo.
  7. Los procesos resaltados en rojo desaparecen después de la próxima actualización. La frecuencia de actualización puede ser de 1, 2 o 5 segundos. Sin embargo, hay una configuración de registro, HKEY_CURRENT_USER \ Software \ Sysinternals \ TCPView \ Settings que se puede modificar para establecer otras frecuencias de actualización. If es un DWORD en offset 0x98, y está en milisegundos.
  8. TCPVIEW tiene una opción de menú "Guardar"/"Guardar como". El resultado es un archivo de texto delimitado por espacios que tiene las estadísticas de uso por proceso que se muestran actualmente en la GUI. A continuación se muestra una línea de muestra del archivo. Los números al final de la línea se reciben pkts/seg, recibió bytes/seg, pkts de transmisión/seg y bytes/seg, (no necesariamente en ese orden) iexplore.exe 864 TCP tin 61207 a96-17-203-64.deploy.akamaitechnologies.com http ESTABLISHED 2 12,928 8 9,420

Entonces ...

Una posible solución es usar TCPVIEW y controlarlo mediante pulsaciones de teclas generadas mediante programación a partir de un script. Puede establecer el intervalo de actualización en 1, 10, 30, etc. minutos y hacer que la secuencia de comandos envíe las teclas para que TCPVIEW guarde la salida en un archivo. Probablemente desee que la secuencia de comandos envíe las pulsaciones de teclado a la mitad o un tercio del intervalo de actualización, para asegurarse de obtener una instantánea que sea al menos igual a 1/2 o 2/3 del intervalo de actualización. Puede importar el archivo usando Import-CSV y manipularlo fácilmente dentro del script.

O ...

Usted podría conseguir masoquista y utilizar ETW.

O ...

Se podía ir por las paredes y el puerto del sistema de ficheros proc de Linux (que, como se anotó, es mucho más fácil de usar desde scripts) a Windows :-)

Cuestiones relacionadas