Projet

Général

Profil

Projet agregation v2 » Historique » Version 6

« Précédent - Version 6/93 (diff) - Suivant » - Version actuelle
Laurent GUERBY, 03/03/2012 17:44


Projet agregation v2

Projet agregation

Divers

  • 1 Mbit/s = 83 frames de 1500 byte/sec = 1 frame de 1500 byte toutes les 12 ms
  • l'augmentation de latence sur la ligne permet la detection de la saturation des buffer
  • on peut mesurer les variations de latence en regardant les variations de difference de timestamp destination moins source

Resolution de time.time()

guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat ttime.py 
import time

N=1000
l=[]
for i in xrange(N):
    t1=time.time()
    t2=time.time()
    dt=t2-t1
    l.append(dt)

l.sort()
print l[0],l[-1],l[N/2],l[9*N/10]
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py 
9.53674316406e-07 3.00407409668e-05 1.90734863281e-06 2.14576721191e-06
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py 
9.53674316406e-07 1.19209289551e-05 1.90734863281e-06 2.14576721191e-06
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py 
9.53674316406e-07 0.000508069992065 1.90734863281e-06 2.14576721191e-06

=> autour de 2 microsecondes en pratique

Résolution de select en python

guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat tselect.py 
import time
import select
from socket import *
from select import select

s1 = socket(AF_INET, SOCK_DGRAM)
s2 = socket(AF_INET, SOCK_DGRAM)

N=1000
l=[]
for i in xrange(N):
    t1=time.time()
    r = select([s1,s2],[],[],1.0e-9)
    t2=time.time()
    dt=t2-t1
    l.append(dt)

l.sort()
print l[0],l[-1],l[N/2],l[9*N/10]
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py 
9.77516174316e-06 0.000253915786743 1.09672546387e-05 1.12056732178e-05
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py 
9.77516174316e-06 5.41210174561e-05 1.09672546387e-05 1.12056732178e-05

=> 12 microsecondes
=> 18 microsecondes avec 5 socket vs 2 donc compter + 2 micro/socket

Generer un payload random

import random
import struct

N=256*256*256*256-1
S=160000
random.seed(0)
s="".join([struct.pack("I",random.randint(0,N)) for i in xrange(S/4)])
print S,len(s)

Premier test de controle de latence

  • sur une ligne ADSL capable de 11 Mbit/s soutenu TCP
  • du serveur (gw) vers le client (stg) on envoie un paquet UDP de 1200 byte toutes les 1200/D secondes avec un numero de sequence, un timestamp serveur en microseconde et un payload random
  • sur le client on note le timestamp client en microseconde, le numero de sequence et le timestamp server du paquet
  • une fois le test fini (1000 paquets) on calcule paquet par paquet la difference timestamp client moins timestamp server
  • on calcul le min de ces difference
  • graphe chaque difference moins le min des difference = la deviation par rapport a la normale en microseconde

Avec D = 10 Mbit/s = en dessous de la capacité de la ligne ça donne :

Avec D = 15 Mbit/s = au dessus de la capacité de la ligne ça donne :

On voit donc dans le deuxieme cas le buffer du modem se remplir au fur et a mesure de l'envoi des paquets => c'est parfaitement observable donc maitrisable.

On voit sur les deux graphes des petits pics qui correspondent aux moments ou le modem ADSL pedale un peu pour envoyer.