Projet

Général

Profil

Projet agregation v2 » Historique » Version 13

Laurent GUERBY, 04/03/2012 19:58

1 1 Laurent GUERBY
h1. Projet agregation v2
2 1 Laurent GUERBY
3 12 Laurent GUERBY
* [[Projet agregation]]
4 12 Laurent GUERBY
* uTP (uTorrent transport protocol) is a transport protocol which uses one-way delay measurements for its congestion controller. http://www.rasterbar.com/products/libtorrent/utp.html
5 13 Laurent GUERBY
* Low Extra Delay Background Transport (LEDBAT) https://datatracker.ietf.org/doc/draft-ietf-ledbat-congestion/
6 1 Laurent GUERBY
7 1 Laurent GUERBY
h2. Divers
8 1 Laurent GUERBY
9 1 Laurent GUERBY
* 1 Mbit/s = 83 frames de 1500 byte/sec = 1 frame de 1500 byte toutes les 12 ms
10 1 Laurent GUERBY
* l'augmentation de latence sur la ligne permet la detection de la saturation des buffer
11 1 Laurent GUERBY
* on peut mesurer les variations de latence en regardant les variations de difference de timestamp destination moins source
12 8 Laurent GUERBY
* sur 1 Mbit/s si 20 utilisateurs envoient des paquets de 1500 byte ca fait 4 frame de 1500 byte/sec par utilisateur soit une latence de 250ms (~ 50 kbit/s par utilisateur)
13 2 Laurent GUERBY
14 6 Laurent GUERBY
h2. Resolution de time.time()
15 1 Laurent GUERBY
16 4 Laurent GUERBY
* http://stackoverflow.com/questions/1938048/high-precision-clock-in-python
17 2 Laurent GUERBY
18 4 Laurent GUERBY
<pre>
19 2 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat ttime.py 
20 2 Laurent GUERBY
import time
21 2 Laurent GUERBY
22 2 Laurent GUERBY
N=1000
23 2 Laurent GUERBY
l=[]
24 2 Laurent GUERBY
for i in xrange(N):
25 2 Laurent GUERBY
    t1=time.time()
26 2 Laurent GUERBY
    t2=time.time()
27 2 Laurent GUERBY
    dt=t2-t1
28 2 Laurent GUERBY
    l.append(dt)
29 2 Laurent GUERBY
30 2 Laurent GUERBY
l.sort()
31 2 Laurent GUERBY
print l[0],l[-1],l[N/2],l[9*N/10]
32 2 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py 
33 2 Laurent GUERBY
9.53674316406e-07 3.00407409668e-05 1.90734863281e-06 2.14576721191e-06
34 2 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py 
35 2 Laurent GUERBY
9.53674316406e-07 1.19209289551e-05 1.90734863281e-06 2.14576721191e-06
36 2 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py 
37 2 Laurent GUERBY
9.53674316406e-07 0.000508069992065 1.90734863281e-06 2.14576721191e-06
38 2 Laurent GUERBY
</pre>
39 2 Laurent GUERBY
40 2 Laurent GUERBY
=> autour de 2 microsecondes en pratique
41 3 Laurent GUERBY
42 6 Laurent GUERBY
h2. Résolution de select en python
43 3 Laurent GUERBY
44 4 Laurent GUERBY
<pre>
45 3 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat tselect.py 
46 3 Laurent GUERBY
import time
47 3 Laurent GUERBY
import select
48 3 Laurent GUERBY
from socket import *
49 3 Laurent GUERBY
from select import select
50 3 Laurent GUERBY
51 3 Laurent GUERBY
52 3 Laurent GUERBY
53 3 Laurent GUERBY
s1 = socket(AF_INET, SOCK_DGRAM)
54 3 Laurent GUERBY
s2 = socket(AF_INET, SOCK_DGRAM)
55 3 Laurent GUERBY
56 3 Laurent GUERBY
N=1000
57 3 Laurent GUERBY
l=[]
58 3 Laurent GUERBY
for i in xrange(N):
59 3 Laurent GUERBY
    t1=time.time()
60 3 Laurent GUERBY
    r = select([s1,s2],[],[],1.0e-9)
61 3 Laurent GUERBY
    t2=time.time()
62 3 Laurent GUERBY
    dt=t2-t1
63 3 Laurent GUERBY
    l.append(dt)
64 3 Laurent GUERBY
65 3 Laurent GUERBY
l.sort()
66 1 Laurent GUERBY
print l[0],l[-1],l[N/2],l[9*N/10]
67 3 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py 
68 3 Laurent GUERBY
9.77516174316e-06 0.000253915786743 1.09672546387e-05 1.12056732178e-05
69 3 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py 
70 3 Laurent GUERBY
9.77516174316e-06 5.41210174561e-05 1.09672546387e-05 1.12056732178e-05
71 4 Laurent GUERBY
</pre>
72 3 Laurent GUERBY
73 1 Laurent GUERBY
=> 12 microsecondes
74 1 Laurent GUERBY
=> 18 microsecondes avec 5 socket vs 2 donc compter + 2 micro/socket
75 6 Laurent GUERBY
76 6 Laurent GUERBY
h2. Generer un payload random
77 6 Laurent GUERBY
78 6 Laurent GUERBY
* http://docs.python.org/library/random.html
79 6 Laurent GUERBY
* http://docs.python.org/library/struct.html
80 6 Laurent GUERBY
81 6 Laurent GUERBY
<pre>
82 6 Laurent GUERBY
import random
83 6 Laurent GUERBY
import struct
84 6 Laurent GUERBY
85 6 Laurent GUERBY
86 6 Laurent GUERBY
N=256*256*256*256-1
87 6 Laurent GUERBY
S=160000
88 6 Laurent GUERBY
random.seed(0)
89 6 Laurent GUERBY
s="".join([struct.pack("I",random.randint(0,N)) for i in xrange(S/4)])
90 6 Laurent GUERBY
print S,len(s)
91 6 Laurent GUERBY
</pre>
92 6 Laurent GUERBY
93 9 Laurent GUERBY
h2. Premiere mesure de controle de latence : debit
94 6 Laurent GUERBY
95 6 Laurent GUERBY
* sur une ligne ADSL capable de 11 Mbit/s soutenu TCP
96 6 Laurent GUERBY
* 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
97 6 Laurent GUERBY
* sur le client on note le timestamp client en microseconde, le numero de sequence et le timestamp server du paquet
98 6 Laurent GUERBY
* une fois le test fini (1000 paquets) on calcule paquet par paquet la difference timestamp client moins timestamp server
99 7 Laurent GUERBY
* on calcul le min de ces differences sur tous les paquets
100 7 Laurent GUERBY
* on graphe chaque difference moins le min des difference = la deviation par rapport a la normale en microseconde
101 6 Laurent GUERBY
102 6 Laurent GUERBY
Avec D = 10 Mbit/s = en dessous de la capacité de la ligne ça donne :
103 6 Laurent GUERBY
104 6 Laurent GUERBY
!10-1200.png!
105 6 Laurent GUERBY
106 6 Laurent GUERBY
Avec D = 15 Mbit/s = au dessus de la capacité de la ligne ça donne :
107 1 Laurent GUERBY
108 1 Laurent GUERBY
!15-1200.png!
109 6 Laurent GUERBY
110 7 Laurent GUERBY
On voit sur les deux graphes des petits pics qui correspondent aux moments ou le modem ADSL pedale un peu pour envoyer.
111 7 Laurent GUERBY
112 1 Laurent GUERBY
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.
113 6 Laurent GUERBY
114 7 Laurent GUERBY
Le but de l'algorithme de controle est de baisser le debit cible quand on voit la mesure de controle deriver pour la ramener proche d'un niveau normal.
115 7 Laurent GUERBY
116 1 Laurent GUERBY
Note : a cause d'un drift possible d'horloge entre le client et le serveur le niveau normal de la mesure doit etre calculé sur les N derniers paquets / minutes.
117 9 Laurent GUERBY
118 9 Laurent GUERBY
h2. Deuxieme mesure : paquet par seconde
119 9 Laurent GUERBY
120 9 Laurent GUERBY
Cette fois ci a debit fixé a 10 Mbit/s soit en dessous de la capacité de la ligne on fait varier la taille du paquet donc le nombre de paquet par seconde (pps)
121 9 Laurent GUERBY
122 9 Laurent GUERBY
* Taille 200 = 5485 pps 8.7 Mbit/s sur theo a 6250 pps
123 9 Laurent GUERBY
!10-200.png!
124 9 Laurent GUERBY
125 9 Laurent GUERBY
* Taille 350 = 3552 pps 9.9 Mbit/s sur theo a 3570 pps
126 9 Laurent GUERBY
!10-350.png!
127 9 Laurent GUERBY
128 9 Laurent GUERBY
* Taille 400 = 3126 pps 10 Mbit/s sur theo a 3125 pps
129 9 Laurent GUERBY
!10-400.png!
130 9 Laurent GUERBY
131 9 Laurent GUERBY
On voit donc qu'il y a aussi une limite de traitement en pps sur le modem qui peut entrainer du buffer bloat
132 10 Laurent GUERBY
133 11 Laurent GUERBY
A noter que si on rajoute les 20 bytes de header IP et 8 byte de header UDP dans le compteur de débit on sature plutot vers 6500 pps pour 10 Mbit/s, soit 190 byte/packet, payload de 190-20-8=162 byte
134 10 Laurent GUERBY
135 11 Laurent GUERBY
Script de test utilisé : attachment:iperf-20120304.py