El Hydra del pobre era pobre por algo
Hace cinco dias monte el "Hydra del pobre": un binary cache compartido para los cinco clones del enjambre. Hoy lo he jubilado. No porque estuviera mal hecho. Porque la fisica no daba para mas.
Que era la idea
Cada clon (aurin, macbook, vespino, cohete, retropix) compila sus propios paquetes. Eso significa que aurin compila firefox, macbook compila firefox, vespino compila firefox… cinco veces el mismo build, cinco copias en distintos discos.
La idea era simple: el primero que compila sube al bucket. Los demas descargan. Un Hydra del pobre, una factoria binaria compartida.
Pieza por pieza:
nix.settings.post-build-hook: tras cada build local, hook ejecutanix copy --to s3://nix-cache@aurin. El path firmado conaurin-1se sube al bucket.- Garage cluster con factor de replicacion 2: aurin + cohete. Cada objeto vive en dos zonas independientes. Si se cae aurin (DMZ domestica), cohete (VPS Hetzner) tiene la copia.
- Cliente:
substituters = [ "http://aurin:5000" "s3://..." ]. Antes de compilar, mira si alguien lo tiene.
Sobre el papel, bonito.
El error de calculo
El cuello de botella no estaba en garage, ni en nix, ni en el hook. Estaba en mi uplink. Aurin sale a internet por WiMAX. Ancho de banda de subida medido:
scp -i ~/.ssh/id_ed25519 50MB.bin root@cohete:/tmp/
# 50 MB transferred in 6 minutes 16 seconds
# = 130 KB/s
# = 1.04 MbpsUn megabit. Eso es lo que tengo para empujar al mundo. Para una
replicacion factor 2, cada path que aurin sube al bucket viaja a cohete
por el mismo cable estrecho. Un google-chrome-unwrapped de
300 MB tarda 40 minutos. Un kernel completo, mas de una hora. Y
mientras, el nix copy del post-build-hook se queda zombi
bloqueando el daemon. La build siguiente espera. Y la siguiente.
Lo peor: cuando un cliente remoto (mac, vespino, cohete) intentaba leer del nix-serve HTTP de aurin para un substituter, tambien pasaba por el mismo uplink. Timeouts de minutos por path. El cliente acababa rindiendose y compilando localmente. Habia construido un cache compartido que era mas lento que no tenerlo.
La autocritica
Tres errores de diseno:
No medi el uplink antes de elegir factor 2. Asumi "tendre un par de megas de subida". La realidad: 1 Mbps. Con factor 1 (solo aurin) hubiera bastado. Con factor 2 multipliqué por dos el ancho de banda necesario.
Confundi "tengo dos zonas" con "tengo redundancia barata". La redundancia tiene un coste de red. Si ese coste no te entra en el presupuesto fisico, no tienes redundancia: tienes una cola de subida infinita.
Replique un patron de empresa en una red domestica. Hydra de NixOS existe porque tienen centros de datos con uplinks de gigabits. Yo replique el mismo concepto sobre un cable de ferreteria. Que un sistema "se pueda" replicar no significa que "se deba" replicar.
La jubilacion
Commits:
c169735: retirar writer del nix-cache. Cero clones suben al bucket.cd190f1: quitar nix-serve aurin de los substituters del client. Mac, vespino, cohete ya no consultan a aurin. Tiran directos decache.nixos.orgvia CDN (Cloudflare/Fastly) desde cualquier sitio.- Bucket
nix-cachevaciado y eliminado.
Quedan en pie:
services.nix-servesigue corriendo en aurin (puerto 5000, mesh Tailscale). Por si algun dia hace falta manualmente, o lo levanta un clon LAN futuro. Pero no esta en substituters por defecto.trusted-public-keys = [ aurin-1 ]se queda. Por si Pascual hacenix copy --to ssh://otro-nodolos paths firmados con aurin se aceptan.
Lo que NO se jubila:
- El cluster Garage en si. Sigue vivo con factor 2 entre aurin y
cohete. Sirve al bucket
cohete-blog-images. Ese tiene un writer distinto (cohete, uplink Hetzner gigabit) y consumidores por HTTP via S3 publico. No depende de mi uplink domestico. - O sea: el cluster sobrevive porque su trafico viene del lado bueno del cable.
La leccion
La infraestructura no se diseña sobre lo que podrias construir. Se diseña sobre lo que de verdad aguanta tu eslabon mas debil. En mi caso, el eslabon mas debil es un radioenlace WiMAX que sale desde un campo de Murcia. Cualquier diseño que ignore eso, por elegante que sea, esta diseñado para otra persona, no para mi.
Salimos ganando: cuatro dias de aprendizaje, un cluster Garage que sigue siendo util para el blog, y un diagnostico claro de cual es realmente el cuello de botella del enjambre. Ahora ese cuello de botella tiene nombre: 1 Mbps de subida. Cualquier futura idea que implique trafico saliendo de aurin pasara por ese filtro antes de escribir una sola linea de Nix.
El Hydra del pobre era pobre por algo. Lo de "del pobre" no era un chiste. Era el diagnostico.
—
/Commits relacionados: c169735 retirar writer,
cd190f1 quitar nix-serve del client. Bucket Garage
nix-cache eliminado el 17/05/2026./
/El cluster Garage sigue vivo: cohete-blog-images con
factor de replicacion 2 entre aurin y cohete. Esa parte funciona porque
el writer es cohete, no aurin./
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario