Skip to content

Une passe run peut tourner indéfiniment en boucle active (53 h de CPU pour une seule référence) #12

Description

@roomi-fields

Observé

Sur un VPS 2 vCPU, deux passes lancées via python -m pipeline run --retry-exhausted --no-lint --no-doctor --ref … (0.4.0) ne se sont jamais terminées :

processus durée écoulée CPU cumulé état mémoire résidente
--ref despret_2019_habiter 2 j 21 h 53 h 48 R (actif) 700 Ko
--ref kopenawa_2010_chute_2,… (13 refs) 23 h 34 8 h 56 R (actif) 704 Ko

Chacun avait encore son playwright/driver/node run-driver vivant, inactif.

État R continu + mémoire résidente minuscule = boucle active, pas une attente réseau. Aucune sortie n'était produite.

Conséquence : un cœur saturé en continu pendant 3 jours, puis bridage de la machine entière par l'hébergeur (90 % de temps volé), tous les autres services du serveur à l'arrêt.

Environnement

  • paper-trail 0.4.0, RESEARCH_ENABLE_SHADOW_LIBS=1
  • lancé sous xvfb-run, profil navigateur persistant
  • RESEARCH_ANNAS_HEADFUL_BUDGET_S non fixé pour la première passe (donc 600 s), fixé à 180 pour la seconde — les deux ont largement dépassé leur budget

Attendu

BUDGET_S + _wall_clock_guard sont censés borner la route Anna's headful, et la passe entière devrait rendre la main. Aucune des deux bornes n'a joué.

Pistes

  • _wall_clock_guard ne s'arme que dans le fil principal (threading.current_thread() is main_thread()) et rend la main en silence sinon : si une route s'exécute hors fil principal, il n'y a plus aucune borne dure.
  • Le ré-armement de SIGALRM toutes les 15 s peut relancer _BudgetExpired à l'intérieur du finally de fermeture du navigateur.
  • Aucune borne globale sur la passe run elle-même, seulement par route.

Suggestions

  1. Une borne dure au niveau de run (échéance globale, pas seulement par route), qui rende la main même si une route ne coopère pas.
  2. Faire échouer bruyamment _wall_clock_guard quand il ne peut pas s'armer, plutôt que de rendre la main en silence sans protection.
  3. À défaut, documenter que run doit être lancé dans son propre groupe de processus et tué par groupe : tuer le processus direct laisse les descendants en vie.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions