You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ci: Scripts Tests (CPU) -- un worker xdist mort bloque la jambe jusqu'au plafond (14-17 min de silence apres [99%]) #16288
Sur Scripts Tests (CPU), les annulations au plafond ne sont pas des runs lents coupes par le mur. Les quatre cas cites comme « depassements francs » par la PR #16087 sont des runs bloques : leur travail est termine depuis longtemps quand le plafond les tue.
Signature, sur le job de nom exact Scripts Tests (CPU) (horodatages UTC du log) :
Entre cette ligne et le kill : 14 a 17 min sans une seule ligne de sortie. Ce n'est pas du travail, c'est une attente.
Le declencheur est commun et precede l'annulation : [gwN] node down: Not properly terminated. Sur le run de #16280, replacing crashed worker gw3 confirme que xdist a tente un remplacement, et gw4 est mort 47 s plus tard. La jambe ne repart jamais.
Pourquoi ce n'est pas une question de plafond
Aucun plafond ne sauve ces runs : a 30 min, les cinq auraient brule 30 min et fini cancelled de la meme facon. Relever le plafond (PR #16087) repond a un autre argument — les 2,6 min de marge au-dessus du plus long succes legitime (17,4 min) — et cet argument est fonde. Mais il ne corrige pas cette classe-ci ; il en augmente le cout.
Effet de diagnostic a noter : le plafond etant ce qui termine le blocage, la duree du job vaut exactement le plafond (20,32-20,43 min sur les quatre). Un blocage atterrit toujours sur le mur, quelle que soit la valeur du mur. La lecture « la queue de la distribution franchit le plafond » est donc un artefact de mesure : ces runs ne sont pas longs, ils sont arretes.
Ce qui manque (mesure dans le depot)
Aucun garde-fou anti-blocage dans le job :
l'etape Run tests (.github/workflows/scripts-tests.yml l.235-284) ne porte pas de timeout-minutes ;
l'invocation est pytest <13 chemins> -n 4 --dist loadscope --tb=short -q — pas de --timeout ;
les paquets installes sont numpy pandas scipy pyarrow pytest (l.188) et pytest-xdist (l.233) : pytest-timeout n'est pas present.
Ce que cette mesure n'etablit PAS
Pourquoi les workers meurent. OOM du runner, module qui bloque son worker, interaction avec --dist loadscope : rien ici ne tranche. Le perimetre mesure est la signature et le temps perdu, pas la cause des morts — je n'ai pas de reproduction locale (pytest-xdist absent de ma machine, et le defaut est propre a la classe de runner).
Pistes (a trancher par la mesure, pas par analogie)
piste
ce qu'elle attrape
limite connue
timeout-minutes sur l'etape Run tests
borne le blocage
doit rester au-dessus du plus long succes legitime (17,4 min) — borne donc peu sous un plafond a 30
pytest-timeout + --timeout
un test qui bloque
n'attrape pas une attente post-[99%] : aucun test n'est en cours, le master attend des workers morts
chien de garde sur l'ABSENCE de sortie (kill si la sortie ne progresse plus pendant N min)
colle a la signature
a concevoir — aucun mecanisme natif
maitriser les redemarrages de workers
eviter une boucle de mort
a etablir : le log de #16280 montre un remplacement effectif (replacing crashed worker gw3), la semantique de --max-worker-restart reste a mesurer avant de la citer
Critere d'acceptation propose
Un run bloque doit echouer en moins de N minutes (N proche du plus long succes legitime), avec un verdict qui nomme le worker mort et non seulement le mur. Aujourd'hui le gate nomme le plafond : c'est ce qui fait lire un blocage comme un depassement, et c'est ce qui a motive le relevement.
Le defaut
Sur
Scripts Tests (CPU), les annulations au plafond ne sont pas des runs lents coupes par le mur. Les quatre cas cites comme « depassements francs » par la PR #16087 sont des runs bloques : leur travail est termine depuis longtemps quand le plafond les tue.Signature, sur le job de nom exact
Scripts Tests (CPU)(horodatages UTC du log) :node down[99%])Deux faits decident la lecture :
[99%]signifie qu'il reste une poignee d'items.Le declencheur est commun et precede l'annulation :
[gwN] node down: Not properly terminated. Sur le run de #16280,replacing crashed worker gw3confirme que xdist a tente un remplacement, et gw4 est mort 47 s plus tard. La jambe ne repart jamais.Pourquoi ce n'est pas une question de plafond
Aucun plafond ne sauve ces runs : a 30 min, les cinq auraient brule 30 min et fini
cancelledde la meme facon. Relever le plafond (PR #16087) repond a un autre argument — les 2,6 min de marge au-dessus du plus long succes legitime (17,4 min) — et cet argument est fonde. Mais il ne corrige pas cette classe-ci ; il en augmente le cout.Effet de diagnostic a noter : le plafond etant ce qui termine le blocage, la duree du job vaut exactement le plafond (20,32-20,43 min sur les quatre). Un blocage atterrit toujours sur le mur, quelle que soit la valeur du mur. La lecture « la queue de la distribution franchit le plafond » est donc un artefact de mesure : ces runs ne sont pas longs, ils sont arretes.
Ce qui manque (mesure dans le depot)
Aucun garde-fou anti-blocage dans le job :
Run tests(.github/workflows/scripts-tests.ymll.235-284) ne porte pas detimeout-minutes;pytest <13 chemins> -n 4 --dist loadscope --tb=short -q— pas de--timeout;numpy pandas scipy pyarrow pytest(l.188) etpytest-xdist(l.233) :pytest-timeoutn'est pas present.Ce que cette mesure n'etablit PAS
Pourquoi les workers meurent. OOM du runner, module qui bloque son worker, interaction avec
--dist loadscope: rien ici ne tranche. Le perimetre mesure est la signature et le temps perdu, pas la cause des morts — je n'ai pas de reproduction locale (pytest-xdistabsent de ma machine, et le defaut est propre a la classe de runner).Pistes (a trancher par la mesure, pas par analogie)
timeout-minutessur l'etapeRun testspytest-timeout+--timeout[99%]: aucun test n'est en cours, le master attend des workers mortsreplacing crashed worker gw3), la semantique de--max-worker-restartreste a mesurer avant de la citerCritere d'acceptation propose
Un run bloque doit echouer en moins de N minutes (N proche du plus long succes legitime), avec un verdict qui nomme le worker mort et non seulement le mur. Aujourd'hui le gate nomme le plafond : c'est ce qui fait lire un blocage comme un depassement, et c'est ce qui a motive le relevement.
Liens
Scripts Tests (CPU)— plafond et annulations surmain)ML Pipeline Tests (CPU)sur sa propre distribution (classe sœur de #16087) #16139 (ML Pipeline Tests (CPU), meme famille — a re-mesurer sous cet angle)Mesure : lane
myia-po-2023:CoursIA, 2026-09-15, en instruisant le rouge de la PR #16280.