Ir al contenido

El techo de muestreo

La pregunta que responde esta página es la que merece la pena hacer antes de fiarse de nada de lo demás: ¿a qué velocidad puede muestrear antes de empezar a perder datos?

En el equipo de referencia la respuesta es que no pierde, hasta el tope de 100 Hz de la propia CLI, con todas las fuentes leídas en cada tick. Eso no es una extrapolación desde la cifra de 10 Hz. Son cinco ejecuciones.

Cada cifra sale del propio cgroup del agente y de /metrics, con el conjunto completo de fuentes. Cada fila es una ventana con el anillo ya lleno:

Medido en RB5009UG+S+ · 4 × 1,4 GHz Cortex-A72 · RouterOS 7.24.2 · · 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
cadenciasuelosCPU de un núcleoµs/muestraRSSticks retrasadoshuecos / descartes
10 Hz (por defecto)por defecto2,85 %2 85631,3 MiB00 / 0
50 Hzpor defecto10,13 %2 02651,9 MiB00 / 0
100 Hzpor defecto17,81 %1 78176,5 MiB5 (0,08 %)0 / 0
50 HzFLOOR_HZ=5022,47 %4 49460,6 MiB6 (0,20 %)0 / 0
100 HzFLOOR_HZ=10043,95 %4 39579,6 MiB14 (0,23 %)0 / 0

FLOOR_HZ significa que cada fuente se lee en cada tick, sin ningún suelo por fuente — el peor caso que se le puede pedir al agente.

La memoria cambia de fila en fila porque el anillo cambia. La fila de 10 Hz es la instalación por defecto (anillo de 300 s, --mem-limit-mb 40 --memory-max 64M); las filas de 50 Hz usaron --buffer 120 --mem-limit-mb 64 --memory-max 96M y las de 100 Hz --buffer 120 --mem-limit-mb 80 --memory-max 128M. Dale sitio al recolector de basura del agente o el coste se dispara por motivos que no tienen nada que ver con la cadencia.

El coste por muestra baja cuando sube la cadencia

Sección titulada «El coste por muestra baja cuando sube la cadencia»

Una muestra cuesta 2 856 µs a 10 Hz frente a 1 781 µs a 100 Hz. No es una paradoja, son los suelos funcionando: las fuentes caras se amortizan entre más muestras. /proc/slabinfo, una de las fuentes caras (13,8 kB), se lee cada 2 ticks a 10 Hz y cada 17 a 100 Hz, así que una muestra media cuesta menos mientras la frecuencia de lecturas de slabinfo se queda cerca de su suelo de 6 Hz en ambos casos (5 Hz a 10 Hz, unos 5,9 Hz a 100 Hz).

Con FLOOR_HZ no hay nada que amortizar y el coste por muestra es plano — son 4 494 µs a 50 Hz y 4 395 µs a 100 Hz — así que la CPU escala linealmente con la cadencia: 22,47 %, y luego 43,95 %.

La muestra se produce igual y se entrega igual, llevando su dt_ns real, así que cualquier tasa calculada a partir de ella sigue siendo correcta. Es un emborronamiento, no un agujero, y se ve en mikroscope_tick_interval_seconds. A 100 Hz con todo en cada tick, el 99,5 % de los ticks cayeron aun así dentro de 11 ms de un período de 10 ms y el peor fue de 15 ms.

Con los suelos por defecto, todas las fuentes de un tick se leen en menos de 2 ms en el 97,5 % de las muestras a 100 Hz, holgadamente dentro de un período de 10 ms. FLOOR_HZ empuja un 1,4 % de las lecturas más allá de 5 ms, y esos son los ticks que se retrasan. El margen de CPU es mayor que el margen de tiempo, que es por lo que el techo es una afirmación sobre E/S y no sobre el A72.

Lo que muestrear más rápido compra de verdad

Sección titulada «Lo que muestrear más rápido compra de verdad»

Resolución de porcentaje de CPU no. El jiffie son 10 ms, así que a 100 Hz una muestra contiene 0 o 1 ticks ocupados y la proporción de ocupación por muestra tiene dos valores posibles. Por encima de unos 20 Hz los contadores de ticks dejan de ser un porcentaje y pasan a ser un indicador de ocupación; a partir de ahí la resolución la pone el PMU.

Lo que sí compra una cadencia mayor es todo lo que no está cuantizado por el jiffie — cuentas de paquetes de softnet, deltas de interrupciones, contadores del PMU, las marcas de tiempo del propio log del kernel — y una cota más estrecha sobre cuánto puede esconderse una ráfaga entre dos muestras.