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

Lecture : 8 min

« 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

  1. Sorties qui se recouvrent. Des blocs StartCalendarInterval indé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.
  2. 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.
  3. 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

  1. Inventorier chaque label périodique (StartCalendarInterval ou StartInterval) et consigner les cinq dernières durées murales.
  2. Classer chaque job CPU, disque ou mixte ; isoler les écrivains des lecteurs dans la documentation d’exploitation.
  3. Attribuer des créneaux minute non superposés dans l’heure ; n’ajouter ThrottleInterval qu’après constat de collisions résiduelles.
  4. Envelopper les binaires lourds avec nice ; réduire le parallélisme interne avant d’envisager un palier matériel plus large.
  5. 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.

Conservez ce guide près du runbook : achat, aide, blog.

Configurer équité batch sur Mac Mini