Appliquez les lois opérationnelles
Pendant deux minutes du pic d’ouverture, l’équipe de la billetterie a relevé quelques compteurs : combien de temps le disque de la base de données a été occupé, combien d’accès il a servis, combien de commandes ont été validées. Rien de plus. Peut-on en déduire le temps que chaque commande passe sur le disque, ou le nombre de commandes en cours à chaque instant ?
Oui, et sans aucune hypothèse de probabilité ! Les lois opérationnelles sont des identités, vraies sur n’importe quelle période d’observation. Ce sont les outils les plus simples et les plus utiles de tout le cours.
Le modèle : des ressources que les requêtes visitent
Section intitulée « Le modèle : des ressources que les requêtes visitent »On voit le système comme un ensemble de ressources (processeur, disques, réseau), que chaque requête visite une ou plusieurs fois avant de repartir. Pour la billetterie, une commande passe par le serveur web frontal, puis alterne entre le processeur du serveur d’application et le disque de la base de données.
Ce que l’on observe
Section intitulée « Ce que l’on observe »Sur une période d’observation de durée , on relève pour chaque ressource :
- : le temps occupé (busy time) de la ressource ;
- : le nombre d’arrivées (demandes de service) ;
- : le nombre de terminaisons (services achevés).
Pour le système entier, on note le nombre de requêtes entrées et le nombre de requêtes terminées. Ce sont des compteurs très faciles à obtenir : les outils système comme iostat ou vmstat les fournissent directement.
Ce que l’on en déduit
Section intitulée « Ce que l’on en déduit »À partir de ces compteurs, on définit les variables dérivées :
| Variable | Formule | Signification |
|---|---|---|
| Temps de service | durée moyenne d’un passage sur la ressource | |
| Utilisation | fraction du temps où est occupée | |
| Débit de la ressource | passages terminés par seconde sur | |
| Taux d’arrivée | demandes arrivant par seconde sur | |
| Débit du système | requêtes terminées par seconde | |
| Nombre de visites | nombre moyen de passages sur par requête | |
| Demande de service | temps total de service reçu sur par requête |
La dernière ligne est la plus importante du cours. La demande de service est le temps qu’une requête passe réellement à se faire servir par la ressource , toutes visites confondues, sans compter l’attente.
Les trois premières lois : utilisation, flux forcé, demande de service
Section intitulée « Les trois premières lois : utilisation, flux forcé, demande de service »On suppose l’équilibre des flux (job flow balance) : sur la période, il entre autant de requêtes qu’il en sort ( et ). C’est raisonnable dès que la période est longue devant le temps de réponse.
Loi d’utilisation. En écrivant , on obtient :
L’utilisation d’une ressource est son débit multiplié par son temps de service. La deuxième égalité vient de l’équilibre des flux ().
Loi du flux forcé (forced flow law). Chaque requête du système provoque en moyenne passages sur , donc :
Le débit de chaque ressource est « forcé » par le débit du système. C’est ce qui permet de passer d’une ressource au système entier.
Loi de la demande de service. En combinant les deux précédentes :
C’est une formule précieuse en pratique : vous n’avez même pas besoin de compter les visites. L’utilisation de la ressource et le débit du système suffisent pour connaître la demande de service.
La loi de Little
Section intitulée « La loi de Little »C’est la plus célèbre des lois de performance. Elle relie le nombre moyen de requêtes présentes dans un système , son débit et le temps de réponse moyen :
- est le nombre moyen de requêtes présentes (en attente ou en service) ;
- est le débit (requêtes terminées par seconde) ;
- est le temps moyen qu’une requête passe dans le système.
L’intuition est simple : si 10 commandes entrent chaque seconde et que chacune reste 0,2 s, alors à tout instant il y a en moyenne commandes en cours de traitement. Pensez à une file devant une boulangerie : si 2 clients arrivent par minute et que chacun reste 5 minutes, il y a en moyenne 10 clients dans la boutique.
La force de cette loi, c’est qu’elle s’applique à n’importe quel sous-système dont on sait délimiter les entrées et les sorties : une file d’attente seule, un disque (file comprise), le serveur entier, ou même un système avec ses utilisateurs.
Le temps de réponse d’un système interactif
Section intitulée « Le temps de réponse d’un système interactif »Dans un système interactif, un nombre fixe d’utilisateurs alternent entre deux états : ils attendent une réponse (pendant ), puis ils réfléchissent avant de cliquer à nouveau (pendant un temps de réflexion moyen ). Appliquons Little à la boucle complète « utilisateurs plus système » : les utilisateurs sont tous quelque part dans la boucle, et chaque tour dure . Donc , d’où :
- est le nombre d’utilisateurs connectés ;
- est le débit du système ;
- est le temps de réflexion moyen entre la réponse et la requête suivante.
Tout faire en quelques lignes de Python
Section intitulée « Tout faire en quelques lignes de Python »Les lois opérationnelles se codent en quelques lignes. C’est le genre de script que l’on garde sous la main pour vérifier la cohérence de mesures :
T, C0 = 120.0, 1_200 # durée d'observation (s), commandes terminéescompteurs = { # ressource : (temps occupé B en s, passages C) "web": (24.0, 1_200), "processeur": (36.0, 6_000), "disque": (72.0, 4_800),}
X0 = C0 / Tprint(f"Débit du système X0 = {X0:.1f} req/s")for nom, (B, C) in compteurs.items(): U = B / T # loi d'utilisation S = B / C # temps de service par visite V = C / C0 # visites par requête D = U / X0 # loi de la demande de service (= V * S) print(f"{nom:<11} U={U:.2f} S={S*1000:5.1f} ms V={V:.0f} D={D*1000:5.1f} ms")La sortie donne une demande de 20 ms pour le serveur web, 30 ms pour le processeur et 60 ms pour le disque. Nous réutiliserons ces trois demandes dans tous les chapitres suivants.
En résumé
Section intitulée « En résumé »- Les lois opérationnelles sont des identités tirées de compteurs (, , , , ), sans hypothèse probabiliste ; on suppose seulement l’équilibre des flux.
- Utilisation : . Flux forcé : .
- Demande de service : , le temps de service total par requête sur la ressource .
- Little : , valable pour tout sous-système délimité.
- Temps de réponse interactif : , qui n’est autre que Little appliquée à la boucle utilisateurs plus système.
- Ne confondez pas (par visite) et (par requête), ni le temps de service (sans attente) et le temps de réponse (avec attente).
Exercices
Section intitulée « Exercices »Exercice · Du compteur à la demande
facileSur une période de 5 minutes, un serveur de fichiers a terminé 9 000 requêtes. Son disque a été occupé 180 s et a effectué 27 000 accès.
Calculez l’utilisation du disque, son débit, son temps de service, le nombre de visites par requête et la demande de service.
Voir la solution
s.
- Utilisation : .
- Débit du disque : accès/s.
- Temps de service : ms.
- Débit du système : req/s, donc visites par requête.
- Demande de service : ms, que l’on retrouve par s.
En code
T = 5 * 60 # période d'observation (s)C0, B, C = 9_000, 180, 27_000 # requêtes terminées, temps occupé du disque (s), accès disque
U = B / T # utilisationX = C / T # débit du disque (accès/s)S = B / C # temps de service par accès (s)X0 = C0 / T # débit du système (req/s)V = C / C0 # visites par requêteD = V * S # demande de service (s)print(U, X, round(S * 1000, 2), X0, V) # 0.6 90.0 6.67 30.0 3.0print(round(D * 1000, 1), U / X0) # 20.0 0.02 : les deux calculs de D concordentT <- 5 * 60 # période d'observation (s)C0 <- 9000; B <- 180; C <- 27000
U <- B / T # utilisationX <- C / T # débit du disque (accès/s)S <- B / C # temps de service par accès (s)X0 <- C0 / T # débit du système (req/s)V <- C / C0 # visites par requêteD <- V * S # demande de service (s)c(U = U, X = X, S_ms = S * 1000, X0 = X0, V = V) # 0.6 90 6.67 30 3c(D_ms = D * 1000, U_sur_X0 = U / X0) # 20 0.02Exercice · Little dans tous les sens
moyen- Une file de messages reçoit 500 messages par seconde et en contient 1 500 en moyenne. Combien de temps un message y reste-t-il ?
- Un site a en moyenne 40 requêtes en cours et un temps de réponse moyen de 0,2 s. Quel est son débit ?
- Un pool de 32 fils d’exécution traite des requêtes qui durent 80 ms chacune, sans attente. Quel débit maximal peut-il soutenir ?
Voir la solution
- s.
- req/s.
- Au maximum, les 32 fils sont tous occupés : . Avec s, req/s. Au-delà, les requêtes supplémentaires devront attendre un fil libre, et le temps de réponse augmentera.
En code
# Loi de Little : N = X * R, on isole l'inconnue à chaque foisR_file = 1_500 / 500 # 1. R = N / XX_site = 40 / 0.2 # 2. X = N / RX_pool = 32 / 0.080 # 3. X = N / R avec les 32 fils occupésprint(R_file, X_site, X_pool) # 3.0 s 200.0 req/s 400.0 req/s# Loi de Little : N = X * R, on isole l'inconnue à chaque foisR_file <- 1500 / 500 # 1. R = N / XX_site <- 40 / 0.2 # 2. X = N / RX_pool <- 32 / 0.080 # 3. X = N / R avec les 32 fils occupésc(R_file, X_site, X_pool) # 3 200 400Exercice · Un système interactif
difficileUn logiciel de gestion est utilisé par 60 agents simultanés. On mesure un débit de 5 transactions/s et un temps de réponse moyen de 2 s. Le processeur du serveur a une utilisation de 0,5.
- Quel est le temps de réflexion moyen des agents ?
- Quelle est la demande de service du processeur ?
- Combien de transactions sont en moyenne présentes dans le serveur ? Et combien d’agents sont en train de réfléchir ?
Voir la solution
- De , on tire s.
- s, soit 100 ms par transaction.
- Little sur le serveur seul : transactions en cours. Little sur les agents en réflexion : . On vérifie que : tous les agents sont bien comptés.
En code
M, X0, R, U_cpu = 60, 5, 2, 0.5 # agents, débit (tr/s), temps de réponse (s), utilisation CPU
Z = M / X0 - R # 1. loi du temps de réponse interactifD_cpu = U_cpu / X0 # 2. loi de la demande de serviceN_serveur = X0 * R # 3. Little sur le serveurN_reflexion = X0 * Z # Little sur les agents qui réfléchissentprint(Z, D_cpu) # 10.0 s 0.1 sprint(N_serveur, N_reflexion, N_serveur + N_reflexion) # 10 50 60 : tout le monde est comptéM <- 60; X0 <- 5; R <- 2; U_cpu <- 0.5
Z <- M / X0 - R # 1. loi du temps de réponse interactifD_cpu <- U_cpu / X0 # 2. loi de la demande de serviceN_serveur <- X0 * R # 3. Little sur le serveurN_reflexion <- X0 * Z # Little sur les agents qui réfléchissentc(Z = Z, D_cpu = D_cpu) # 10 0.1c(N_serveur, N_reflexion, N_serveur + N_reflexion) # 10 50 60