Los 23 weights de spec 16, certificados por Laurha en el santuario de la rp1 (origin-banco):
- Núcleo 3 aislado, governor performance a 2,4 GHz, CI parada, 45-49 °C.
- frame-omni-bencher 0.15.0 sobre el wasm 40cb5a1d de 3cd1068.
- 5 procesos por pallet; se cobra el MÁXIMO con scripts/bench/max-de-n.py, porque procesos
idénticos se separan hasta un 35 %.
- Evidencia: ~/laurha-work/banco/spec16-20261024-1631 en la rp1 (SHA256SUMS d930c5e1).
- Su perfil va en la cabecera de cada weights.rs.
Antes de cobrarlos:
- Mismos accesos a storage: el esqueleto de los 5 ficheros y sus reads/writes son idénticos a
los de main.
- Lo que Laurha pidió mirar (cast_vote, finalize_proposal y veto_proposal, mucho más altos que
en RV12) es esperable. Contra los interinos del Mac todos caen en la banda Pi/Mac de 2,5-3,9×:
es trabajo nuevo de RV15/RV16 en una CPU unas 3 veces más lenta.
- Destacan los tres que verifican Ed25519 en WASM (attest_asset, register_agent_did,
rotate_agent_key), con unas 6 veces: la criptografía pura sufre más en la Cortex-A76.
- Lo cobrado sube menos que la ejecución, entre +4 % (set_tier_profile) y +56 %
(rotate_agent_key), porque las lecturas y escrituras de storage no cambian.
- spec_version 16 → 17, porque cambian las fees. transaction_version no cambia: ninguna llamada
cambia su codificación.
Ensayado en la rp1 (aarch64) sobre un nodo efímero aparte, antes de la testnet de la casa, con
scripts/e2e/upgrade_en_vivo.py (nuevo):
- sudo(set_code) → CodeUpdated + Sudid Ok;
- spec 17 y LastRuntimeUpgrade sube;
- una firma con la spec vieja → «bad signature»; con la nueva, ExtrinsicSuccess;
- la finalidad pasa del bloque del upgrade.
Es la primera vez que el ejecutor ARM compila y corre un runtime nuevo.
Revisión adversarial (nivel 1 de la directiva), antes de tocar la red, con orden de tumbarlo:
no pudo. Los seis puntos aguantan:
- ningún storage ni codificación cambia, y transaction_version no debe subir;
- el más pesado (veto_proposal) cobra 1,9 ms, 344 veces por debajo del máximo por extrinsic;
- los weights.rs tienen la misma estructura y el impl () coincide;
- ninguna fee, subsidio ni test depende del valor de forma que se rompa.
scripts/rp1 (operación del nodo, medido en 23 h con los valores por defecto):
- 430 MB de WAL de RocksDB retenidos para 15 MB de datos, y el RSS subiendo de 200 a 340 MB:
--db-cache 128. Al reiniciar, 449 → 21 MB.
- El log, de 7 líneas por bloque a ~2 (txpool, sc_basic_authorship y aura en warn; ojo: las
líneas de autoría usan el target del módulo, no «basic-authorship»), de 16 MB/día a unos 3.
- Modo append, y medir.sh lo rota al pasar de 32 MB.
Co-Authored-By: Laurha <laurha@origin>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
37 lines
2.0 KiB
Bash
Executable File
37 lines
2.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Una fila de medida del nodo de la rp1 cada vez que se llama (cron cada 5 min).
|
|
# CSV: fecha, best, finalizado, pares, rss_mb, cpu_pct, datos_mb, load1, temp_c, ci_activo
|
|
set -uo pipefail
|
|
BASE="$HOME/origin-chain"
|
|
CSV="$BASE/logs/medidas.csv"
|
|
[ -f "$CSV" ] || echo "fecha,best,finalizado,pares,rss_mb,cpu_pct,datos_mb,load1,temp_c,ci_activo" >"$CSV"
|
|
|
|
rpc() {
|
|
curl -s -m 5 -H 'Content-Type: application/json' \
|
|
-d "{\"id\":1,\"jsonrpc\":\"2.0\",\"method\":\"$1\",\"params\":[${2:-}]}" http://127.0.0.1:9944
|
|
}
|
|
num() { python3 -c "import json,sys; r=json.load(sys.stdin)['result']; print(int(r['number'],16) if isinstance(r,dict) else r)" 2>/dev/null || echo NA; }
|
|
|
|
best=$(rpc chain_getHeader | num)
|
|
fh=$(rpc chain_getFinalizedHead | python3 -c "import json,sys;print(json.load(sys.stdin)['result'])" 2>/dev/null || echo "")
|
|
fin=NA; [ -n "$fh" ] && fin=$(rpc chain_getHeader "\"$fh\"" | num)
|
|
pares=$(rpc system_health | python3 -c "import json,sys;print(json.load(sys.stdin)['result']['peers'])" 2>/dev/null || echo NA)
|
|
pid=$(cat "$BASE/nodo.pid" 2>/dev/null || echo 0)
|
|
rss=NA; cpu=NA
|
|
if kill -0 "$pid" 2>/dev/null; then
|
|
read -r rss cpu < <(ps -o rss=,pcpu= -p "$pid" | awk '{printf "%.0f %s\n", $1/1024, $2}')
|
|
fi
|
|
datos=$(du -sm "$BASE/data" 2>/dev/null | cut -f1)
|
|
load1=$(cut -d' ' -f1 /proc/loadavg)
|
|
temp=$(awk '{printf "%.1f", $1/1000}' /sys/class/thermal/thermal_zone0/temp)
|
|
ci=$(systemctl is-active gitea-runner 2>/dev/null || echo NA)
|
|
echo "$(date -Is),$best,$fin,$pares,$rss,$cpu,$datos,$load1,$temp,$ci" >>"$CSV"
|
|
|
|
# Rotación del log del nodo: al pasar de 32 MB se guarda comprimido y se trunca. El nodo
|
|
# escribe en modo append, así que sigue al final del fichero truncado, sin huecos.
|
|
ACTUAL=$(readlink -f "$BASE/logs/actual.log" 2>/dev/null || true)
|
|
if [ -n "$ACTUAL" ] && [ -f "$ACTUAL" ] && [ "$(stat -c %s "$ACTUAL")" -gt $((32 * 1024 * 1024)) ]; then
|
|
gzip -c "$ACTUAL" >"$ACTUAL.$(date +%Y%m%d-%H%M).gz" && : >"$ACTUAL"
|
|
ls -1t "$ACTUAL".*.gz 2>/dev/null | tail -n +5 | xargs -r rm -f # se quedan los 4 más nuevos
|
|
fi
|