2026 : équité batch 7×24 sur un Mac Apple Silicon — matrice ThrottleInterval launchd, nice et voies I/O pour le taux d’achèvement des longues tâches
« Lorsque plusieurs agents launchd partagent un même nœud Apple Silicon, l’équité se mesure au taux d’achèvement des lots longs, pas aux slogans : un chevauchement mal calé sur le SSD ou le planificateur suffit à faire dériver la fin de fenêtre, même si chaque job reste « vert » isolément. »
Public : équipes qui enchaînent exports ou synchronisations sur un seul hôte. Livrable : matrice symptôme → levier, paramètres, plist, cinq gestes, FAQ disque contre CPU — sans refaire les angles énergie ou conteneurs déjà traités ailleurs.
Voir planification 7×24, workflow_dispatch nocturne, FAQ disque. Achat sans compte obligatoire tant que la politique logicielle porte la charge.
Trois freins lorsque plusieurs lots partagent le même Mac
- Sorties qui se recouvrent. Des blocs
StartCalendarIntervalindépendants peuvent partir la même minute : deux phases lourdes monopolisent la bande passante NVMe et allongent le mur même si aucun exit code n’est rouge. - Nice sans espacement. Abaisser la priorité CPU ne sérialise pas les écrivains : deux processus « gentils » continuent de saturer le volume et gonflent la latence perçue pour le reste du système.
- Famine silencieuse. Sans ThrottleInterval ni décalage de minutes, un job court peut redémarrer aussitôt après un long traitement et voler la queue calme prévue pour compaction ou contrôle d’intégrité.
Matrice : quel levier en premier
Mesurez CPU, latence disque et files avant d’empiler les réglages ; tableau indicatif pour un Mac Mini mono-hôte.
| Symptôme | Levier principal | Levier secondaire | Objectif d’achèvement |
|---|---|---|---|
| Collisions à la même minute | ThrottleInterval + décalage des minutes dans StartCalendarInterval | Étiquettes séparées par « voie » | Garantir un creux minimal entre sorties réussies |
| CPU plein, disque calme | renice ou moins de workers parallèles dans le script | Cadence StartInterval plus longue | Préserver la réactivité tout en faisant avancer le batch |
| CPU bas, durée murale qui grimpe, écritures en pic | Réduire les écrivains concurrents et décaler les phases lourdes | LowPriorityIO sur les agents où le binaire le tolère | Stabiliser métadonnées et débit sur APFS la nuit |
Liste de paramètres (repères)
| Contrôle | Palier de départ | Surveillance |
|---|---|---|
ThrottleInterval |
30 à 300 s entre sorties réussies pour jobs bavards | Un autre label peut encore chevaucher : compléter par décalage |
nice dans le wrapper |
5 à 15 pour helpers CPU longs | Garder au moins une voie « normale » pour supervision |
Idée type ionice (Linux) |
Sur macOS : plafonner threads d’écriture et copies parallèles | Pas d’outil ionice stock : politique de concurrence explicite |
Décalage StartCalendarInterval |
7 à 15 minutes entre jobs lourds dans la même heure | Documenter fuseau et changements d’heure locale |
Forme plist exécutable (extrait)
LaunchAgents utilisateur ou global ; launchctl bootstrap puis launchctl print. Comparatif gardiens : launchd contre PM2.
<key>Label</key><string>com.exemple.voie_batch_b</string>
<key>ThrottleInterval</key><integer>120</integer>
<key>StartCalendarInterval</key>
<dict><key>Hour</key><integer>1</integer><key>Minute</key><integer>12</integer></dict>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>-c</string>
<string>exec nice -n 10 /usr/local/bin/votre-lot --threads=2</string>
</array>
<key>LowPriorityIO</key><true/>
<key>StandardOutPath</key><string>/var/log/votre-lot.log</string>
<key>StandardErrorPath</key><string>/var/log/votre-lot.err</string>
Fenêtres nocturnes et ThrottleInterval
La nuit utile commence quand l’interactif retombe : phases écrivaines d’abord, contrôles légers après un ThrottleInterval pour vider files et cache.
Rafales distantes : alignez launchd sur la cadence du guide workflow_dispatch nocturne pour éviter deux passages complets simultanés.
Cinq gestes opérables
- Inventorier chaque label périodique (
StartCalendarIntervalouStartInterval) et consigner les cinq dernières durées murales. - Classer chaque job CPU, disque ou mixte ; isoler les écrivains des lecteurs dans la documentation d’exploitation.
- Attribuer des créneaux minute non superposés dans l’heure ; n’ajouter ThrottleInterval qu’après constat de collisions résiduelles.
- Envelopper les binaires lourds avec
nice; réduire le parallélisme interne avant d’envisager un palier matériel plus large. - LowPriorityIO après test de débit ; plist précédentes pour rollback (aide).
FAQ : disque contre CPU
- Comment distinguer contention disque et saturation CPU
- Disque : CPU modéré, latence ou écritures en pic. CPU : cœurs pleins, files disque courtes. Mixte : moins d’écrivains + nice sur sections longues.
- ThrottleInterval remplace-t-il renice
- Non : il espace les sorties réussies d’un même label ; renice répartit encore la priorité entre processus simultanés.
- Puis-je compter sur ionice comme sous Linux
- Sans utilitaire ionice natif, reproduisez l’intention par décalage de calendriers, plafonds d’écrivains, LowPriorityIO prudent et paramètres de threads dans vos outils.
Repères : ThrottleInterval 30–300 s si collisions ; nice 5–15 CPU long ; décalage 7–15 min ; « ionice » ⇒ politique d’écriture sur macOS.
Synthèse. launchd (espacement + calendrier) et nice stabilisent le taux d’achèvement sur un 7×24 ; politique d’abord, puis achat / tarifs si les créneaux manquent encore.
Choisir un nœud Mac pour lots launchd équilibrés
RunMini, Apple Silicon pour voies batch espacées et débit nocturne maîtrisé. Accueil, tarifs, aide, achat sans compte obligatoire, blog.