Ir al contenido

Una carga limitada por CPU

Esta página responde a qué aspecto tiene un cuello de botella de un solo hilo en los datos por núcleo, y por qué el total del equipo lo esconde. La carga se provocó a propósito.

Medido en RB5009UG+S+ · 4 × 1,4 GHz Cortex-A72 · RouterOS 7.24.2 · Linux 5.6.3 · · agente a 10 Hz en un contenedor privilegiado efímero

Sin ningún cambio de configuración y sin dependencias externas — un bucle de consola que quema un núcleo y termina por sí solo:

:local i 0; :while ($i < 4000000) do={ :set i ($i + 1) }

Duró 58,8 s.

En tramos de 5 segundos. El agente envía deltas de ticks en bruto; los porcentajes de abajo se calcularon a partir de ellos después.

t busy% per-core busy% ctxt/s temp MHz
0 22.3 31.8 7.4 40.4 9.6 9192 36.5 1400
1 30.9 11.7 11.4 89.7 10.6 11325 37.0 1400
2 29.9 14.3 9.4 19.6 76.0 9476 37.0 1400
3 29.1 7.4 9.4 17.6 81.6 10805 37.0 1400
4 29.3 3.1 9.4 4.9 99.8 9257 37.2 1400
8 28.4 2.2 7.0 4.6 99.8 11947 37.2 1400
11 33.0 11.8 11.2 9.0 99.7 12222 37.3 1400
  • Un total de ~29 % es un núcleo de cuatro. El total del equipo es una trampa; mira siempre la fila por núcleo. “29 % de CPU” significa aquí “un núcleo está saturado y tres están ociosos”, lo que para un cuello de botella de un solo hilo es toda la historia.
  • El planificador tardó ~20 s en asentarse. Los tramos 0–3 muestran el trabajo moviéndose entre núcleos (40 % → 90 % → 76 % → 82 %) antes de fijarse en el núcleo 3 al 99,8 %. Si muestreas cada 1 s o más despacio ves una meseta difusa; a 10 Hz ves la migración. Aquí es donde la resolución se gana lo que cuesta.
  • La temperatura lo siguió: de 36,5 a 37,3 °C. Un núcleo saturado vale ~0,8 °C en esta placa con refrigeración pasiva. Poco, pero sigue la carga, y se lee de /sys/class/thermal sin ninguna llamada a la API.
  • La frecuencia se quedó plana en 1400 MHz. En este equipo eso es una configuración, no una observación: el propietario ha fijado el reloj al máximo, lo que /system/routerboard/settings indica como Warning: cpu not running at default frequency. En un equipo que escala, el campo freq_khz es donde verías un tick ocupado que se ganó despacio. El agente lee la frecuencia en cada tick y guarda freq_khz solo cuando cambia, más un latido cada 60 s, así que con un reloj fijo tienes una fila por minuto, y con un reloj que escala tienes cada escalón que dure al menos un tick.

Antes de concluir nada de un número de CPU, confirma que mikroscope_slipped_total es 0. Un tick perdido es uno cuya lectura terminó después de que tocara el siguiente tick, y entonces la propia contabilidad del muestreador es lo primero de lo que deberías desconfiar.

Provocado a propósito ·

  • Un total del equipo cercano al 100 % dividido entre el número de núcleos — aquí ~29 % con cuatro núcleos — con una columna por núcleo al 99,7–99,8 %.
  • Antes de asentarse, la carga saltando visiblemente entre núcleos durante decenas de segundos.
  • Una subida de temperatura de menos de un grado que sigue a la carga.