12

D'abord, un peu d'arrière-plan. Il existe de nombreuses comparaisons de systèmes de contrôle de versions distribuées (DVCS) qui comparent la taille du référentiel ou la vitesse de référence des opérations. Je n'en ai trouvé aucun qui permettrait de comparer les performances réseau de divers DVCS, et divers protocoles utilisés ... en plus de mesurer la vitesse des opérations (commandes) impliquant un réseau comme 'clone', 'pull'/'fetch' ou 'push'.Comment mesurer les performances du réseau (comment comparer le protocole réseau)

J'aimerais savoir comment vous feriez une telle comparaison; comment mesurer les performances réseau d'une application ou comment comparer le protocole réseau. J'envisage ici entre autres également de mesurer la dépendance de la performance sur la bande passante du réseau et la latence (temps de ping) du réseau; certains protocoles sacrifient la latence sous la forme de plus d'échanges aller-retour (négociation) pour envoyer le "pack" final minimal requis.

Je préférerais des solutions impliquant un seul ordinateur, si possible. J'aimerais voir des solutions open source, travaillant sur Linux. Mais j'accueillerais aussi des réponses plus génériques.

OS préféré: Linux
langues préférées: C, Perl, shell script


mesures possibles:

  • nombre total d'octets transférés du serveur au client et du client au serveur en un seul ssion; cela peut également être utilisé pour mesurer la tête de protocole (bande passante)
  • nombre d'allers-retours (connexions) dans une transaction (latence)
  • dépendance de la vitesse de fonctionnement du réseau (temps qu'il faut pour cloner/tirer/pousser) à partir de la bande passante du réseau, et de la latence du réseau (temps de ping)

Comment faire de telles mesures (tels cas-tests)?


Ajouté 02-06-2009:
Une référence plus simple (mesure) serait une version de réseau de commande time, à savoir la commande qui vont me donner le nombre d'octets transférés, et le nombre de voyages aller-retour/connexions réseau lors de l'exécution d'une commande donnée.


Ajouté 09-06-2009:
Exemple sortie imaginaire mentionné ci-dessus la solution de la version réseau de commandement time pourrait ressembler à ce qui suit:

$ ntime git clone -q git://git.example.com/repo.git 
... 
bytes sent: nnn (nn kiB), bytes received: nnn (nn kiB), avg: nn.nn KB/s 
nn reads, nn writes 

Notez qu'il est seulement un exemple de sortie, détaillant le type d'information que l'on pourrait vouloir obtenir.


Ajouté 09-06-2009:
Il ressemble à une partie de ce que je veux peut être acheived en utilisant dummynet, outil (à l'origine) pour les protocoles de réseau de test ...

+0

Demandez-vous, comment obtenir les données requises afin de trouver de telles références pour un programme en réseau arbitraire? – none

+0

Oui, j'aimerais avoir au minimum le nombre total d'octets transférés et peut-être le nombre de changements de lecture à écriture pour une commande donnée, quelque chose comme l'heure et le temps CPU et mémoire, et SystemTap iotimes pour E/S. –

+0

Je pense que pour vraiment répondre à votre question, vous devriez idéalement nous en dire plus sur votre plate-forme/OS préféré, ainsi que votre langage de programmation préféré. De plus, une liste détaillée des mesures qui vous intéressent nous dirait quelle approche est la plus réalisable. – none

Répondre

15

Si Je vous comprends correctement, vous êtes essentiellement intéressé par quelque chose comme Linux 'strace' (Introduction) pour les appels système spécifiques au réseau?

Peut-être une combinaison d'un profileur et d'un débogueur, pour des applications réseau (c'est-à-dire 'ntrace'), fournissant une analyse détaillée de diverses mesures optionnelles?

Sous Linux, l'utilitaire strace est en grande partie basée sur la fonctionnalité qui est fournie par le noyau Linux, à savoir l'API ptrace (process tracing):

En utilisant ptrace, il devrait être possible d'obtenir la plupart des données que vous êtes intéressé.

Sous Windows, vous aurez probablement envie de regarder dans detours afin d'intercepter/rediriger les appels de l'API Winsock à des fins d'inspection/d'analyse comparative. Si vous n'avez pas vraiment besoin de beaucoup d'informations de bas niveau, vous pouvez probablement utiliser directement strace (sous linux) et ne l'utiliser que pour suivre certains appels système, par exemple, considérez la ligne suivante qui tracerait uniquement les appels à l'syscall ouvert (à l'aide du paramètre -o de fichier supplémentaire, vous pouvez rediriger toutes les sorties vers un fichier de sortie):

strace -e trace=open -o results.log

en passant un drapeau -v supplémentaire strace, vous pouvez augmenter sa verbosité pour obtenir informations supplémentaires (lorsque vous travaillez avec des SCM tels que git qui sont composés de nombreux utilitaires shell plus petits et d'outils autonomes, vous aurez probablement aussi besoin de vous pencher sur l'utilisation de -f drapeau afin de suivre également les processus fourchus).

Alors, que vous seriez intéressé, est tout syscalls qui sont liés à sockets, à savoir:

  • acceptent
  • bind
  • connecter
  • getpeername
  • getsockname
  • getsockopt
  • écoutez
  • recv
  • recvfrom
  • envoyer
  • sendto
  • setsockopt
  • arrêt
  • socket
  • socketpair

(au début, vous aurez probablement envie qu'à se pencher sur les appels send .../recv ..., bien que)

Pour simplifier, vous pouvez également utiliser « réseau » en tant que paramètre de tracer, qui retracera tous les appels liés au réseau:

trace -e = réseau: Trace l'ensemble du réseau des appels système liés.

Ainsi, une invocation strace correspondante pourrait ressembler à ceci:

strace -v -e trace=accept,bind,connect,getpeername,getsockname,getsockopt,listen,recv,recvfrom,send,sendto setsockopt,shutdown,socket,socketpair -o results.log -f git pull

Lorsque le programme est terminé en cours d'exécution, vous serez alors voulez surtout d'examiner le fichier journal pour évaluer les données, cette peut alors être facilement réalisé en utilisant des expressions régulières.

Par exemple, lors de l'exécution de ce qui suit dans un shell linux: strace -v -o wget.log -e trace=connect,recv,recvfrom,send,sendto wget http://www.google.com

Le fichier journal résultant contient des messages comme ceux-ci:

  • recv (3, « HTTP/1.0 302 Trouvé \ r \ nLocalisation: htt "..., 511, MSG_PEEK) = 511
  • sendto (4," \ 24 \ 0 \ 0 \ 0 \ 26 \ 0 \ 1 \ 3^\ 206 * J \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "..., 20, 0, {sa_famille = AF_NETLINK, pid = 0, groupes = 00000000}, 12) = 20

En regardant les pages de manuel pour ces deux appels système, il est évident que 511 et 20 sont le nombre d'octets transférés.Si vous avez également besoin d'informations de calendrier détaillé, vous pouvez passer le drapeau -T à strace:

-T - temps d'impression passé dans chaque syscall

De plus, vous pouvez obtenir des statistiques en passant le -c indicateur:

-c: Compter l'heure, les appels et les erreurs pour chaque appel système et signaler un résumé au programme quitter. Sous Linux, cela tente d'afficher l'heure système (temps CPU passé à s'exécuter dans le noyau) indépendamment de l'heure de l'horloge murale. Si -c est utilisé avec -f ou -F (ci-dessous), seuls les totaux cumulés pour tous les processus tracés sont conservés.

Si vous avez besoin également d'examiner les données réelles traitées, vous pouvez regarder dans les spécificateurs de lecture/écriture:

-e read = jeu: Effectuer un vidage hexadécimal complet et ASCII de tous les données lues à partir du fichier descripteurs répertoriés dans l'ensemble spécifié. Par exemple, pour voir toutes les activités d'entrée dans le fichier , les descripteurs 3 et 5 utilisent -e read = 3,5. Notez que ceci est indépendant du suivi normal de l'appel système read (2) qui est contrôlé par l'option -e trace = read. -e write = set: Effectue une sauvegarde hexadécimale et ASCII complète de toutes les données écrites dans le fichier descripteurs répertoriés dans l'ensemble spécifié. Par exemple, pour voir toutes les activités de sortie du fichier , les descripteurs 3 et 5 utilisent -e write = 3,5. Notez que ceci est indépendant du suivi normal de l'appel système write (2) qui est contrôlé par l'option -e trace = write.

Vous pouvez également personnaliser la longueur maximum de chaînes:

-s strsize: Indiquez la taille maximale de la chaîne à imprimer (la valeur par défaut est 32). Notez que noms de fichiers ne sont pas considérés comme des chaînes et sont toujours imprimés en

Ou ont des chaînes être sous-évaluées en hex:

-XX: Imprimer toutes les chaînes en format de chaîne hexadécimale.

Ainsi, en utilisant strace pour une grande partie de cela, semble être une bonne approche hybride, car il est très facile à faire, mais il y a une bonne quantité d'informations à faible niveau disponibles, si vous trouvez que vous avez besoin faible supplémentaire informations de niveau, vous pouvez envisager d'étendre strace à la place ou en déposant des demandes de fonctionnalités correspondantes avec le strace project on sourceforge. Cependant, en y réfléchissant un peu plus, une manière moins impliquée et plus agnostique de mettre en œuvre un benchmark de trafic réseau relativement simple consisterait à utiliser une forme de couche intermédiaire, entre le client et le serveur réel: serveur qui consiste essentiellement à mesurer, analyser et rediriger le trafic vers le serveur réel.

Assez semblable à un serveur proxy (par exemple, SOCKS), de sorte que tout le trafic soit acheminé par tunnel à travers votre analyseur, ce qui peut à son tour accumuler des statistiques et d'autres mesures.

Une version de base de quelque chose comme ceci pourrait probablement être facilement mise en place simplement en utilisant netcat et certains scripts shell, des versions plus complexes peuvent cependant bénéficier d'utiliser perl ou python à la place. Pour une implémentation python d'un serveur SOCKS, vous pouvez rechercher pysocks.

En outre, il y a bien sûr twisted pour python:

Twisted est un moteur de réseau événementiel écrit en Python et sous licence sous la licence MIT.

Si vous avez besoin d'avoir plus d'informations de bas niveau, vous voudrez sûrement vraiment vous intéresser à l'interception des appels système.

Si vous avez également besoin de données d'efficacité spécifiques au protocole, vous pouvez consulter tcpdump.

5

possible réponse serait d'utiliser SystemTap. Parmi les exemples de scripts, il y a nettop qui affiche (certaines des) informations réseau requises dans le style "top", et il y a un script iotime qui affiche les informations d'E/S sous la forme requise.

Questions connexes