2010-09-29 22 views
1

J'ai une bibliothèque implémentée basée sur telnetlib de Python. Et récemment, j'ai remarqué que les performances dans Windows XP et Linux sont si différentes.Performances Telnet sous Windows XP et Linux

ci-dessous le script, je concevoir trois opérations, « obtenir des unités », « presser la touche Entrée », « obtenir des unités avec des options »

« obtenir des unités » retour est de longue chaîne, « obtenir des unités avec des options » retour plus court chaîne de caractères, et "appuyez simplement sur" pour retourner la chaîne la plus courte. Supposons que vous passiez plus de temps, il semblerait que votre commande devrait être "obtenir des unités", "obtenir des unités avec des options", puis "appuyer sur Entrée".

mais le résultat réel dans Windows XP est:

obtenir des unités: 3,67200016975 s obtenir des unités avec des options: 10,0319998264 s presser la touche Entrée: 10.0 de

même test dans Ubuntu: obtenir des unités: 3.91432785988 obtenir des unités avec des options: 2,86995506287 presser la touche Entrée: 2,05337381363

il semble que windows XP a de bonnes performances sur le paquet IP grand, mais pour les petits paquets, il est si mauvais.

Je l'ai testé manuellement, en utilisant le client Telnet de Windows, Putty. Utiliser wireshark pour capturer des données telnet. Et trouver que pour un petit paquet, le retard de paquet est si long, environ 0s

j'ai essayé de changer la fenêtre tcp, mais n'ai pas aidé.

quelqu'un peut-il donner quelques suggestions?

try: 
    begin_g = time.time() 
    for i in range(50): 
     connection.write('ZUSI:OMU;') 
     ret = connection.read_until('<') 
     ret = connection.read_until('<') 
    end_g = time.time() 
    elapse_g = end_g-begin_g 

    clean_begin_t = time.time() 
    for i in range(50): 
     ret = ipa.get_units() 
    clean_end_t = time.time() 
    elapse_c = clean_end_t-clean_begin_t 

    begin_wu = time.time() 
    for i in range(50): 
     connection.write('') 
     ret = connection.read_until_prompt() 
    end_wu = time.time() 
    elapse_wu = end_wu-begin_wu 

Répondre

0

Peut-être que c'est de retarder l'envoi d'un paquet court en raison de Nagle's algorithm.

Vous pouvez tester cela en désactivant l'algorithme Nagle sur la machine XP (Google pour savoir comment faire).

+0

merci. je l'ai:). 0.2s retard est causé par "L'algorithme ACK retardé" de Windows, sa valeur par défaut est 0.2s – Rainman

0

Merci à tous. J'ai résolu ce problème. Il y a deux algorithmes: l'algorithme de Nagle, l'algorithme ACK retardé. Mon problème est causé par "L'algorithme ACK retardé". Malheureusement, il ne peut pas être défini en Python. Je dois modifier register, mettre la valeur à 1, et cela fonctionne du tout. Mais je pense que ce n'est pas assez bon. Support Linux TCP_QUICKACK. Mais Windows ne le fait pas.

[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Tcpip \Parameters \Interfaces \{Adapter-id}] 
TcpAckFrequency = 2 (Default=2, 1=Disables delayed ACK, 2-n = If n outstanding ACKs before timed interval, sent ACK) 

More Info MS KB Q328890 
More Info MS KB 815230 (XP/2003 needs hotfix or SP2 for it to work) 
More Info MS KB 935458 (Vista needs hotfix or SP1 for it to work) 
+0

Que télésurveillez-vous? Idéalement, votre serveur Telnet fonctionnerait avec un ACK retardé. –

+0

J'ai cherché dans le web de MS. Et ACK retardé est défini dans RFC. Mais Linux semble avoir de meilleures performances. Grâce au registre de modification, les fenêtres peuvent désactiver cette fonction. Je pense que pour TCP_NODELAY, si le serveur et le client ne peuvent pas le définir, cela sera utile dans ma situation. – Rainman

+0

[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Paramètres \ Interfaces \ {ID_adaptateur}] TcpAckFrequency = 2 (Par défaut = 2, 1 = Désactive l'ACK retardé, 2-n = Si n ACK en attente avant l'intervalle temporisé, envoyé ACK) Sous-clé: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ Tcpip \ Parameters \ Interfaces \ Entrée: TcpAckFrequency type de valeur: REG_DWORD, numéro Plage valide: 0-255 Valeur par défaut: 2 – Rainman