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…
⎇ 4190c7b43e5bd323a9b166340cfa16cd324ca2e4
scripts/diagnostico/presion-memoria.py
History
Who touched what
raw
cuelgue headless RESUELTO: el sandbox de Firefox no puede montar su userns dentro de bwrap
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