Différents comportements ACK (ralentissement du débit?)

Je lance netio ( http://freshmeat.net/projects/netio/ ) sur une machine (opensolaris) et en contactant deux machines Linux différentes (toutes deux sur 2.6.18-128.el5), machine A et machine B. Machine A a un débit réseau de 10 Mo / sec avec netio et machine B 100 Mo / sec avec netio. Sur le solaris ouvert, j'ai détecté les connections et toutes les interactions semblent identiques – les mêmes tailles de windows sur la réception et l'envoi, même ssthresh, même taille de window de congestion, mais la machine lente envoie et ACK pour 2 ou 3 reçoit alors que le rapide la machine envoie un ACK tous les 12 reçus. Les trois machines sont sur le même commutateur. Voici la sortie Dtrace: Fast Machine:

 delta send recd  
  (us) bytes bytes swnd snd_ws rwnd rcv_ws cwnd ssthresh 
   122 1448 \ 195200 7 131768 2 128872 1073725440 
    37 1448 \ 195200 7 131768 2 128872 1073725440 
    20 1448 \ 195200 7 131768 2 128872 1073725440 
    18 1448 \ 195200 7 131768 2 128872 1073725440 
    18 1448 \ 195200 7 131768 2 128872 1073725440 
    18 1448 \ 195200 7 131768 2 128872 1073725440 
    18 1448 \ 195200 7 131768 2 128872 1073725440 
    19 1448 \ 195200 7 131768 2 128872 1073725440 
    18 1448 \ 195200 7 131768 2 128872 1073725440 
    18 1448 \ 195200 7 131768 2 128872 1073725440  
    57 1448 \ 195200 7 131768 2 128872 1073725440
   171 1448 \ 195200 7 131768 2 128872 1073725440    
    29 912 \ 195200 7 131768 2 128872 1073725440   
    30/0 195200 7 131768 2 128872 1073725440  

machine lente:

 delta send recd  
  (us) bytes bytes swnd snd_ws rwnd rcv_ws cwnd ssthresh 
   161/0 195200 7 131768 2 127424 1073725440  
    52 1448 \ 195200 7 131768 2 128872 1073725440 
    33 1448 \ 195200 7 131768 2 128872 1073725440   
    11 1448 \ 195200 7 131768 2 128872 1073725440   
   143/0 195200 7 131768 2 128872 1073725440   
    46 1448 \ 195200 7 131768 2 130320 1073725440   
    31 1448 \ 195200 7 131768 2 130320 1073725440   
    11 1448 \ 195200 7 131768 2 130320 1073725440   
   157/0 195200 7 131768 2 130320 1073725440  
    46 1448 \ 195200 7 131768 2 131768 1073725440 
    18 1448 \ 195200 7 131768 2 131768 1073725440

Code Dtrace

 dtrace: 130717 gouttes sur CPU 0
 #! / usr / sbin / dtrace -s
 #pragma D option quiet
 #pragma D option defaultargs
 Inline int TICKS = $ 1;
 string en ligne ADDR = $$ 2;
 Dtrace ::: BEGIN
 {
        TIMER = (TICKS! = NULL)?  TICKS: 1;
        tiques = TIMER;
        TITLE = 10;
        title = 0;
        walltime = timestamp;
        printf ("démarrage ... \ n");
 }
 tcp ::: send
 / (args [2] -> ip_daddr == ADDR || ADDR == NULL) /
 {
     nfs [args [1] -> cs_cid] = 1;  / * c'est un thread NFS * /
     delta = timestamp-walltime;
     walltime = timestamp;
     printf ("% 6d% 8d \% 8s% 8d% 8d% 8d% 8d% 8d% 12d% 12d% 12d% 8d% 8d% d \ n",
         delta / 1000,
         args [2] -> ip_plength - args [4] -> tcp_offset,
         ""
         args [3] -> tcps_swnd,
         args [3] -> tcps_snd_ws,
         args [3] -> tcps_rwnd,
         args [3] -> tcps_rcv_ws,
         args [3] -> tcps_cwnd,
         args [3] -> tcps_cwnd_ssthresh,
         args [3] -> tcps_sack_fack,
         args [3] -> tcps_sack_snxt,
         args [3] -> tcps_rto,
         args [3] -> tcps_mss,
         args [3] -> tcps_retransmit
       );
     drapeau = 0;
     Titre--;
 }
 tcp ::: recevoir
 / (args [2] -> ip_saddr == ADDR || ADDR == NULL) && nfs [args [1] -> cs_cid] /
 {
       delta = timestamp-walltime;
       walltime = timestamp;

       printf ("% 6d% 8s /% 8d% 8d% 8d% 8d% 8d% 8d% 12d% 12d% 12d% 8d% 8d% d \ n",
         delta / 1000,
         ""
         args [2] -> ip_plength - args [4] -> tcp_offset,
         args [3] -> tcps_swnd,
         args [3] -> tcps_snd_ws,
         args [3] -> tcps_rwnd,
         args [3] -> tcps_rcv_ws,
         args [3] -> tcps_cwnd,
         args [3] -> tcps_cwnd_ssthresh,
         args [3] -> tcps_sack_fack,
         args [3] -> tcps_sack_snxt,
         args [3] -> tcps_rto,
         args [3] -> tcps_mss,
         args [3] -> tcps_retransmit
       );
     drapeau = 0;
     Titre--;
 }

Le suivi a été ajouté pour inclure le nombre d'octets non acquittés et il s'avère que le code lent est en cours d'exécution, ce sont des octets non reconnus jusqu'à ce qu'il frappe la window de congestion, alors que la machine rapide ne frappe jamais sa window de congestion. Voici la sortie de la machine lente quand il s'agit d'octets non reconnus, appuyez sur la window de congestion:

 unack delta bytes bytes envoyer recevez cong ssthresh
 bytes byte nous envoyé window de window de window reçue 
 envoyé reçu
 139760 0 31 1448 \ 195200 131768 144800 1073725440
 139760 0 33 1448 \ 195200 131768 144800 1073725440
 144104 0 29 1448 \ 195200 131768 146248 1073725440
 145552 0 31/0 195200 131768 144800 1073725440
 145552 0 41 1448 \ 195200 131768 147696 1073725440
 147000 0 30/0 195200 131768 144800 1073725440
 147000 0 22 1448 \ 195200 131768 76744 72400
 147000 0 28/0 195200 131768 76744 72400
 147000 0 18 1448 \ 195200 131768 76744 72400
 147000 0 26/0 195200 131768 76744 72400
 147000 0 17 1448 \ 195200 131768 76744 72400
 147000 0 27/0 195200 131768 76744 72400
 147000 0 18 1448 \ 195200 131768 76744 72400
 147000 0 56/0 195200 131768 76744 72400
 147000 0 22 1448 \ 195200 131768 76744 72400

code Dtrace:


 #! / usr / sbin / dtrace -s
 #pragma D option quiet
 #pragma D option defaultargs
 Inline int TICKS = $ 1;
 string en ligne ADDR = $$ 2;
 tcp ::: send, tcp ::: receive
 / (args [2] -> ip_daddr == ADDR || ADDR == NULL) /
 {
     nfs [args [1] -> cs_cid] = 1;  / * c'est un thread NFS * /
     delta = timestamp-walltime;
     walltime = timestamp;
     printf ("% 6d% 6d% 6d% 8d \% 8s% 8d% 8d% 8d% 8d% 8d% 12d% 12d% 12d% 8d% 8d% d \ n",
         args [3] -> tcps_snxt - args [3] -> tcps_suna,
         args [3] -> tcps_rnxt - args [3] -> tcps_rack,
         delta / 1000,
         args [2] -> ip_plength - args [4] -> tcp_offset,
         ""
         args [3] -> tcps_swnd,
         args [3] -> tcps_snd_ws,
         args [3] -> tcps_rwnd,
         args [3] -> tcps_rcv_ws,
         args [3] -> tcps_cwnd,
         args [3] -> tcps_cwnd_ssthresh,
         args [3] -> tcps_sack_fack,
         args [3] -> tcps_sack_snxt,
         args [3] -> tcps_rto,
         args [3] -> tcps_mss,
         args [3] -> tcps_retransmit
       );
 }
 tcp ::: recevoir
 / (args [2] -> ip_saddr == ADDR || ADDR == NULL) && nfs [args [1] -> cs_cid] /
 {
       delta = timestamp-walltime;
       walltime = timestamp;
       printf ("% 6d% 6d% 6d% 8s /% -8d% 8d% 8d% 8d% 8d% 8d% 12d% 12d% 12d% 8d% 8d% d \ n",
         args [3] -> tcps_snxt - args [3] -> tcps_suna,
         args [3] -> tcps_rnxt - args [3] -> tcps_rack,
         delta / 1000,
         ""
         args [2] -> ip_plength - args [4] -> tcp_offset,
         args [3] -> tcps_swnd,
         args [3] -> tcps_snd_ws,
         args [3] -> tcps_rwnd,
         args [3] -> tcps_rcv_ws,
         args [3] -> tcps_cwnd,
         args [3] -> tcps_cwnd_ssthresh,
         args [3] -> tcps_sack_fack,
         args [3] -> tcps_sack_snxt,
         args [3] -> tcps_rto,
         args [3] -> tcps_mss,
         args [3] -> tcps_retransmit
       );
 }

Maintenant, il est toujours question de savoir pourquoi une machine est en retard et l'autre ne …

One Solution collect form web for “Différents comportements ACK (ralentissement du débit?)”

J'ai déjà vu un comportement comme celui-ci. J'ai vu deux causes:

  • Négociation de contrôle de débit TCP / IP incorrecte
  • Mauvais conducteurs

Les problèmes de contrôle de débit TCP / IP sont less probables dans votre cas puisque les deux machines exécutent le même kernel et (à l'exception des modules du kernel du périphérique si différente) exécutent donc le même code TCP / IP.

Drivers cependant.

J'ai eu un server Windows 2003 un certain time qui ne pouvait tout simplement pas transférer plus de 6-10MB / s à certains servers, et comme cela était un server de sauvegarde sur disque, cela n'était tout simplement pas acceptable. Après avoir regardé quelques captures de packages, ils ont beaucoup regardé ce que vous voyez. Ce qui était fixé était de mettre à jour les pilotes de réseau (Broadcom en l'occurrence) sur le server récepteur (le server de sauvegarde du server 2003) vers quelque chose de plus récent. Une fois que cela a été fait, j'avais 60 à 80 Mo / s.

Comme il s'agit de Linux, vous risquez de rencontrer un problème de déblocage de segment important. Cela dépend dans une partie du matériel NIC lui-même traitant du fractionnement de grands segments. Si cela ne fonctionne pas pour une raison quelconque (mauvais firmware?), Cela peut causer ces types de retards impairs. Ceci est configuré sur une base par pilote ou par interface. ethtool -K peut le configurer par périphérique.

  • À quoi ressemble une requête DNS?
  • Comportement de la stack de Solaris tcp avec un RTT relativement élevé et un trafic de rafale
  • Comment atsortingbuer automatiquement une route au client dans le VPN PPTP Windows Server?
  • Lors de la connection à localhost, une prise de contact complète SYN, SYN-ACK, ACK se produit-elle toujours?
  • Activation de TCP / IPv4 via Windows PE
  • Pratique Anycast
  • NetDiag + TCP Blocking?
  • Quels sont les conseils de tuning TCP pour un service frappé par les clients iPhone sur les réseaux mobiles comme la 3G?
  • Limit.conf setting does not 'stick'
  • Si je fais une request à l'adresse IP de mon server, sera-t-il identique à l'utilisation de 127.0.0.1 ou plus lent?
  • Comment rendre le port ssh standard un port furtif?
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.