Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions .github/workflows/assert-memory-budget.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
name: Assert memory budget (composition vs RAM VM, #19805)

# Issue #19805 : `fix(runners): budget memoire po-2024 incoherent avec la VM --
# 42 Go declares pour 24 032 Mo disponibles`. La composition cumulee des
# conteneurs runners (effectifs x caps) etait superieure a la RAM de la VM
# WSL, et l'instrumentation existante ne le detectait pas. `measure_po2024_topology`
# mesure la topologie mais ne confronte pas la composition au budget declare,
# et le garde precedent ne connaissait que le budget (pas la RAM VM).
#
# Cet organe `scripts/ci/assert_memory_budget.py` comble le trou. Il derive la
# composition des unites DEPLOYEES (`scripts/ci/docker/linux-runner/persist/` :
# `ExecStart` de chaque jambe, le drop-in de la machine-cible en surcharge),
# prend la RAM VM de la machine-cible comme constante DECLAREE -- jamais mesuree
# sur l'hote qui execute l'organe -- et compare a la borne la plus contraignante
# entre MemoryMax de la slice et la RAM VM (hote reserve). Rouge si la
# composition depasse.
#
# Le verdict sert deux causes :
# 1. Detecter la derive de la composition quand un dimensionnement change sans
# que le reste suive (mesure fondateur de l'issue #19805 : l'agrandissement
# VM du 2026-09-21 a ete revertu sans que les declarations suivent).
# 2. Empecher l'extension silencieuse des caps par conteneur (chaque
# modification de supervise.sh qui touche --memory doit etre accompagnee
# d'un dimensionnement coherent, et celui-ci vit dans les unites).
#
# Workflow bloquant sur pull_request et push (les PRs touchant une unite, un
# drop-in de machine, la slice ou supervise.sh concernes reapparaissent dans le
# diff et le guard rougit). Schedule quotidien en arriere-plan pour detecter les
# derives qui n'ont pas ete portees par une PR.

on:
pull_request:
paths:
- "docker-configurations/runners/**"
- "scripts/ci/assert_memory_budget.py"
- "scripts/ci/measure_po2024_topology.py"
# Les unites et drop-ins dont la composition est DERIVEE : le guard doit
# se relancer quand l'un d'eux change, sinon il rend un verdict sur un
# dimensionnement qui n'est plus celui du depot.
- "scripts/ci/docker/linux-runner/persist/**"
- "scripts/ci/docker/linux-runner/supervise.sh"
push:
branches: [main]
paths:
- "docker-configurations/runners/**"
- "scripts/ci/assert_memory_budget.py"
- "scripts/ci/measure_po2024_topology.py"
- "scripts/ci/docker/linux-runner/persist/**"
- "scripts/ci/docker/linux-runner/supervise.sh"
schedule:
# Verifie la derive de l'instrument meme quand aucune PR ne touche
# le snapshot (un revert de .wslconfig sur po-2024 lui-meme est
# invisible depuis le repo : la CI sert de rappel hebdomadaire).
- cron: "37 6 * * 1"
workflow_dispatch:

permissions:
contents: read

jobs:
assert:
name: Composition vs RAM VM
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.13"

- name: Run assert_memory_budget
id: assert
run: |
set -uo pipefail
python scripts/ci/assert_memory_budget.py --json > /tmp/assert.json
rc=$?
echo "exit_code=$rc" >> "$GITHUB_OUTPUT"
cat /tmp/assert.json
if [ $rc -ne 0 ]; then
echo "::error title=Incoherence budget memoire (issue #19805)::La composition cumulee des conteneurs runners depasse la borne la plus contraignante (MemoryMax slice ou RAM VM - hote reserve). Voir /tmp/assert.json et l'issue #19805."
exit 1
fi
env:
PYTHONIOENCODING: utf-8

# Le runner ubuntu-latest n'expose pas pytest dans le Python 3.13 de
# setup-python : sans cette etape le smoke test echoue sur
# `No module named pytest` (rouge fondeur du 2026-10-09), pas sur le code.
- name: Install pytest
run: python -m pip install --quiet --disable-pip-version-check pytest

- name: Run pytest (smoke)
run: |
python -m pytest scripts/tests/test_assert_memory_budget.py -v
env:
PYTHONIOENCODING: utf-8
30 changes: 30 additions & 0 deletions docker-configurations/runners/po2024_budget.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"machine": "po-2024",
"snapshot_date": "2026-10-08",
"vm_total_gib_observed": 23.47,
"composition": {
"docker": {
"instances": 6,
"cap_gib": 1.5,
"total_gib": 9.0,
"source": "supervise.sh cmd_run --memory 1536m (defaut)"
},
"waiters": {
"instances": 12,
"cap_gib": 0.5,
"total_gib": 6.0,
"source": "supervise.sh cmd_waiters --memory 512m"
},
"lean": {
"instances": 2,
"cap_gib": 6.0,
"total_gib": 12.0,
"source": "supervise.sh cmd_lean --memory 6g + memory-swap=memory"
}
},
"composition_total_gib": 27.0,
"vm_total_gib": 23.47,
"verdict_at_snapshot": "INCOHERENT : 27.0 GiB > 23.47 GiB VM",
"issue": 19805,
"notes": "Snapshot initial issu de la mesure firsthand de l'issue #19805 (2026-10-08). Le budget memoire cumule des conteneurs runners depasse la RAM de la VM WSL (24 032 Mo = 23.47 GiB). La slice coursia-ci.slice plafonne a 16 GiB (MemoryMax) et 12 GiB (MemoryHigh), donc le garde kernel cgroup v2 tient le mur ; ce snapshot sert a l'organe assert_memory_budget pour detecter la derive avant qu'elle ne se reproduise (cf. cause racine issue #19805 : agrandissement VM 2026-09-24 revertu, declarations non revisees)."
}
Loading
Loading