tawasuyu

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…

TOML 1411Shell 141Markdown 85Rust 842918 Definitions

⎇ 4190c7b43e5bd323a9b166340cfa16cd324ca2e4 scripts/diagnostico/presion-memoria.py Python · 56 lines · 2.6 KB History Who touched what raw

cuelgue headless RESUELTO: el sandbox de Firefox no puede montar su userns dentro de bwrap b405fc77d · Sergio ·

1#!/usr/bin/env python3
2"""presion-memoria.py — generador de presión de memoria ACOTADO y con seguro.
3
4No apunta a un tamaño de hog sino a un SETPOINT de MemAvailable: crece hasta dejar la máquina con
5los MiB pedidos disponibles y ahí se queda, corrigiendo si el resto del sistema se mueve. La
6variable controlada es la que importa (memoria disponible), no la que es fácil de fijar.
7
8TRES SEGUROS, porque esta máquina es compartida con la granja y con otros agentes:
9  1. oom_score_adj = 1000  ⇒ si el kernel tiene que matar a alguien, el PRIMERO soy yo, nunca un
10     build de 4 h ni el trabajo de otro agente. Subirlo no necesita privilegios; bajarlo sí.
11  2. suelo duro: no crece por debajo de PISO_MIB de disponible, pase lo que pase.
12  3. reloj: se muere solo a los SEGUNDOS, aunque quien lo lanzó desaparezca.
13
14⚠ El relleno es ALEATORIO A PROPÓSITO. El swap de esta máquina es zram (comprimido EN RAM): un hog
15de ceros se comprime a nada y no genera ni un byte de presión real — mediría cero creyendo medir
16mucho. Un bloque aleatorio de 4 KiB repetido es incompresible página a página.
17"""
18import os, sys, time, signal
19
20SETPOINT = int(sys.argv[1]) if len(sys.argv) > 1 else 800    # MiB disponibles objetivo
21SEGUNDOS = int(sys.argv[2]) if len(sys.argv) > 2 else 600
22PISO_MIB = 350
23TROZO    = 64 * 1024 * 1024
24
25def disponible_mib():
26    with open('/proc/meminfo') as f:
27        for l in f:
28            if l.startswith('MemAvailable:'):
29                return int(l.split()[1]) // 1024
30    return 0
31
32try:
33    with open('/proc/self/oom_score_adj', 'w') as f:
34        f.write('1000')                      # seguro 1: víctima designada
35except OSError as e:
36    print(f"presion: NO pude marcarme como víctima del OOM ({e}) — abortando por seguridad")
37    sys.exit(1)
38
39signal.alarm(SEGUNDOS)                        # seguro 3: reloj de pared
40bloque = os.urandom(4096) * (TROZO // 4096)   # incompresible para zram
41lastre = []
42print(f"presion: objetivo {SETPOINT} MiB disponibles, piso {PISO_MIB}, {SEGUNDOS}s, "
43      f"disponible ahora {disponible_mib()}", flush=True)
44try:
45    while True:
46        d = disponible_mib()
47        if d > SETPOINT and d > PISO_MIB:     # seguro 2: suelo duro
48            lastre.append(bytearray(bloque))  # bytearray: memoria propia, tocada de verdad
49        elif d < SETPOINT - 128 and lastre:
50            lastre.pop()                      # el sistema pidió; le devuelvo
51        else:
52            time.sleep(0.25)
53        if len(lastre) % 8 == 0:
54            print(f"presion: lastre={len(lastre)*64} MiB disponible={d}", flush=True)
55except (MemoryError, KeyboardInterrupt):
56    pass