Files
takana/scripts/diagnostico/banco-pgo-final.sh
T
SergioandClaude Opus 5 b221f06c01 arneses: los CINCO sandboxes de Gecko apagados, no un subconjunto a ojo
Cada arnés headless tenía su propio subconjunto de MOZ_DISABLE_*_SANDBOX, elegido en su
momento sin medir: banco 1 de 5, perfilar 4, codecs 3, ruteo 3, nativo 2, inicio 2. Con
cualquier subconjunto incompleto el sandbox de Firefox sigue intentando montar su
user-namespace dentro del de bwrap, falla con 'uid_map: EPERM' y deja un ayudante
'Sandbox Forked' muerto de SIGSEGV por cada intento — en el 100% de las corridas, después
de escribir el PNG y por eso invisible.

Medido: 2 cadáveres por corrida con sólo CONTENT apagado, 0 con los cinco. Verificado sobre
el arnés ya editado: segv=0 EPERM=0 screenshot=sí.

Acá no se pierde seguridad: bwrap ya es la jaula, el sandbox de Gecko es redundante y lo
único que hace dentro es fallar.

⚠ Cambia las condiciones de medición del banco de PGO: las cifras de docs/26 se tomaron con
el arnés viejo. Los cocientes del PGO comparan dos firefox bajo el mismo arnés y deberían
aguantar; la línea base absoluta de arranque no tiene por qué. Anotado en la cabecera.

No se tocan scripts/wlr/dunst-headless.sh (otro agente trabajando en él) ni los cazadores,
que conservan el entorno viejo a propósito para poder reproducir la condición original.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 16:11:28 +00:00

58 lines
3.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Banco DEFINITIVO: las cuatro cargas y las dos variantes en UNA SOLA sesión intercalada, para que
# la resta «total arranque» sea válida. Las restas entre corridas de días distintos no lo son:
# el arranque medido hoy no es necesariamente el de ayer.
# vacia → ARRANQUE PURO. Sin este control todos los porcentajes están diluidos por
# una constante que resultó ser ~16 s, o sea la mayor parte de la medición.
# fuera-del-corpus → DOM/layout: parentesco con lo que entrena el corpus
# del-corpus → SunSpider 3d-raytrace: JIT-bound
# ajena → imágenes, canvas, JSON, DOM por API: SIN parentesco
#
# ⚠ 2026-09-08: este arnés apaga LOS CINCO sandboxes de Gecko, no sólo el de contenido. Antes dejaba
# 2 ayudantes 'Sandbox Forked' muertos de SIGSEGV en CADA corrida —el sandbox de Firefox no puede
# montar su user-namespace dentro del de bwrap y muere en la salida de error—. Acá no se pierde
# nada de seguridad: bwrap YA es la jaula. Ver scripts/diagnostico/cazar-cuelgue-headless.sh.
#
# Y CAMBIA LAS CONDICIONES DE MEDICIÓN: las cifras publicadas en docs/26 se tomaron con el arnés
# viejo, o sea con esos 2 procesos reventando por corrida. Los porcentajes del PGO comparan dos
# firefox bajo el MISMO arnés, así que el cociente debería aguantar; el nivel absoluto de la línea
# base de arranque (~16 s) no tiene por qué. Si se vuelve a publicar un número, re-medir la línea
# base con este arnés y no reutilizar la vieja.
#
set -u
RAIZ=/mnt/vvv/hammer; R=$RAIZ/store/.rootfs/sway-v2
AQUI=$(cd "$(dirname "$0")" && pwd) # las 4 páginas viven junto a este script
SAL=$(mktemp -d)
A=$(ls -d $RAIZ/store/8116bdec*-firefox|head -1); B=$(ls -d $RAIZ/store/3d199174*-firefox|head -1)
N=${N:-7}
corre(){ local ini fin
ini=$(date +%s%N)
timeout 300 bwrap --ro-bind "$R" / --ro-bind /usr/lib/musl/lib/libc.so /lib/ld-musl-x86_64.so.1 \
--ro-bind "$1/usr/lib/firefox" /usr/lib/firefox --dev /dev --proc /proc --tmpfs /run --tmpfs /tmp \
--unshare-pid --ro-bind "$AQUI" /bench --bind "$SAL" /salida --unshare-user --uid 0 --gid 0 \
--setenv PATH /usr/bin:/bin \
/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
LD_LIBRARY_PATH=/usr/lib/firefox /usr/lib/firefox/firefox --headless --screenshot /salida/b.png file:///bench/'"$2" \
>/dev/null 2>&1
fin=$(date +%s%N); echo $(( (fin-ini)/1000000 )); }
med(){ 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)}'; }
declare -A MA MB
for p in vacia.html fuera-del-corpus.html del-corpus.html ajena.html; do
corre "$A" "$p" >/dev/null; corre "$B" "$p" >/dev/null
sa=(); sb=()
for i in $(seq 1 $N); do sa+=( "$(corre "$A" "$p")" ); sb+=( "$(corre "$B" "$p")" ); done
MA[$p]=$(med "${sa[@]}"); MB[$p]=$(med "${sb[@]}")
echo "== $p"; echo " sin: ${sa[*]}"; echo " pgo: ${sb[*]}"
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}'))"
done
echo ""
echo "== TRABAJO REAL (total arranque), que es lo comparable entre cargas"
ba=${MA[vacia.html]}; bb=${MB[vacia.html]}
printf " %-22s %-22s %s\n" "carga" "trabajo sin / con pgo" "mejora del trabajo"
for p in fuera-del-corpus.html del-corpus.html ajena.html; do
awk -v p="$p" -v a=${MA[$p]} -v b=${MB[$p]} -v ba=$ba -v bb=$bb 'BEGIN{
ta=a-ba; tb=b-bb;
if (ta<=50) printf " %-22s %-22s %s\n", p, ta" / "tb" ms", "(trabajo ~0: bajo el ruido)";
else printf " %-22s %-22s %+.1f%%\n", p, ta" / "tb" ms", (tb-ta)*100.0/ta }'
done