Dire où va le temps
La latence est le temps entre une requête et sa réponse. Pour un appel à un modèle, ce sont deux nombres : l’attente du premier jeton, et celle du dernier. C’est utile parce que les utilisateurs jugent une fonction sur ses pires moments, pas sur sa moyenne.
Une fonction qui répond en une seconde à dix-neuf utilisateurs et en huit secondes au vingtième paraît cassée à ce vingtième.
À la fin de cette leçon
Remarque
Je peux dire où va le temps dans un appel à un modèle et fixer un délai maximal à partir de durées enregistrées.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Latence | le temps qu’une requête met à recevoir sa réponse |
| Premier jeton | le premier morceau d’une réponse en flux |
| Centile | la valeur sous laquelle tombe une part des requêtes |
| Queue | les quelques requêtes les plus lentes |
| Délai maximal | l’attente la plus longue avant d’abandonner |
| Flux | l’envoi d’une réponse par morceaux, au fur et à mesure |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les centiles montrent la queue
Une moyenne cache les requêtes lentes. Triez plutôt les durées. La médiane (p50) est celle du milieu. Le p95 est la valeur sous laquelle ou à laquelle se trouvent 95 pour cent des requêtes. Les quelques-unes au-dessus forment la queue.
Utilisez le rang le plus proche. Avec n valeurs, prenez celle de la place p pour cent de n, arrondie vers le haut, en comptant à partir de 1. Aucune interpolation : tous les outils donnent la même réponse.
Exemple détaillé : vingt durées
| Mesure | Place sur 20 | Valeur |
|---|---|---|
| p50 | 10e | 900 ms |
| p90 | 18e | 2300 ms |
| p95 | 19e | 4200 ms |
| p99 | 20e | 7800 ms |
| Moyenne | aucune | 1493 ms |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Fixer un délai maximal avec les données
Un délai maximal est l’attente la plus longue que vous acceptez. Trop court, il coupe de bonnes réponses. Trop long, un appel bloqué retient un utilisateur et une connexion. Prenez un centile élevé comme le p95, ajoutez une marge et arrondissez.
Le flux masque l’attente : l’utilisateur lit le premier jeton après quelques centaines de millisecondes pendant que le reste arrive. Mesurez le premier jeton et la réponse entière séparément, et donnez à chacun sa limite.
Une erreur courante
Attention
Beaucoup fixent le délai maximal d’après la moyenne, parce que c’est un seul nombre facile. Ici, avec la moyenne de 1493 ms, 4 requêtes sur 20 seraient coupées alors qu’elles allaient aboutir. Fixez-le d’après un centile élevé de durées enregistrées, et vérifiez combien il en couperait.
Écrire le rapport de latence, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Vingt durées enregistrées et inventées, en millisecondes : la réponse entière et le premier jeton.' 'const TOTAL = [820, 910, 760, 1500, 880, 940, 830, 4200, 900, 870, 1020, 790, 850, 2300, 910, 880, 960, 840, 7800, 900];' 'const PREMIER = [210, 240, 200, 300, 220, 250, 215, 500, 230, 225, 260, 205, 222, 380, 240, 228, 255, 218, 900, 232];' > latency4.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le rapport de latence, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Rang le plus proche : on trie, puis on prend la valeur à la place plafond(p pour cent de n).' 'function centile(valeurs, p) {' ' const triees = valeurs.slice().sort(function (a, b) { return a - b; });' ' const rang = Math.ceil(p * triees.length / 100);' ' return triees[rang - 1];' '}' 'function moyenne(valeurs) {' ' return Math.round(valeurs.reduce(function (somme, v) { return somme + v; }, 0) / valeurs.length);' '}' >> latency4.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le rapport de latence, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Un délai maximal : le 95e centile plus 20 pour cent de marge, arrondi à 100 ms au-dessus.' 'function delaiMax(valeurs) {' ' return Math.ceil(centile(valeurs, 95) * 120 / 100 / 100) * 100;' '}' 'function au_dela(valeurs, limite) {' ' return valeurs.filter(function (v) { return v > limite; }).length;' '}' >> latency4.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le rapport de latence, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const limite = delaiMax(TOTAL);' 'console.log(\"réponse entière : p50 \" + centile(TOTAL, 50) + \", p90 \" + centile(TOTAL, 90) + \", p95 \" + centile(TOTAL, 95) + \", p99 \" + centile(TOTAL, 99) + \" ms\");' 'console.log(\"moyenne \" + moyenne(TOTAL) + \" ms, plus lent \" + Math.max(...TOTAL) + \" ms\");' 'console.log(\"premier jeton : p50 \" + centile(PREMIER, 50) + \", p95 \" + centile(PREMIER, 95) + \" ms\");' 'console.log(\"délai maximal \" + limite + \" ms coupe \" + au_dela(TOTAL, limite) + \" sur \" + TOTAL.length);' 'console.log(\"un délai de 2000 ms couperait \" + au_dela(TOTAL, 2000) + \" sur \" + TOTAL.length);' >> latency4.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer le rapport
docker exec -w /home/node/project agent node latency4.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ces durées sont enregistrées
Rien ici ne ralentit un appel exprès. Les vingt durées sont enregistrées et inventées, donc chaque étudiant a les mêmes nombres. Un vrai système les lit dans ses traces, comme dans la première leçon.
Le Run n’appelle aucun modèle : il n’a besoin d’aucun assistant et n’a rien à remplacer.
Sortie du Run
| Ligne | Ce qu’elle montre |
|---|---|
| réponse entière : p50 900, p90 2300, p95 4200, p99 7800 ms | La forme de la réponse entière |
| moyenne 1493 ms, plus lent 7800 ms | La moyenne est tirée vers le haut par quelques requêtes très lentes |
| premier jeton : p50 230, p95 500 ms | Le flux montre un premier jeton bien plus tôt |
| délai maximal 5100 ms coupe 1 sur 20 | p95 plus 20 pour cent, arrondi à 100 |
| un délai de 2000 ms couperait 3 sur 20 | Une supposition coupe de bonnes réponses |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.