Projet agregation v2
Version 9 (Laurent GUERBY, 03/23/2013 07:40 am)
| 1 | 1 | h1. Projet agregation v2 |
|
|---|---|---|---|
| 2 | 1 | ||
| 3 | 1 | [[Projet agregation]] |
|
| 4 | 1 | ||
| 5 | 1 | h2. Divers |
|
| 6 | 1 | ||
| 7 | 1 | * 1 Mbit/s = 83 frames de 1500 byte/sec = 1 frame de 1500 byte toutes les 12 ms |
|
| 8 | 1 | * l'augmentation de latence sur la ligne permet la detection de la saturation des buffer |
|
| 9 | 1 | * on peut mesurer les variations de latence en regardant les variations de difference de timestamp destination moins source |
|
| 10 | 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) |
| 11 | 2 | Laurent GUERBY | |
| 12 | 6 | Laurent GUERBY | h2. Resolution de time.time() |
| 13 | 1 | ||
| 14 | 4 | Laurent GUERBY | * http://stackoverflow.com/questions/1938048/high-precision-clock-in-python |
| 15 | 2 | Laurent GUERBY | |
| 16 | 4 | Laurent GUERBY | <pre> |
| 17 | 2 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat ttime.py |
| 18 | 2 | Laurent GUERBY | import time |
| 19 | 2 | Laurent GUERBY | |
| 20 | 2 | Laurent GUERBY | N=1000 |
| 21 | 2 | Laurent GUERBY | l=[] |
| 22 | 2 | Laurent GUERBY | for i in xrange(N): |
| 23 | 2 | Laurent GUERBY | t1=time.time() |
| 24 | 2 | Laurent GUERBY | t2=time.time() |
| 25 | 2 | Laurent GUERBY | dt=t2-t1 |
| 26 | 2 | Laurent GUERBY | l.append(dt) |
| 27 | 2 | Laurent GUERBY | |
| 28 | 2 | Laurent GUERBY | l.sort() |
| 29 | 2 | Laurent GUERBY | print l[0],l[-1],l[N/2],l[9*N/10] |
| 30 | 2 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py |
| 31 | 2 | Laurent GUERBY | 9.53674316406e-07 3.00407409668e-05 1.90734863281e-06 2.14576721191e-06 |
| 32 | 2 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py |
| 33 | 2 | Laurent GUERBY | 9.53674316406e-07 1.19209289551e-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 0.000508069992065 1.90734863281e-06 2.14576721191e-06 |
| 36 | 2 | Laurent GUERBY | </pre> |
| 37 | 2 | Laurent GUERBY | |
| 38 | 2 | Laurent GUERBY | => autour de 2 microsecondes en pratique |
| 39 | 3 | Laurent GUERBY | |
| 40 | 6 | Laurent GUERBY | h2. Résolution de select en python |
| 41 | 3 | Laurent GUERBY | |
| 42 | 4 | Laurent GUERBY | <pre> |
| 43 | 3 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat tselect.py |
| 44 | 3 | Laurent GUERBY | import time |
| 45 | 3 | Laurent GUERBY | import select |
| 46 | 3 | Laurent GUERBY | from socket import * |
| 47 | 3 | Laurent GUERBY | from select import select |
| 48 | 3 | Laurent GUERBY | |
| 49 | 3 | Laurent GUERBY | |
| 50 | 3 | Laurent GUERBY | |
| 51 | 3 | Laurent GUERBY | s1 = socket(AF_INET, SOCK_DGRAM) |
| 52 | 3 | Laurent GUERBY | s2 = socket(AF_INET, SOCK_DGRAM) |
| 53 | 3 | Laurent GUERBY | |
| 54 | 3 | Laurent GUERBY | N=1000 |
| 55 | 3 | Laurent GUERBY | l=[] |
| 56 | 3 | Laurent GUERBY | for i in xrange(N): |
| 57 | 3 | Laurent GUERBY | t1=time.time() |
| 58 | 3 | Laurent GUERBY | r = select([s1,s2],[],[],1.0e-9) |
| 59 | 3 | Laurent GUERBY | t2=time.time() |
| 60 | 3 | Laurent GUERBY | dt=t2-t1 |
| 61 | 3 | Laurent GUERBY | l.append(dt) |
| 62 | 3 | Laurent GUERBY | |
| 63 | 3 | Laurent GUERBY | l.sort() |
| 64 | 1 | print l[0],l[-1],l[N/2],l[9*N/10] |
|
| 65 | 3 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py |
| 66 | 3 | Laurent GUERBY | 9.77516174316e-06 0.000253915786743 1.09672546387e-05 1.12056732178e-05 |
| 67 | 3 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py |
| 68 | 3 | Laurent GUERBY | 9.77516174316e-06 5.41210174561e-05 1.09672546387e-05 1.12056732178e-05 |
| 69 | 4 | Laurent GUERBY | </pre> |
| 70 | 3 | Laurent GUERBY | |
| 71 | 1 | => 12 microsecondes |
|
| 72 | 1 | => 18 microsecondes avec 5 socket vs 2 donc compter + 2 micro/socket |
|
| 73 | 6 | Laurent GUERBY | |
| 74 | 6 | Laurent GUERBY | h2. Generer un payload random |
| 75 | 6 | Laurent GUERBY | |
| 76 | 6 | Laurent GUERBY | * http://docs.python.org/library/random.html |
| 77 | 6 | Laurent GUERBY | * http://docs.python.org/library/struct.html |
| 78 | 6 | Laurent GUERBY | |
| 79 | 6 | Laurent GUERBY | <pre> |
| 80 | 6 | Laurent GUERBY | import random |
| 81 | 6 | Laurent GUERBY | import struct |
| 82 | 6 | Laurent GUERBY | |
| 83 | 6 | Laurent GUERBY | |
| 84 | 6 | Laurent GUERBY | N=256*256*256*256-1 |
| 85 | 6 | Laurent GUERBY | S=160000 |
| 86 | 6 | Laurent GUERBY | random.seed(0) |
| 87 | 6 | Laurent GUERBY | s="".join([struct.pack("I",random.randint(0,N)) for i in xrange(S/4)]) |
| 88 | 6 | Laurent GUERBY | print S,len(s) |
| 89 | 6 | Laurent GUERBY | </pre> |
| 90 | 6 | Laurent GUERBY | |
| 91 | 9 | Laurent GUERBY | h2. Premiere mesure de controle de latence : debit |
| 92 | 6 | Laurent GUERBY | |
| 93 | 6 | Laurent GUERBY | * sur une ligne ADSL capable de 11 Mbit/s soutenu TCP |
| 94 | 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 |
| 95 | 6 | Laurent GUERBY | * sur le client on note le timestamp client en microseconde, le numero de sequence et le timestamp server du paquet |
| 96 | 6 | Laurent GUERBY | * une fois le test fini (1000 paquets) on calcule paquet par paquet la difference timestamp client moins timestamp server |
| 97 | 7 | Laurent GUERBY | * on calcul le min de ces differences sur tous les paquets |
| 98 | 7 | Laurent GUERBY | * on graphe chaque difference moins le min des difference = la deviation par rapport a la normale en microseconde |
| 99 | 6 | Laurent GUERBY | |
| 100 | 6 | Laurent GUERBY | Avec D = 10 Mbit/s = en dessous de la capacité de la ligne ça donne : |
| 101 | 6 | Laurent GUERBY | |
| 102 | 6 | Laurent GUERBY | !10-1200.png! |
| 103 | 6 | Laurent GUERBY | |
| 104 | 6 | Laurent GUERBY | Avec D = 15 Mbit/s = au dessus de la capacité de la ligne ça donne : |
| 105 | 1 | ||
| 106 | 1 | !15-1200.png! |
|
| 107 | 6 | Laurent GUERBY | |
| 108 | 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. |
| 109 | 7 | Laurent GUERBY | |
| 110 | 1 | 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. |
|
| 111 | 6 | Laurent GUERBY | |
| 112 | 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. |
| 113 | 7 | Laurent GUERBY | |
| 114 | 1 | 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. |
|
| 115 | 9 | Laurent GUERBY | |
| 116 | 9 | Laurent GUERBY | h2. Deuxieme mesure : paquet par seconde |
| 117 | 9 | Laurent GUERBY | |
| 118 | 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) |
| 119 | 9 | Laurent GUERBY | |
| 120 | 9 | Laurent GUERBY | * Taille 200 = 5485 pps 8.7 Mbit/s sur theo a 6250 pps |
| 121 | 9 | Laurent GUERBY | !10-200.png! |
| 122 | 9 | Laurent GUERBY | |
| 123 | 9 | Laurent GUERBY | * Taille 350 = 3552 pps 9.9 Mbit/s sur theo a 3570 pps |
| 124 | 9 | Laurent GUERBY | !10-350.png! |
| 125 | 9 | Laurent GUERBY | |
| 126 | 9 | Laurent GUERBY | * Taille 400 = 3126 pps 10 Mbit/s sur theo a 3125 pps |
| 127 | 9 | Laurent GUERBY | !10-400.png! |
| 128 | 9 | Laurent GUERBY | |
| 129 | 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 |