gioser

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 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

⎇ main docs/evidencia/tasas-kernel-2026-08-29/bpf-iter.txt 80 siq'ikuna · 4.5 KB Ñawpa willay ch'uya

SDD 25 §9.5: el iterador BPF, medido — y H7 pasa a tener precio 09168bf1e · Sergio ·

1SDD 25 §9.5.1 — Iterador BPF contra el barrido de /proc
2Medido 2026-08-31 en 'momento'. TERCERA corrida: condiciones propias, NO se cruza
3con los números de §2 ni con los de §9.
4
5== condiciones ==
6kernel de desarrollo : 7.1.4-artix1-1   (Artix; NO es un kernel de hammer)
7cpu                  : 4 vCPU   load: 3.85 5.27 4.91
8memoria libre        : 4483 MiB disponibles
9BTF del kernel       : /sys/kernel/btf/vmlinux, 6455713 bytes
10libbpf               : 1.7.0
11clang                : clang version 22.1.8
12ruido conocido       : un 'yes' huérfano (pid 1750, reparentado a arje-zero) llevaba
13                       3,5 dias quemando un core entero de los 4. Los ABSOLUTOS de
14                       abajo son cotas superiores; la señal está en los cocientes.
15
16== qué compara ==
17El MISMO trabajo por los dos caminos: {pid, ppid, estado, utime, stime, comm} de todos
18los procesos vivos — la foto que sandokan necesita de la máquina.
19  A) /proc : readdir(/proc) + open+read+parse de /proc/<pid>/stat, uno por proceso
20  B) BPF   : bpf_iter_create + read() de registros BINARIOS de tamaño fijo
21  C) piso  : readdir(/proc) a secas, sin abrir nada
22
23== las DOS barreras, comprobadas, no supuestas ==
241) El iterador se ata por ID DE TIPO BTF del vmlinux:
25     prog_type=26 (BPF_PROG_TYPE_TRACING=26)
26     attach_btf_id=80137  attach_btf_obj_id=1  (0 en obj_id = BTF del vmlinux)
27     => el iterador se ata por ID DE TIPO BTF: sin /sys/kernel/btf/vmlinux no hay a qué atarse.
28   => un kernel sin CONFIG_DEBUG_INFO_BTF no expone /sys/kernel/btf/vmlinux y no hay
29      a qué atarse. La ganancia de abajo NO se compra sin pagar BTF.
302) Hace falta privilegio (CAP_BPF+CAP_PERFMON, o root). Sin él:
31     $ ./bench_bpf_iter 3
32       load (¿root? ¿BTF?): Operation not permitted
33
34== 33 rondas, orden A->B ==
35procesos vistos: /proc 245 · BPF 245 · readdir 245   (33 rondas, orden A->B)
36carga+verificación+attach del programa BPF (una vez): 16.7 ms
37
38  A) /proc readdir+stat+parse        min    1356.1 us   mediana    1693.9 us     5.54 us/proceso (min)
39  B) iterador BPF (binario)          min     196.1 us   mediana     273.6 us     0.80 us/proceso (min)
40  C) piso: readdir(/proc) solo       min     112.1 us   mediana     143.8 us     0.46 us/proceso (min)
41
42cociente A/B (min, misma corrida): 6.91x
43equilibrio: la carga (16.7 ms) se amortiza en 15 barridos
44cotejo: 221 pid+comm idénticos, 0 sólo en /proc, 0 sólo en BPF
45
46== 33 rondas, orden B->A (control de sesgo de orden) ==
47procesos vistos: /proc 245 · BPF 245 · readdir 245   (33 rondas, orden B->A)
48carga+verificación+attach del programa BPF (una vez): 16.5 ms
49
50  A) /proc readdir+stat+parse        min    1676.6 us   mediana    2115.2 us     6.84 us/proceso (min)
51  B) iterador BPF (binario)          min     219.6 us   mediana     338.7 us     0.90 us/proceso (min)
52  C) piso: readdir(/proc) solo       min     141.1 us   mediana     218.1 us     0.58 us/proceso (min)
53
54cociente A/B (min, misma corrida): 7.64x
55equilibrio: la carga (16.5 ms) se amortiza en 12 barridos
56cotejo: 221 pid+comm idénticos, 0 sólo en /proc, 0 sólo en BPF
57
58== las tres corridas cortas previas, mismo día ==
59   9 rondas A->B : A 1018,7 us · B 135,4 us · piso 101,4 us -> 7,52x
60  15 rondas A->B : A 2120,7 us · B 471,1 us · piso 193,2 us -> 4,50x
61  15 rondas B->A : A 1534,1 us · B 220,8 us · piso 134,0 us -> 6,95x
62  33 rondas A->B : A 1184,0 us · B 151,3 us · piso 108,1 us -> 7,82x
63  33 rondas B->A : A 1266,4 us · B 158,7 us · piso 110,4 us -> 7,98x
64  Con pocas rondas el mínimo no converge y la máquina cargada lo ensucia (el 4,50x).
65  Con 33 rondas el cociente se planta en 7,2-8,0x en las CINCO corridas y en las DOS
66  direcciones: el orden no lo explica.
67
68== los 24 comm que DIFIEREN entre los dos caminos ==
69No es un fallo del programa BPF: /proc SINTETIZA el nombre de los kworkers y le pega
70la workqueue que están sirviendo (wq_worker_comm). task->comm trae el nombre pelado.
71    DIFIERE pid 11: /proc=[kworker/0:0H-kb] bpf=[kworker/0:0H]
72    DIFIERE pid 29: /proc=[kworker/1:0H-kb] bpf=[kworker/1:0H]
73    DIFIERE pid 35: /proc=[kworker/2:0H-kb] bpf=[kworker/2:0H]
74    DIFIERE pid 41: /proc=[kworker/3:0H-kb] bpf=[kworker/3:0H]
75    DIFIERE pid 112: /proc=[kworker/3:1H-kb] bpf=[kworker/3:1H]
76    DIFIERE pid 181: /proc=[kworker/1:1H-kb] bpf=[kworker/1:1H]
77    DIFIERE pid 279: /proc=[kworker/2:1H-kb] bpf=[kworker/2:1H]
78    DIFIERE pid 5361: /proc=[kworker/3:0-eve] bpf=[kworker/3:0]
79  [...] los 24 son kworkers; NINGÚN proceso de usuario difiere. Quien cambie /proc por
80  el iterador y muestre nombres de kworker verá otra cosa — para las Cards, da igual.