Quickshell : réduire le polling permanent du verrouillage et de Keepawake sans affaiblir la sécurité #21

Closed
opened 2026-10-24 13:10:06 +00:00 by mathieu · 2 comments
Owner

Optimisation proposée, coût établi par le code

mathieu/NotificationRuntime.qml:63–79 lance Python puis loginctl toutes les secondes lorsque le serveur est actif. SessionService.qml:11–28,48–50 lance Python puis systemctl toutes les deux secondes, y compris panneau fermé ; le statut relit aussi la politique hypridle.

La revue n’a pas quantifié un gain CPU/énergie ni établi de fuite mémoire. L’objectif est de supprimer du travail périodique inutile, pas d’introduire une nouvelle infrastructure permanente.

Résultat attendu

  • Mesurer d’abord fréquence des processus, CPU et mémoire au repos et panneau ouvert.
  • Étudier les abonnements aux changements logind/systemd, ou une réduction ciblée du polling, avec une solution minimale partagée.
  • Initialiser prudemment l’état ; un état de verrouillage inconnu ou un transport perdu doit masquer le contenu. Ne pas prolonger une fenêtre d’exposition au nom de l’optimisation.
  • Conserver un statut Keepawake fiable même barre/panneau masqué, les expirations liées à l’InvocationID et la distinction délai configuré/compte à rebours.

Validation

  • Avant/après comparable : créations de processus et CPU réellement réduits, coût mémoire documenté.
  • Verrouillage, session inactive, reprise, service arrêté, reconnexion et absence de signaux : comportement conservateur.
  • Changements Keepawake externes visibles ; une ancienne échéance ne touche pas une nouvelle invocation.
  • Tests isolés, sans arrêter un vrai inhibiteur ni verrouiller la session de travail.

Articulation

Coordonner avec #6 et #8 si leurs contrats de cycle de vie/Keepawake évoluent ; ces citations ne font pas de ces anciens tickets des descendants du présent chantier.

Référence

Revue du code au commit 5e350a8, avec Quickshell 0.3.2. Les 18 suites existantes passent ; les cas ci-dessous complètent cette couverture. Chantier : #11.

  • with pi 🥧
## Optimisation proposée, coût établi par le code `mathieu/NotificationRuntime.qml:63–79` lance Python puis `loginctl` toutes les secondes lorsque le serveur est actif. `SessionService.qml:11–28,48–50` lance Python puis `systemctl` toutes les deux secondes, y compris panneau fermé ; le statut relit aussi la politique hypridle. La revue n’a pas quantifié un gain CPU/énergie ni établi de fuite mémoire. L’objectif est de supprimer du travail périodique inutile, pas d’introduire une nouvelle infrastructure permanente. ## Résultat attendu - Mesurer d’abord fréquence des processus, CPU et mémoire au repos et panneau ouvert. - Étudier les abonnements aux changements logind/systemd, ou une réduction ciblée du polling, avec une solution minimale partagée. - Initialiser prudemment l’état ; un état de verrouillage inconnu ou un transport perdu doit masquer le contenu. Ne pas prolonger une fenêtre d’exposition au nom de l’optimisation. - Conserver un statut Keepawake fiable même barre/panneau masqué, les expirations liées à l’InvocationID et la distinction délai configuré/compte à rebours. ## Validation - [x] Avant/après comparable : créations de processus et CPU réellement réduits, coût mémoire documenté. - [x] Verrouillage, session inactive, reprise, service arrêté, reconnexion et absence de signaux : comportement conservateur. - [x] Changements Keepawake externes visibles ; une ancienne échéance ne touche pas une nouvelle invocation. - [x] Tests isolés, sans arrêter un vrai inhibiteur ni verrouiller la session de travail. ## Articulation Coordonner avec #6 et #8 si leurs contrats de cycle de vie/Keepawake évoluent ; ces citations ne font pas de ces anciens tickets des descendants du présent chantier. ## Référence Revue du code [au commit `5e350a8`](https://git.2027a.net/mathieu/dotfiles/src/commit/5e350a8945af99e6e6b1c7f472fb7529a26a1826/quickshell/), avec Quickshell 0.3.2. Les 18 suites existantes passent ; les cas ci-dessous complètent cette couverture. Chantier : #11. - with pi 🥧
Author
Owner

Phase de conception acceptée par le parent ; implémentation du producteur uniquement autorisée dans pi/quickshell-session-events (base e8ec9ad). Propriétaire exclusif : nouveaux session-events.py et test-session-events.py. Le parent attend le contrat/test signé avant d’intégrer le consommateur QML ; aucun changement des commandes explicites ni des unités.

Contrat v1 : snapshots JSONL complets <=4096 octets, défaut verrouillé/inconnu, deux domaines système/utilisateur invalidés indépendamment. Un seul processus Python dbus/GLib/Gio lié au shell ; abonnements logind/systemd et surveillance des deux fichiers, sans sous-processus de polling. Heartbeat de cache2s, watchdog consommateur6s, requêtes async3s, reconnexion1/2/4/8s ; ces délais ne sont pas une garantie instantanée de sécurité. Replies tardives/générations incohérentes écartées. NoSuchUnit confirmé par le gestionnaire courant => inactif, pas preuve d’installation du service ; aucun LoadUnit/StartUnit/StopUnit.

Baseline isolée du concepteur : sur30s, 45 lancements Python,30 faux loginctl et15 faux systemctl. Fenêtre chaude25s :2,56 CPU-s pour shell+enfants réapés contre0,00 pour ShellRoot vide ; médiane PSS shell seul34 104Kio contre29 764. Ce sont des mesures synthétiques courtes avec commandes factices, pas un coût de production ni un gain après correction. Le comparatif final doit inclure l’arbre complet du nouvel observateur, ses requêtes D-Bus et les éventuelles régressions mémoire.

Les tests producteur utilisent deux bus privés et faux gestionnaires, avec assertions d’absence de requête mutante et de polling caché. Le helper d’actions/expiration reste inchangé.

  • with pi 🥧
Phase de conception acceptée par le parent ; implémentation **du producteur uniquement** autorisée dans `pi/quickshell-session-events` (base `e8ec9ad`). Propriétaire exclusif : nouveaux `session-events.py` et `test-session-events.py`. Le parent attend le contrat/test signé avant d’intégrer le consommateur QML ; aucun changement des commandes explicites ni des unités. Contrat v1 : snapshots JSONL complets <=4096 octets, défaut verrouillé/inconnu, deux domaines système/utilisateur invalidés indépendamment. Un seul processus Python dbus/GLib/Gio lié au shell ; abonnements logind/systemd et surveillance des deux fichiers, sans sous-processus de polling. Heartbeat de cache2s, watchdog consommateur6s, requêtes async3s, reconnexion1/2/4/8s ; ces délais ne sont pas une garantie instantanée de sécurité. Replies tardives/générations incohérentes écartées. NoSuchUnit confirmé par le gestionnaire courant => inactif, pas preuve d’installation du service ; aucun LoadUnit/StartUnit/StopUnit. Baseline isolée du concepteur : sur30s, 45 lancements Python,30 faux loginctl et15 faux systemctl. Fenêtre chaude25s :2,56 CPU-s pour shell+enfants réapés contre0,00 pour ShellRoot vide ; médiane PSS shell seul34 104Kio contre29 764. Ce sont des mesures synthétiques courtes avec commandes factices, **pas un coût de production ni un gain après correction**. Le comparatif final doit inclure l’arbre complet du nouvel observateur, ses requêtes D-Bus et les éventuelles régressions mémoire. Les tests producteur utilisent deux bus privés et faux gestionnaires, avec assertions d’absence de requête mutante et de polling caché. Le helper d’actions/expiration reste inchangé. - with pi 🥧
Author
Owner

Intégré sur main a1e4e1d, tous les fichiers distants vérifiés. Producteur signé619dfc91 (avec correctiff3507166 de filtrage des événements parasites), consommateur28350ba ; revues indépendantes propres après correction. Gate parent combiné 23/23 suites passent, dont27 tests producteur sur deux bus privés et11 tests QML (vrai producteur aussi),0 action/service personnel.

Un observateur partagé, zéro loginctl/systemctl périodique. Framing ASCII JSON borné avant publication, pas de buffer natif de ligne illimité ni de tail EOF accepté ; défaut verrouillé/inconnu, watchdog6s, PID positif avant signal, ni retry ni optimisme d’action. Contrôles d’expiration pidfd et confirmation de suspension restent inchangés dans le helper. Métadonnées/fichiers/bus invalidés indépendamment avec reprises testées.

Compromis mesuré et accepté pour cet objectif CPU/processus, pas une optimisation mémoire : trois paires isolées old/new de30s (fenêtre chaude25s), sources gelées, arbre complet et enfants réapés inclus : médiane2,54→0,01 CPU-s ;45→1 Python et30/15→0/0 loginctl/systemctl. Le backend fait6 appels initiaux puis6 au total malgré12 heartbeats : pas de polling D-Bus caché. La PSS médiane d’arbre augmente32 194→49 446Kio (+17 252Kio) ; pics échantillonnés se recouvrent, pas de gain pic démontré. Ce n’est pas une mesure du bureau réel ni une promesse de pourcentage CPU/énergie en production.

Latences sur faux services, hors fenêtres CPU : événement LockedHint vers état connu6,7ms (n5), invalidation2,2ms, remplacement de politique53ms ; reprise de propriétaire1,34s inclut backoff. Le watchdog6s est testé fonctionnellement, pas une garantie temps réel/écran physique.

Dépendances existantes vérifiées : python-dbus1.5.0 et python-gobject3.58.1. Source/commande/résultats reproductibles conservés hors dépôt (wave4/session-performance.md et script associé) ; données synthétiques exclusivement. Le checkout actif n’est pas avancé/rechargé : publication et activation restent distinctes.

  • with pi 🥧
Intégré sur main [a1e4e1d](https://git.2027a.net/mathieu/dotfiles/commit/a1e4e1d9f52e7e07fbc96112884cd71ea9478363), tous les fichiers distants vérifiés. Producteur signé619dfc91 (avec correctiff3507166 de filtrage des événements parasites), consommateur28350ba ; revues indépendantes propres après correction. Gate parent combiné **23/23 suites passent**, dont27 tests producteur sur deux bus privés et11 tests QML (vrai producteur aussi),0 action/service personnel. Un observateur partagé, zéro loginctl/systemctl périodique. Framing ASCII JSON borné avant publication, pas de buffer natif de ligne illimité ni de tail EOF accepté ; défaut verrouillé/inconnu, watchdog6s, PID positif avant signal, ni retry ni optimisme d’action. Contrôles d’expiration pidfd et confirmation de suspension restent inchangés dans le helper. Métadonnées/fichiers/bus invalidés indépendamment avec reprises testées. **Compromis mesuré et accepté pour cet objectif CPU/processus, pas une optimisation mémoire :** trois paires isolées old/new de30s (fenêtre chaude25s), sources gelées, arbre complet et enfants réapés inclus : médiane2,54→0,01 CPU-s ;45→1 Python et30/15→0/0 loginctl/systemctl. Le backend fait6 appels initiaux puis6 au total malgré12 heartbeats : pas de polling D-Bus caché. La PSS médiane d’arbre **augmente32 194→49 446Kio (+17 252Kio)** ; pics échantillonnés se recouvrent, pas de gain pic démontré. Ce n’est pas une mesure du bureau réel ni une promesse de pourcentage CPU/énergie en production. Latences sur faux services, hors fenêtres CPU : événement LockedHint vers état connu~6,7ms (n5), invalidation~2,2ms, remplacement de politique~53ms ; reprise de propriétaire~1,34s inclut backoff. Le watchdog6s est testé fonctionnellement, pas une garantie temps réel/écran physique. Dépendances existantes vérifiées : python-dbus1.5.0 et python-gobject3.58.1. Source/commande/résultats reproductibles conservés hors dépôt (`wave4/session-performance.md` et script associé) ; données synthétiques exclusivement. Le checkout actif n’est pas avancé/rechargé : publication et activation restent distinctes. - with pi 🥧
mathieu 2026-10-24 17:11:37 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
mathieu/dotfiles#21
No description provided.