Datacenter software dynamics
- CPU
- Mémoire
- Disque
- Réseau
- Section critique
C’est quoi un datacenter ?
Sa fonction est de répondre à des requêtes/transactions d’utilisateurs
Un message engendre une unité de travail, l’unité de mesure est la transaction qui atterrit sur un serveur.
Temps de réponse = latence = temps entre l’envoie du message et du résultat
Offered load = ce qu’on voit comme flux de requêtes entrantes du point de vue d’un datacenter, unité de mesure : req/s
Service = ensemble de programme qui permet de gérer un certain type de problème.
La latence du service est variable.
Tail latency = Sauf contre-ordre, c’est le 99th percentile des temps de latence, a.k.a. la pire latence de 1% des clients
Execution skew = distribution des latences
Hardware
Logiciel
RPC = Remote Procedure Call (Exemple : Protobuf de Google)
2 modes à ça :
- Synchrone : on part du principe qu’il n’y a qu’une personne, on bloque et on attend la réponse
- Asynchrone : On n’attend pas le résultat, on continue l’exécution
Cf. cette conférence
Latency distribution
Le t_{max} on s’en fout parce qu’il y a toujours des requêtes qui se perdent.
La courbe verte, c’est une courbe plus “réaliste”.
Ce qu’il se passe avant le 50% et après le 99%, on s’en fout.
Méthode
Observation
CPU
Exo : Mesurer la latence d’une instruction
ADDQ
Unité de mesure : cycle
- Utilisation du RDTSC (sous-horloge de l’horloge physique, dépendant du matériel)
À rendre :
- 1 pdf
- \RA description CPU + Machine avec les résultats
- 1 code (dépôt Moule)
Retour des présentations
Dans l’assembleur quand il y a des %
, le résultat est à droite (GNU), sinon c’est de l’Intel et le résultat est à gauche.
ILP : Instruction Level Parallelism : Quand on peut faire exécuter en parallèle des instructions (sort of)
Il faut donc désactiver l’hyperthreading pour éviter que d’autre programme interfère dans nos instructions.
Faire une moyenne sur plusieurs ordinateurs, ça dépend de l’architecture (fréquence) et du RDTSP qui diffère entre les CPU alors ça n’a aucun sens de les comparer entre machines distinctes.
Observer la mémoire
Memory Wall
sudo perf stat
graph TD
A --> B
B --> C
C --> D
D --> E
E --> F
A[Program]
B[Compilateur]
C[CPU]
D[VMem]
E[Cache]
F[Ram]
Organisation du cache
“cache line” / “cache blocks”
“Fully-associative cache”
“Direct-mapped cache”
“N-way set associative cache”
Alignement des données
“Aligned reference”
struct t *p
sizeof(struct p) = 2^k B
&p mod 2^k = 0
“TLB”
Translation Lookaside Buffers : ce qui est maintenu par l’OS
Mini-projet 2
Avec une cache-lines de 64B
\ra Extraire une variance pour savoir si ça bouge beaucoup (il va y en avoir). Il ne faut pas que la variance soit aussi haute que les plateaux.
\ra Moyenne, car la RAM est bruitée
Exemple attendu :
Cf. sf
Disque dur
Deux facteurs de latences (“seek” = attente pour récupérer la donnée d’environ 20 ms) :
- déplacement de la tête
- rotation des disques pour amener la donnée sous la tête
L’OS possède son système de cache logiciel pour répondre + rapidement aux reqûetes
D’où le fseek
à faire avant de débrancher une clé USB.
- Connecteur SATA 3 = (Serial AT Attachment) : 500Mo/s (ou 6Gb/s)
- Un disque dur c’est max 100 Mo/s
Tête qui se déplace
Entre 4 et 15 ms.
Disque qui tourne
- Il tourne à quelle vitesse (RPM) ? Souvent 7200 rotations par minutes. Donc 120 révolutions (tours) par seconde ; donc 1 seul tour = 8,33 ms \approx 4 ms
SSD
wear leveling = les transistors s’usent et il faut répartir la charge sur les transistors
- Port PCIe = minimum 1Go/s
Sur un port SATA, il va le saturer et faire le max (500Mo/s) et sur un PCIe il va s’approche des 1Go/s (genre 700-900Mo/s)
OS
Tout est fichiers, et les fichiers ne font pas 4kb.
file extent : suite consécutive du LBA.
Un fichier, c’est une séquence de extent (parce qu’il peut être fragmenté en plusieurs morceaux sur le disque)
Il y a du cache en lecture (read caching) et du cache en écriture (write caching).
Read Caching : Les lectures séquentielles sont rapides (contrairement aux lectures randomisées, merci la cache).
Write Caching : Quand on écrit sur le disque, c’est déjà envoyé dans la cache (écriture instantanée côté user) et il écrira sur le disque + tard. Pour s’assurer que tout est écrit sur le disque, il faut flush avec fsync
.
Exemple
Programme A
- 10 write de 1Mo chacun
Programme B
- Lit 64 Ko sur le disque
latence de B : 10(t_{\text{seek}} + t_{\text{write}})+ 1 \times (t_{\text{seek}} + t_{\text{read}})
But du Mini Projet 3
Mesure ce temps de latence pour aller chercher une donnée (seek)
On va pouvoir utiliser le temps (clock_t
)
Si on voit des valeurs + rapide que le disque, alors on est dans le cache du disque.
\ra si on reçoit tous les blocs d’un coup, alors cest qu’on est dans le cache
Le mieux c’est de le faire sur une partition non utilisée, mais c’est pas obligatoire (réduction du bruit)
Disgression
Half-useful principle
table t
: startup T secondes.
Il faut que le temps d’exécution de t
soit supérieur à T : temps(t)> T
- Sinon, on prend plus de temps à lancer la tâche par rapport à la tâche elle-même
- Sinon ça veut dire qu’on fait un truc “qui ne sert à rien”, afin de rentabiliser le temps et éviter de perdre des performances.
Ethernet
Frames/Ethernet packets : ce qui circule dans les câbles (trames en français) : 1518 octets (B/bytes)
- En cas de perte de paquet, il ne se passe rien
- S’il a été modifié, il est rejeté
CRC c’est une optimisation, pas une fonctionnalité, le CRC rejette les paquets évidemment faux, pas basé sur la validité de la donnée en tant que telle, car le CRC n’est pas parfait.
EtherType
codera que la donnée est de l’IP
si on utilise le TCP/IP.
Débit réseau filaire : \approx 1Gb/s (débit disque SSD : \approx 24Gb/s)
Switch fabric (tissu du réseau)
- Hub : répète un signal sans traitement, envoie le signal sur toutes ses connexions.
- Switch : un hub, mais avec du traitement, donc il redirige uniquement aux bons destinataires en associant les adresses et les ports grâce à son “cache” (sinon il fait une annonce globale pour trouver le destinataire).
- Routeur : Comme un switch, mais il permet aussi de faire de l’analyse TCP/IP (il voit les adresses IP et les réseaux virtuels).
On veut que le ToR (top of rack) soit le plus rapide possible. Le switch est au ToR.
TCP/IP
Technologie utilisée partout sauf dans le cas des calculs scientifique, mais on s’en fout.
Le protocole TCP/IP garantit la livraison des données (en best-effort, il y a un timeout et il ne peut pas faire grand-chose si le destinataire dort).
Idée de “paquet en cours de transfert” : on a envoyé un paquet et on a pas encore reçu le ACK (acknowledgement).
TCP est bidirectionnelle, il y a une notion de “connexion”.
Le protocole UDP est très proche de l’Ethernet, car il n’offre aucune garantit, c’est le minimum possible au-dessus d’Ethernet.
QUIC de Google : Construit sur UDP avec les “vérifications” de UDP qui est chiffré pour empêcher les navigateurs de trop regarder ce qu’il y a dedans et améliorer les performances
VLAN
Réseau virtuel
RPC
- Appel bloquant synchrone
- Appel asynchrone
Met t_{2}< t_1 ? Dépend de l’horloge…
\text{slope : } (t_{4}-t_{1}) - (t_{3} - t_{2}) - t_{\text{request}} - t_{\text{response}}
- t_{request} : temps que la requête a pris
- t_{response} : temps que la réponse a pris
- slope : temps de dépertition/perte, qui doit être le plus bas possible.
Serveur canary : on lance une requête avant de la distribuer pour ne pas faire crash tous les serveurs.