Projet agregation v2 » Historique » Version 14
Laurent GUERBY, 01/04/2012 11:10
1 | 14 | Laurent GUERBY | {{>toc}} |
---|---|---|---|
2 | 14 | Laurent GUERBY | |
3 | 1 | Laurent GUERBY | h1. Projet agregation v2 |
4 | 1 | Laurent GUERBY | |
5 | 12 | Laurent GUERBY | * [[Projet agregation]] |
6 | 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 |
7 | 13 | Laurent GUERBY | * Low Extra Delay Background Transport (LEDBAT) https://datatracker.ietf.org/doc/draft-ietf-ledbat-congestion/ |
8 | 1 | Laurent GUERBY | |
9 | 1 | Laurent GUERBY | h2. Divers |
10 | 1 | Laurent GUERBY | |
11 | 1 | Laurent GUERBY | * 1 Mbit/s = 83 frames de 1500 byte/sec = 1 frame de 1500 byte toutes les 12 ms |
12 | 1 | Laurent GUERBY | * l'augmentation de latence sur la ligne permet la detection de la saturation des buffer |
13 | 1 | Laurent GUERBY | * on peut mesurer les variations de latence en regardant les variations de difference de timestamp destination moins source |
14 | 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) |
15 | 2 | Laurent GUERBY | |
16 | 6 | Laurent GUERBY | h2. Resolution de time.time() |
17 | 1 | Laurent GUERBY | |
18 | 4 | Laurent GUERBY | * http://stackoverflow.com/questions/1938048/high-precision-clock-in-python |
19 | 2 | Laurent GUERBY | |
20 | 4 | Laurent GUERBY | <pre> |
21 | 2 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat ttime.py |
22 | 2 | Laurent GUERBY | import time |
23 | 2 | Laurent GUERBY | |
24 | 2 | Laurent GUERBY | N=1000 |
25 | 2 | Laurent GUERBY | l=[] |
26 | 2 | Laurent GUERBY | for i in xrange(N): |
27 | 2 | Laurent GUERBY | t1=time.time() |
28 | 2 | Laurent GUERBY | t2=time.time() |
29 | 2 | Laurent GUERBY | dt=t2-t1 |
30 | 2 | Laurent GUERBY | l.append(dt) |
31 | 2 | Laurent GUERBY | |
32 | 2 | Laurent GUERBY | l.sort() |
33 | 2 | Laurent GUERBY | print l[0],l[-1],l[N/2],l[9*N/10] |
34 | 2 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py |
35 | 2 | Laurent GUERBY | 9.53674316406e-07 3.00407409668e-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 1.19209289551e-05 1.90734863281e-06 2.14576721191e-06 |
38 | 2 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py |
39 | 2 | Laurent GUERBY | 9.53674316406e-07 0.000508069992065 1.90734863281e-06 2.14576721191e-06 |
40 | 2 | Laurent GUERBY | </pre> |
41 | 2 | Laurent GUERBY | |
42 | 2 | Laurent GUERBY | => autour de 2 microsecondes en pratique |
43 | 3 | Laurent GUERBY | |
44 | 6 | Laurent GUERBY | h2. Résolution de select en python |
45 | 3 | Laurent GUERBY | |
46 | 4 | Laurent GUERBY | <pre> |
47 | 3 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat tselect.py |
48 | 3 | Laurent GUERBY | import time |
49 | 3 | Laurent GUERBY | import select |
50 | 3 | Laurent GUERBY | from socket import * |
51 | 3 | Laurent GUERBY | from select import select |
52 | 3 | Laurent GUERBY | |
53 | 3 | Laurent GUERBY | |
54 | 3 | Laurent GUERBY | |
55 | 3 | Laurent GUERBY | s1 = socket(AF_INET, SOCK_DGRAM) |
56 | 3 | Laurent GUERBY | s2 = socket(AF_INET, SOCK_DGRAM) |
57 | 3 | Laurent GUERBY | |
58 | 3 | Laurent GUERBY | N=1000 |
59 | 3 | Laurent GUERBY | l=[] |
60 | 3 | Laurent GUERBY | for i in xrange(N): |
61 | 3 | Laurent GUERBY | t1=time.time() |
62 | 3 | Laurent GUERBY | r = select([s1,s2],[],[],1.0e-9) |
63 | 3 | Laurent GUERBY | t2=time.time() |
64 | 3 | Laurent GUERBY | dt=t2-t1 |
65 | 3 | Laurent GUERBY | l.append(dt) |
66 | 3 | Laurent GUERBY | |
67 | 3 | Laurent GUERBY | l.sort() |
68 | 1 | Laurent GUERBY | print l[0],l[-1],l[N/2],l[9*N/10] |
69 | 3 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py |
70 | 3 | Laurent GUERBY | 9.77516174316e-06 0.000253915786743 1.09672546387e-05 1.12056732178e-05 |
71 | 3 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py |
72 | 3 | Laurent GUERBY | 9.77516174316e-06 5.41210174561e-05 1.09672546387e-05 1.12056732178e-05 |
73 | 4 | Laurent GUERBY | </pre> |
74 | 3 | Laurent GUERBY | |
75 | 1 | Laurent GUERBY | => 12 microsecondes |
76 | 1 | Laurent GUERBY | => 18 microsecondes avec 5 socket vs 2 donc compter + 2 micro/socket |
77 | 6 | Laurent GUERBY | |
78 | 6 | Laurent GUERBY | h2. Generer un payload random |
79 | 6 | Laurent GUERBY | |
80 | 6 | Laurent GUERBY | * http://docs.python.org/library/random.html |
81 | 6 | Laurent GUERBY | * http://docs.python.org/library/struct.html |
82 | 6 | Laurent GUERBY | |
83 | 6 | Laurent GUERBY | <pre> |
84 | 6 | Laurent GUERBY | import random |
85 | 6 | Laurent GUERBY | import struct |
86 | 6 | Laurent GUERBY | |
87 | 6 | Laurent GUERBY | |
88 | 6 | Laurent GUERBY | N=256*256*256*256-1 |
89 | 6 | Laurent GUERBY | S=160000 |
90 | 6 | Laurent GUERBY | random.seed(0) |
91 | 6 | Laurent GUERBY | s="".join([struct.pack("I",random.randint(0,N)) for i in xrange(S/4)]) |
92 | 6 | Laurent GUERBY | print S,len(s) |
93 | 6 | Laurent GUERBY | </pre> |
94 | 6 | Laurent GUERBY | |
95 | 9 | Laurent GUERBY | h2. Premiere mesure de controle de latence : debit |
96 | 6 | Laurent GUERBY | |
97 | 6 | Laurent GUERBY | * sur une ligne ADSL capable de 11 Mbit/s soutenu TCP |
98 | 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 |
99 | 6 | Laurent GUERBY | * sur le client on note le timestamp client en microseconde, le numero de sequence et le timestamp server du paquet |
100 | 6 | Laurent GUERBY | * une fois le test fini (1000 paquets) on calcule paquet par paquet la difference timestamp client moins timestamp server |
101 | 7 | Laurent GUERBY | * on calcul le min de ces differences sur tous les paquets |
102 | 7 | Laurent GUERBY | * on graphe chaque difference moins le min des difference = la deviation par rapport a la normale en microseconde |
103 | 6 | Laurent GUERBY | |
104 | 6 | Laurent GUERBY | Avec D = 10 Mbit/s = en dessous de la capacité de la ligne ça donne : |
105 | 6 | Laurent GUERBY | |
106 | 6 | Laurent GUERBY | !10-1200.png! |
107 | 6 | Laurent GUERBY | |
108 | 6 | Laurent GUERBY | Avec D = 15 Mbit/s = au dessus de la capacité de la ligne ça donne : |
109 | 1 | Laurent GUERBY | |
110 | 1 | Laurent GUERBY | !15-1200.png! |
111 | 6 | Laurent GUERBY | |
112 | 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. |
113 | 7 | Laurent GUERBY | |
114 | 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. |
115 | 6 | Laurent GUERBY | |
116 | 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. |
117 | 7 | Laurent GUERBY | |
118 | 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. |
119 | 9 | Laurent GUERBY | |
120 | 9 | Laurent GUERBY | h2. Deuxieme mesure : paquet par seconde |
121 | 9 | Laurent GUERBY | |
122 | 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) |
123 | 9 | Laurent GUERBY | |
124 | 9 | Laurent GUERBY | * Taille 200 = 5485 pps 8.7 Mbit/s sur theo a 6250 pps |
125 | 9 | Laurent GUERBY | !10-200.png! |
126 | 9 | Laurent GUERBY | |
127 | 9 | Laurent GUERBY | * Taille 350 = 3552 pps 9.9 Mbit/s sur theo a 3570 pps |
128 | 9 | Laurent GUERBY | !10-350.png! |
129 | 9 | Laurent GUERBY | |
130 | 9 | Laurent GUERBY | * Taille 400 = 3126 pps 10 Mbit/s sur theo a 3125 pps |
131 | 9 | Laurent GUERBY | !10-400.png! |
132 | 9 | Laurent GUERBY | |
133 | 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 |
134 | 10 | Laurent GUERBY | |
135 | 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 |
136 | 10 | Laurent GUERBY | |
137 | 11 | Laurent GUERBY | Script de test utilisé : attachment:iperf-20120304.py |
138 | 14 | Laurent GUERBY | |
139 | 14 | Laurent GUERBY | h2. tuntap |
140 | 14 | Laurent GUERBY | |
141 | 14 | Laurent GUERBY | http://backreference.org/2010/03/26/tuntap-interface-tutorial/ |
142 | 14 | Laurent GUERBY | |
143 | 14 | Laurent GUERBY | * http://www.mjmwired.net/kernel/Documentation/networking/tuntap.txt#102 |
144 | 14 | Laurent GUERBY | <pre> |
145 | 14 | Laurent GUERBY | 3.2 Frame format: |
146 | 14 | Laurent GUERBY | If flag IFF_NO_PI is not set each frame format is: |
147 | 14 | Laurent GUERBY | Flags [2 bytes] |
148 | 14 | Laurent GUERBY | Proto [2 bytes] |
149 | 14 | Laurent GUERBY | Raw protocol(IP, IPv6, etc) frame. |
150 | 14 | Laurent GUERBY | </pre> |
151 | 14 | Laurent GUERBY | |
152 | 14 | Laurent GUERBY | |
153 | 14 | Laurent GUERBY | * http://en.wikipedia.org/wiki/Ethernet_frame |
154 | 14 | Laurent GUERBY | <pre> |
155 | 14 | Laurent GUERBY | Preamble Start of frame delimiter MAC destination MAC source 802.1Q tag (optional) Ethertype (Ethernet II) or length (IEEE 802.3) Payload Frame check sequence (32âbit CRC) Interframe gap |
156 | 14 | Laurent GUERBY | 7 octets of 10101010 1 octet of 10101011 6 octets 6 octets (4 octets) 2 octets 42â1500 octets 4 octets 12 octets |
157 | 14 | Laurent GUERBY | </pre> |
158 | 14 | Laurent GUERBY | |
159 | 14 | Laurent GUERBY | * http://en.wikipedia.org/wiki/IPv4#Packet_structure |
160 | 14 | Laurent GUERBY | version premier 4 bits du premier octet = 4 |
161 | 14 | Laurent GUERBY | ip source octet 13 a 16 |
162 | 14 | Laurent GUERBY | ip dest octet 17 a 20 |
163 | 14 | Laurent GUERBY | |
164 | 14 | Laurent GUERBY | * http://en.wikipedia.org/wiki/IPv6_packet |
165 | 14 | Laurent GUERBY | version premier 4 bits du premier octet = 6 |
166 | 14 | Laurent GUERBY | ip source octet 9 a 24 |
167 | 14 | Laurent GUERBY | ip dest octet 25 a 40 |