sergio/takana
> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
arneses: los CINCO sandboxes de Gecko apagados, no un subconjunto a ojo
1#!/bin/bash
2# Banco DEFINITIVO: las cuatro cargas y las dos variantes en UNA SOLA sesión intercalada, para que
3# la resta «total − arranque» sea válida. Las restas entre corridas de días distintos no lo son:
4# el arranque medido hoy no es necesariamente el de ayer.
5# vacia → ARRANQUE PURO. Sin este control todos los porcentajes están diluidos por
6# una constante que resultó ser ~16 s, o sea la mayor parte de la medición.
7# fuera-del-corpus → DOM/layout: parentesco con lo que entrena el corpus
8# del-corpus → SunSpider 3d-raytrace: JIT-bound
9# ajena → imágenes, canvas, JSON, DOM por API: SIN parentesco
10#
11# ⚠ 2026-09-08: este arnés apaga LOS CINCO sandboxes de Gecko, no sólo el de contenido. Antes dejaba
12# 2 ayudantes 'Sandbox Forked' muertos de SIGSEGV en CADA corrida —el sandbox de Firefox no puede
13# montar su user-namespace dentro del de bwrap y muere en la salida de error—. Acá no se pierde
14# nada de seguridad: bwrap YA es la jaula. Ver scripts/diagnostico/cazar-cuelgue-headless.sh.
15#
16# Y CAMBIA LAS CONDICIONES DE MEDICIÓN: las cifras publicadas en docs/26 se tomaron con el arnés
17# viejo, o sea con esos 2 procesos reventando por corrida. Los porcentajes del PGO comparan dos
18# firefox bajo el MISMO arnés, así que el cociente debería aguantar; el nivel absoluto de la línea
19# base de arranque (~16 s) no tiene por qué. Si se vuelve a publicar un número, re-medir la línea
20# base con este arnés y no reutilizar la vieja.
21#
22set -u
23RAIZ=/mnt/vvv/hammer; R=$RAIZ/store/.rootfs/sway-v2
24AQUI=$(cd "$(dirname "$0")" && pwd) # las 4 páginas viven junto a este script
25SAL=$(mktemp -d)
26A=$(ls -d $RAIZ/store/8116bdec*-firefox|head -1); B=$(ls -d $RAIZ/store/3d199174*-firefox|head -1)
27N=${N:-7}
28corre(){ local ini fin
29 ini=$(date +%s%N)
30 timeout 300 bwrap --ro-bind "$R" / --ro-bind /usr/lib/musl/lib/libc.so /lib/ld-musl-x86_64.so.1 \
31 --ro-bind "$1/usr/lib/firefox" /usr/lib/firefox --dev /dev --proc /proc --tmpfs /run --tmpfs /tmp \
32 --unshare-pid --ro-bind "$AQUI" /bench --bind "$SAL" /salida --unshare-user --uid 0 --gid 0 \
33 --setenv PATH /usr/bin:/bin \
34 /bin/sh -c 'export HOME=/tmp/h MOZ_HEADLESS=1 LIBGL_ALWAYS_SOFTWARE=1 MOZ_DISABLE_CONTENT_SANDBOX=1 MOZ_DISABLE_GMP_SANDBOX=1 MOZ_DISABLE_RDD_SANDBOX=1 MOZ_DISABLE_SOCKET_PROCESS_SANDBOX=1 MOZ_DISABLE_UTILITY_SANDBOX=1 LANG=C.UTF-8; mkdir -p $HOME
35 LD_LIBRARY_PATH=/usr/lib/firefox /usr/lib/firefox/firefox --headless --screenshot /salida/b.png file:///bench/'"$2" \
36 >/dev/null 2>&1
37 fin=$(date +%s%N); echo $(( (fin-ini)/1000000 )); }
38med(){ printf '%s\n' "$@"|sort -n|awk '{v[NR]=$1}END{print (NR%2)?v[(NR+1)/2]:int((v[NR/2]+v[NR/2+1])/2)}'; }
39declare -A MA MB
40for p in vacia.html fuera-del-corpus.html del-corpus.html ajena.html; do
41 corre "$A" "$p" >/dev/null; corre "$B" "$p" >/dev/null
42 sa=(); sb=()
43 for i in $(seq 1 $N); do sa+=( "$(corre "$A" "$p")" ); sb+=( "$(corre "$B" "$p")" ); done
44 MA[$p]=$(med "${sa[@]}"); MB[$p]=$(med "${sb[@]}")
45 echo "== $p"; echo " sin: ${sa[*]}"; echo " pgo: ${sb[*]}"
46 echo " medianas sin=${MA[$p]} pgo=${MB[$p]} ($(awk -v a=${MA[$p]} -v b=${MB[$p]} 'BEGIN{printf "%+.1f%%",(b-a)*100.0/a}'))"
47done
48echo ""
49echo "== TRABAJO REAL (total − arranque), que es lo comparable entre cargas"
50ba=${MA[vacia.html]}; bb=${MB[vacia.html]}
51printf " %-22s %-22s %s\n" "carga" "trabajo sin / con pgo" "mejora del trabajo"
52for p in fuera-del-corpus.html del-corpus.html ajena.html; do
53 awk -v p="$p" -v a=${MA[$p]} -v b=${MB[$p]} -v ba=$ba -v bb=$bb 'BEGIN{
54 ta=a-ba; tb=b-bb;
55 if (ta<=50) printf " %-22s %-22s %s\n", p, ta" / "tb" ms", "(trabajo ~0: bajo el ruido)";
56 else printf " %-22s %-22s %+.1f%%\n", p, ta" / "tb" ms", (tb-ta)*100.0/ta }'
57done