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…
SDD 25 §9.5: el iterador BPF, medido — y H7 pasa a tener precio
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.