# mikroscope

Telemetría de kernel por debajo del segundo desde dentro de un router MikroTik, con el coste del observador medido y no prometido.

Source: https://jmrplens.github.io/mikroscope/es/

## Medido, no presupuestado

- [**2,85 %** — de un núcleo a 10 Hz, la cadencia por defecto](/mikroscope/es/cost/)
- [**31,3 MiB** — de memoria residente a 10 Hz](/mikroscope/es/cost/)
- [**17,81 %** — de un núcleo a 100 Hz, el máximo de la CLI](/mikroscope/es/cost/rate-ceiling/)
- [**0 / 0** — huecos y descartes, en todos los destinos, en cinco ejecuciones](/mikroscope/es/cost/rate-ceiling/)

Las tres primeras, desde el propio cgroup del agente y `/metrics`; la cuarta, desde los tres destinos a los que reenviaba el colector; en un RB5009 (4 × 1,4 GHz Cortex-A72, RouterOS 7.24.2), ventanas de 60 s en régimen estacionario, 2026-09-15. Las cifras a 10 Hz superan el presupuesto de ≤ 2 % y ≤ 16 MiB.

## Una media de un segundo es un informe sobre un segundo

La API de RouterOS publica `cpu-load` una vez por segundo. Un núcleo saturado 100 ms y ocioso los otros 900 mueve la media de un segundo de cuatro núcleos en 2,5 %. Es aritmética, no una medida, y la cifra es cierta: solo que no puede decir cuándo.

El agente lee `/proc/stat`, `/proc/interrupts`, `/proc/softirqs` y `/proc/net/softnet_stat` desde dentro del router, a 10 Hz por defecto, y envía los deltas crudos de ticks con el intervalo que cubre cada uno. Nunca calcula un porcentaje; la ventana la eliges tú.

El suelo es del kernel, no de la herramienta. `/proc/stat` cuenta en ticks de 10 ms, así que una muestra de 100 ms resuelve un núcleo en escalones de 10 %. En el RB5009 (RouterOS 7.24.2, Linux 5.6.3) no hay PSI ni schedstat con los que afinar: ambos ficheros faltan, comprobado el 2026-09-11.

## Lo que cuesta, a tres cadencias

Cada fila es una ventana de 60 s con el anillo ya lleno. La memoria cambia por fila porque cambian el anillo y el límite de memoria.
Medido en RB5009UG+S+ · 4 × 1,4 GHz Cortex-A72 · RouterOS 7.24.2 · 2026-09-15 · ventanas de 60 s en régimen estacionario (con el anillo ya lleno), conjunto completo de fuentes, colector reenviando a la vez a fichero, a una exposición Prometheus y a InfluxDB 3

Las ejecuciones medidas:

| cadencia | suelos | CPU de un núcleo | µs/muestra | RSS | ticks retrasados | huecos / descartes |
| --- | --- | --- | --- | --- | --- | --- |
| 10 Hz (por defecto) | por defecto | **2,85 %** | 2 856 | 31,3 MiB | **0** | 0 / 0 |
| 50 Hz | por defecto | **10,13 %** | 2 026 | 51,9 MiB | **0** | 0 / 0 |
| 100 Hz | por defecto | **17,81 %** | 1 781 | 76,5 MiB | 5 (0,08 %) | 0 / 0 |

No se perdió nada a ninguna de estas cadencias: todos los destinos informaron de 0 huecos y 0 descartes, y la cadencia entregada coincidió con la configurada a tres cifras. Con los suelos por defecto y a 100 Hz, todas las fuentes de un tick se leyeron en menos de 2 ms en el 97,5 % de las muestras, dentro de un periodo de 10 ms.

[Las cinco ejecuciones, incluida la de todas las fuentes en cada tick →](/mikroscope/es/cost/rate-ceiling/)

## La CPU del router desde el kernel, sus interfaces desde la API

### Capa del kernel · el agente · de 10 a 100 Hz

Globales dentro del contenedor, así que son los del propio router: ticks de CPU por núcleo, interrupciones, softirqs, descartes y time squeezes de softnet, `/proc/meminfo`, `/proc/vmstat`, carga y E/S de disco. Un contenedor privilegiado añade el log del kernel como eventos con marca de tiempo y las cachés slab globales.

### Capa de la API · el colector · 1 Hz

El contenedor tiene su propio espacio de nombres de red, así que `/proc/net/dev` describe al contenedor, no al router. Los bytes y paquetes por interfaz vienen de la API de RouterOS y los fusiona el colector, sin interpolar. `privileged=yes` no cambia eso (comprobado el 2026-09-12).

## Cada escritura, listada antes de hacerla

Descarga el archivo para tu plataforma de la versión publicada, o compila la CLI desde una copia del repositorio con `make build`. El router necesita RouterOS 7.24 o posterior —el paso del contenedor escribe `privileged=`, un atributo que las versiones 7.x anteriores rechazan— con el paquete `container` y `device-mode container=yes`, que MikroTik condiciona a pulsar el botón de reset o a un corte de alimentación. arm64, arm y x86_64; ni MIPS ni TILE.

1. `mikroscope doctor`

   Comprobación de solo lectura; nombra el arreglo de lo que falte.

2. `mikroscope plan`

   Cada orden de RouterOS, sin escribir nada.

3. `mikroscope install`

   Doctor, confirmación, las escrituras y luego una sonda al agente. La imagen sale de tu propia toolchain de Go, del tar del agente publicado o del registro del que el router se la descarga.

4. `mikroscope status`

   Recuento de propiedad y salud del agente.

5. `mikroscope uninstall`

   Elimina y verifica.

**Lo que `install` escribe en tu router**

- una veth
- una dirección
- una pertenencia a lista de interfaces
- una entrada de address-list
- una envlist
- el tar de la imagen, salvo que `--remote-image` haga que el router se la baje
- el contenedor

Cada objeto lleva el comentario `mikroscope:<name> (managed by mikroscope)`

`mikroscope plan` imprime cada orden antes de escribir nada.

`uninstall` elimina por etiqueta exacta más identidad, nunca por patrón, y falla nombrando el paso si queda algo.

## Lo que no se afirma

> **No medido, luego no afirmado**
>
> Cualquier cadencia en una placa que no sea este RB5009, y cualquier carga de tráfico mayor que la de una tarde normal de este router, unos 30 Mbit/s. El coste depende de la velocidad del núcleo, del conjunto de fuentes y del tamaño del anillo: mídelo en tu propio equipo antes de presupuestarlo. El proyecto ha corrido en un equipo, un RB5009UG+S+ con RouterOS 7.24.2, arm64; las compilaciones para arm y x86_64 son cruzadas y pasan por CI, pero no han corrido nunca en hardware, y siete de los diez destinos solo se ejercitan contra dobles.

## Por dónde seguir

- [Qué es](/mikroscope/es/start/): Dos programas, un contenedor, cuatro límites dichos primero
- [Cinco minutos con un router](/mikroscope/es/start/walkthrough/): Instalar, grabar mientras cambias algo y dibujar el gráfico, con una grabación real de un RB5009
- [Instalar el agente](/mikroscope/es/install/): Cuatro maneras de llevar el agente al router, qué escribe install y en qué orden, y cómo uninstall quita solo lo que creó
- [El colector](/mikroscope/es/sinks/): Extraer, fusionar, derivar, repartir a diez destinos, y por qué uno lento nunca para el bucle
- [Cómo leer lo que muestra](/mikroscope/es/playbooks/): Un fallo de producción que la API no veía, fallos provocados y la forma en reposo contra la que se leen
- [Lo que los números no dicen](/mikroscope/es/cost/limits/): Cada límite de las cifras de arriba
