2009-03-10 8 views
11

J'aimerais savoir quels processus utilisent mon réseau. C'est assez facile sous Linux, mais je suis perplexe quant à la façon de faire cela dans Windows. Essentiellement, je voudrais, pour chaque processus, savoir combien d'octets il a lu/écrit sur le réseau au cours d'une période de temps. Si je pouvais connaître les adresses IP/numéros de port, etc., ce serait génial.Obtenir par programme des statistiques réseau par processus sur Windows?

Des pointeurs? Windows Vista/Windows 2008 semble pouvoir le faire dans Resource Monitor. Comment font-ils? Quel est l'overhead? Je veux faire cela dans mon propre code, donc les utilitaires (TCPView, PerfMon) ne me sont pas utiles. J'aimerais également avoir des compteurs d'E/S réseau et disque séparés, donc les compteurs de performance par défaut ne suffisent pas.

Windows XP, 2003, Vista, 2008 et 7 sont préférés. Win32 ou COM OK.

+0

De les réponses jusqu'à présent, il semble que les gens pensent que vous cherchez un utilitaire pour le faire avec. Êtes-vous à la recherche d'un outil ou cherchez-vous à le programmer vous-même dans votre propre application? Je suggère de clarifier, et de nous faire savoir quel environnement de programmation vous utilisez si approprié, etc – Jay

Répondre

1

J'ai écrit une solution à cela.

Un pilote de filtre TDI pour collecter les statistiques, un service qui communique avec le pilote et obtient les statistiques une fois par seconde. Comme le filtre se trouve sur la couche TDI, je sais quelles sockets appartiennent à quelles applications. Le service est un serveur pour ces données, l'offrant via la mémoire partagée à des clients tiers arbitraires via une API que j'ai écrite. J'ai écrit une interface graphique et un client en ligne de commande.

Vous pouvez également envoyer des transmissions de forme de bande passante (par interface et/ou application et/ou socket) et regarder des données passant sur une socket en temps réel, dans une fenêtre.

+1

où est votre solution ???? – mustafabar

+0

Je sais! Je me demandais aussi pourquoi j'avais obtenu une "solution acceptée". –

+2

Je vais prendre votre parole que vous avez examiné ce problème et décidé que "écrire un pilote de filtre TDI personnalisé" était la meilleure solution. J'ai supposé que si vous aviez du code que vous auriez pu publier, vous l'auriez fait, et je ne suis pas une de ces personnes qui dit "show m3 the c0deZ!". Me pointer dans la bonne direction, c'est beaucoup, merci. –

1

Vous seriez surpris par les choses que vous pouvez tirer de Perfmon. Relevez-le, faites un clic droit dans la zone du graphique et sélectionnez "Add Counters ...". Surfez autour et voir si quelque chose fait ce que vous voulez. De la lecture de ce que vous me demandez, je choisirais "Process" comme objet de performance, et commencerais à sélectionner des coupables dans la liste des processus, avec peut-être des compteurs "IO Data Bytes/sec" surveillés. Si vous vous trompez là-dedans, vous pouvez trouver quelque chose de plus utile à regarder.

Modifier: Je remarque qu'il dit « Programatically » (at-il dit hier?)

Eh bien, vous pouvez réellement obtenir à peu près toutes les informations Perfmon obtient du registre avec la clé HKEY_PERFORMANCE_DATA. Je pense que c'est ce que Perfmon énumère et utilise, donc vous devriez être capable de fouiller avec perfmon pour voir ce qui existe et travaille pour vous, puis écrire du code pour le lire en temps réel dans votre propre programme. L'une des choses vraiment intéressantes à propos de cette méthode, c'est qu'elle fonctionne même à distance, si vous avez les bons privilèges.

+2

-1: Octets IO dans perfom roule disque et réseau IO ensemble. –

+0

C'est vrai. Cependant, si vous n'exécutez aucun élément qui nécessite une grande quantité d'E/S disque, cela devrait plutôt vous convenir. –

1

Vous devrez utiliser l'API IPHelper.

Voici un bon article détaillant l'utilisation de .NET: http://www.codeproject.com/KB/IP/iphlpapi.aspx

Profitez.

+0

Cela ne semble pas contenir de statistiques par processus. –

+0

Non, mais il relie un processus à une connexion réseau. C'est une pièce du puzzle. –

+0

Certains détails seraient appréciés. –

3

Après tout à fait de la recherche est ici ce que je suis venu avec:

  1. Il y a un certain nombre de postes dans divers forums demandant cette même information.
  2. Le seul possible solution programmatique que j'ai vu était d'utiliser le suivi des événements pour Windows (ETW). Cela prendrait un petit livre pour expliquer/comprendre.
  3. Les compteurs PERF, qui peuvent être obtenus à partir du registre, ne sont pas compatibles avec Powershell. Ils utilisent des structures de données conçues pour être consommées par les programmes C/C++. URL d'un exemple assez complet: http://msdn.microsoft.com/en-us/library/windows/desktop/aa372138(v=vs.85).aspx
  4. SysInternals a TCPVIEW qui montre l'utilisation du réseau par processus. Lorsque vous démarrez la plupart des processus ne montrent aucune utilisation. Il semble ne recueillir que des informations d'utilisation pour la période de temps qu'il est en cours d'exécution. Ce qui donne du poids à l'idée que ETW est utilisé.
  5. Si je parcourais des sites Web avec IE9, je verrais les processus créés dans TCPVIEW. Dans la plupart des cas, les processus disparaissent (se terminent) dans une minute environ - avec les statistiques du processus.
  6. Similairement à ProcessExplorer, lorsque les processus sont créés, ils sont surlignés en vert, et lorsqu'ils sont détruits, ils sont surlignés en rouge.
  7. Les processus en rouge disparaissent après la prochaine mise à jour. La fréquence de mise à jour peut être de 1, 2 ou 5 secondes. Cependant, il existe des paramètres de registre, HKEY_CURRENT_USER \ Software \ Sysinternals \ TCPView \ Settings qui peuvent être modifiés pour définir d'autres fréquences de rafraîchissement. If est un DWORD au décalage 0x98, et est en millisecondes.
  8. TCPVIEW dispose d'un élément de menu "Enregistrer"/"Enregistrer sous". La sortie est un fichier texte délimité par des espaces dont les statistiques d'utilisation par processus sont actuellement affichées dans l'interface graphique. Voici un exemple de ligne du fichier. Les chiffres à la fin de la ligne sont reçus pkts/sec, a reçu octets/sec, transmis pkts/s et octets/sec, (pas nécessairement dans cet ordre) iexplore.exe 864 TCP tin 61207 a96-17-203-64.deploy.akamaitechnologies.com http ESTABLISHED 2 12,928 8 9,420

Alors ...

Une solution possible consiste à utiliser TCPVIEW et à le contrôler via des raccourcis clavier générés par programme à partir d'un script. Vous pouvez définir l'intervalle d'actualisation sur 1, 10, 30, etc. minutes et demander au script d'envoyer les séquences de touches pour que TCPVIEW enregistre la sortie dans un fichier. Vous souhaiterez probablement que le script envoie les séquences de touches à la moitié ou au tiers de l'intervalle d'actualisation, afin de vous assurer que vous obtenez un instantané au moins équivalent à 1/2 ou 2/3 de l'intervalle d'actualisation. Vous pouvez importer le fichier en utilisant Import-CSV et le manipuler facilement dans le script.

Ou ...

Vous pouvez obtenir masochistes et utiliser ETW.

Ou ...

Vous pourriez se déchirer et le port système de fichiers proc de Linux (qui, comme vous l'avez dit, est beaucoup plus facile à utiliser à partir de scripts) vers Windows :-)

Questions connexes