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
58 lines
3.7 KiB
Bash
Executable File
58 lines
3.7 KiB
Bash
Executable File
#!/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
|