etapa 3: el ahorro real es ~60%, no 79% — la cifra publicada medía otra cosa

El «79%» que este plan y los SDD 19/20 venían citando era **el 79% del CONTENIDO BINARIO**,
medido sobre una muestra de .so/.a. Es cierto y es la cifra equivocada para planificar, porque un
artefacto no es sólo binarios: trae cabeceras, datos, iconos, locales, .pc y documentación, que
no encogen.

MEDIDO con `scripts/medir-debug.sh` (suma los tamaños reales de las secciones .debug_* vía
readelf -S y los compara con el tamaño del árbol, sin reconstruir nada):
    40 artefactos  ·   876 MB · 27%
   100 artefactos  ·  2955 MB · 38%   (truncada a 60 ficheros/artefacto)
   250 artefactos  ·  8874 MB · 60%   ← la que manda: sin truncar, ~7% del store

La varianza es alta porque unos pocos artefactos grandes dominan el total, así que el número
necesitaba validación independiente — y la tiene: el piloto de la etapa 2, donde se reconstruyó y
se pesó de verdad, dio bison −50% y appstream −68%. Los dos ENCIERRAN el 60% de la muestra
grande. El modelo predice lo que el rebuild produjo.

CIFRAS CORREGIDAS, con el store en 127 G:
                      se venía diciendo    medido
   reserva de disco         ~96 G          ~76 G
   store tras el split      ~30 G          ~51 G
   espejo público           ~30 G          ~51 G
Sigue siendo el mayor ahorro disponible en el proyecto —76 G no es poco— pero no es lo
prometido, y la diferencia importa para dimensionar el alojamiento del espejo, que es una
decisión con factura.

LA LECCIÓN: una cifra medida sobre una cosa (contenido binario) se citó durante semanas como si
midiera otra (tamaño de artefacto), y llegó a tres documentos. El número no era falso; LA UNIDAD
sí. Cuando un número vaya a decidir un gasto, hay que volver a la medición original y comprobar
QUÉ estaba midiendo.

Corregido en los tres sitios donde se había propagado.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-08 00:42:08 -04:00
co-authored by Claude Opus 5
parent fbd586f9b2
commit 1eb469337d
4 changed files with 92 additions and 5 deletions
+43
View File
@@ -0,0 +1,43 @@
#!/usr/bin/env bash
# medir-debug.sh — cuánto pesa REALMENTE la info de depuración en el store. Etapa 3 del SDD 23.
#
# ── POR QUÉ NO BASTA EL «79%» QUE SE VENÍA CITANDO ─────────────────────────────────────────────
# Ese número era «el 79% del CONTENIDO BINARIO son secciones .debug_*», medido sobre una muestra de
# `.so`/`.a`. Es cierto y es engañoso para planificar, porque un artefacto NO es sólo binarios: trae
# cabeceras, datos, iconos, locales, `.pc`, documentación. El ahorro que importa es sobre el TAMAÑO
# DEL ARTEFACTO, y ése es necesariamente menor.
#
# El piloto lo confirmó: bison bajó 6M→3M (50%) y appstream 56M→18M (68%), los dos lejos del 79%.
# Extrapolar con la cifra bonita habría prometido ~96 G de ahorro y entregado bastante menos.
#
# ── EL MÉTODO ──────────────────────────────────────────────────────────────────────────────────
# Para cada artefacto: sumar el tamaño de las secciones `.debug_*` de cada ELF (`readelf -S`, que da
# los tamaños reales) y compararlo con el tamaño total del árbol. No reconstruye nada, así que se
# puede correr sobre cientos de artefactos en minutos en vez de días.
#
# Uso: scripts/medir-debug.sh [N] (N = cuántos artefactos muestrear, def 120)
set -uo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
STORE="${STORE:-./store}"; N="${1:-120}"
tot_kb=0; dbg_kb=0; n=0
printf "%-30s %10s %10s %6s\n" "artefacto" "total" "debug" "%"
for d in $(ls -d "$STORE"/*/ 2>/dev/null | shuf -n "$N" --random-source=/dev/urandom); do
[ -d "$d" ] || continue
t=$(du -sk "$d" 2>/dev/null | cut -f1); [ -n "$t" ] || continue
# Sumar .debug_* de todos los ELF del árbol. `readelf -S` imprime tamaños en hex.
b=$(find "$d" -type f \( -perm -u+x -o -name '*.so*' -o -name '*.a' \) 2>/dev/null | while read -r f; do
readelf -S "$f" 2>/dev/null | awk '/\.debug_/{getline; print strtonum("0x" $1)}'
done | awk '{s+=$1} END{print int(s/1024)}')
b=${b:-0}
[ "$t" -eq 0 ] && continue
n=$((n+1)); tot_kb=$((tot_kb+t)); dbg_kb=$((dbg_kb+b))
pct=$(( b * 100 / t ))
[ "$pct" -ge 40 ] && printf "%-30s %9sK %9sK %5s%%\n" "$(basename "$d" | cut -c66-95)" "$t" "$b" "$pct"
done
echo "──────────────────────────────────────────────────────────────"
echo " artefactos medidos: $n"
echo " total: $((tot_kb/1024)) MB · debug: $((dbg_kb/1024)) MB"
[ "$tot_kb" -gt 0 ] && echo " ⇒ la info de depuración es el $(( dbg_kb * 100 / tot_kb ))% del TAMAÑO DE ARTEFACTO"
echo " (el «79%» que se citaba era sobre el contenido BINARIO, no sobre el artefacto — ver cabecera)"