CPU – cr0x.net https://cr0x.net Wed, 25 Feb 2026 03:23:10 +0000 es hourly 1 https://wordpress.org/?v=6.9.4 https://cr0x.net/wp-content/uploads/2026/02/logo-150x150.png CPU – cr0x.net https://cr0x.net 32 32 CPU de hardware: La trampa de la actualización — BIOS, microcódigo y realidad de los VRM https://cr0x.net/es/trampa-actualizacion-cpu-bios-microcodigo-vrm/ https://cr0x.net/es/trampa-actualizacion-cpu-bios-microcodigo-vrm/#respond Wed, 25 Feb 2026 03:23:10 +0000 https://cr0x.net/?p=33950 Las actualizaciones de CPU parecen el tipo más sencillo de planificación de capacidad: compras un chip más rápido, lo instalas y disfrutas de más margen. Entonces el servidor empieza a reiniciarse bajo carga, o funciona más lento que antes, o “funciona” hasta el primer día cálido en la sala de datos.

La trampa es que una CPU no es una actualización autocontenida. Es una negociación entre el firmware BIOS/UEFI, el microcódigo, los VRM de la placa base, los límites de potencia de la plataforma y lo que tu sistema operativo cree que es verdad. Si cualquiera de esas partes no está de acuerdo, la producción arbitrará la discusión por ti—a las 2 a.m.

El contrato real de la actualización: el socket no es compatibilidad

A la gente le encanta la tabla de sockets. “Es LGAxxxx, así que estamos bien.” O “AM4 soporta esta generación.” Eso es compatibilidad a nivel de marketing. La compatibilidad a nivel de producción es más fea:

  • El BIOS/UEFI debe reconocer la CPU (CPUID, stepping, secuencia de inicialización, reglas de entrenamiento de memoria).
  • El microcódigo debe ser aceptable (mitigaciones de seguridad, soluciones para erratas, correcciones de estabilidad).
  • Los VRM y la entrega de potencia de la placa deben sobrevivir en la realidad (corriente sostenida, respuesta a transitorios y diseño térmico).
  • Los límites de potencia de la plataforma deben coincidir con tu carga de trabajo (PL1/PL2/Tau, EDC/TDC/PPT, cTDP, ajustes “auto”).
  • La refrigeración debe corresponder al comportamiento de boost (el turbo es una política térmica tanto como una política de frecuencia).
  • El sistema operativo y el hipervisor deben programar correctamente (nueva topología, núcleos híbridos, CPPC, comportamiento de SMT).

Cuando cualquiera de estos está “casi bien”, no obtienes una falla limpia. Obtienes fallos intermitentes, acantilados de rendimiento y un spam misterioso de “error de hardware corregido” que todo el mundo ignora hasta que deja de corregirse.

Verdad seca: en entornos empresariales, la placa base es el producto y la CPU es una opción soportada. En entornos de aficionado, la CPU es el producto y la placa es una sugerencia. No lleves suposiciones de aficionado a una ventana de cambios.

BIOS vs microcódigo vs VRM: ¿quién ejecuta realmente tu CPU?

BIOS/UEFI: el portero en la puerta

BIOS/UEFI es la primera capa de verdad. Inicializa la CPU, establece políticas de potencia, entrena la memoria y expone perillas (a veces perillas falsas) al sistema operativo. Si el BIOS no incluye el código de inicialización correcto de la CPU, es posible que no arranques o que arranques con comportamiento degradado: bins de turbo limitados, funciones deshabilitadas o entrenamiento de memoria inestable.

El BIOS moderno también se distribuye con microcódigo incluido. Eso importa porque el microcódigo es efectivamente una capa de parche para el comportamiento de la CPU. La CPU sale de fábrica con microcódigo, pero puede ser reemplazado temprano en el arranque, ya sea por el firmware o por el sistema operativo.

Microcódigo: el parche silencioso que no probaste

Las actualizaciones de microcódigo abordan erratas, problemas de estabilidad y mitigaciones de seguridad. También pueden cambiar características de rendimiento de formas no obvias: comportamiento de especulación, barreras o cuán agresivamente una CPU hace boost bajo ciertas condiciones.

No “instalas microcódigo” como un controlador. Lo despliegas como despliegas un kernel nuevo: controlado, monitorizado y con reversión. Si nunca has visto que una actualización de microcódigo desencadene un bucle de reinicio en un stepping específico, felicidades por tu juventud.

Una cita que la gente de operaciones tiende a interiorizar tras suficientes incidentes:

“La esperanza no es una estrategia.” — Gen. Gordon R. Sullivan

VRM: la pieza a la que no prestaste atención porque no brilla

La CPU es alimentada por módulos reguladores de voltaje (VRM). Los VRM convierten 12V (u otros rieles) en un voltaje estable para el núcleo de la CPU a corrientes muy altas. El comportamiento de boost de la CPU es un deporte de corriente transitoria: el chip solicitará grandes ráfagas de potencia por intervalos cortos, y el VRM debe responder sin caída, sobreimpulso o sobrecalentamiento.

El marketing de las placas habla de “fases”. A los ingenieros les importan la capacidad efectiva de corriente, la respuesta a transitorios y la térmica. Una placa puede declarar muchas fases y aun así comportarse mal si el diseño es barato o está mal refrigerado. En servidores, los VRM se diseñan alrededor de SKUs de CPU específicos y se validan con ellos. En placas commodity, la brecha entre “soporta” y “disfruta de ejecutar” es donde viven tus caídas.

Broma #1: Una actualización de CPU es como adoptar un perro más grande. La correa (VRM) es lo que se rompe primero, no el perro.

Breve historia y hechos que explican el lío actual

Esto no es trivia por trivialidad. Explica por qué “simplemente intercambiar la CPU” sigue convirtiéndose en un postmortem.

  1. Las actualizaciones de microcódigo existen desde hace décadas, pero la entrega generalizada de microcódigo por parte del SO se volvió común en los 2000 a medida que las plataformas se hicieron más complejas y las mitigaciones de seguridad importaron.
  2. Las mitigaciones de ejecución especulativa tras Spectre/Meltdown cambiaron materialmente el rendimiento para algunas cargas, especialmente sistemas con muchas llamadas al sistema y con muchos context switches.
  3. Los límites de potencia turbo de Intel (PL1/PL2/Tau) convirtieron el “TDP” en una elección de política; las placas empezaron a salir con valores por defecto “ilimitados” porque los benchmarks venden placas base.
  4. El comportamiento de boost y CPPC de AMD depende cada vez más de la coordinación entre firmware y SO; una actualización del BIOS puede cambiar el boost más que un intercambio de CPU.
  5. La complejidad del entrenamiento de memoria se disparó con velocidades DDR más altas; las versiones del BIOS difieren dramáticamente en la estabilidad del entrenamiento, especialmente con DIMMs mezclados o integridad de señal marginal.
  6. Los proveedores de servidores validan steppings de CPU específicos; dos chips con el mismo nombre de SKU pueden comportarse diferente si el stepping y el microcódigo divergen.
  7. Los límites térmicos de los VRM dependen de la carga; una placa puede pasar un benchmark corto y todavía reducir frecuencia o colapsar bajo cargas AVX sostenidas o compresión.
  8. El comportamiento de frecuencia con AVX (reducción de frecuencia bajo cargas vectoriales amplias) se malinterpreta a menudo; “CPU más rápida” puede ser más lenta si tu carga activa relojes sostenidos más bajos.

Modos de fallo que verás en producción

1) Arranca bien y luego se reinicia bajo carga

Esto es clásico de protección térmica o transitoria del VRM, o una política de potencia “auto” demasiado agresiva. Lo verás en compresión, cifrado, cargas analíticas pesadas en AVX o servidores de compilación bajo carga paralela.

2) La CPU “actualizada” es más lenta que la anterior

Culpables comunes:

  • El nuevo microcódigo habilita mitigaciones que afectan tu carga más de lo esperado.
  • Los límites de potencia son conservadores (PL1 fijado al TDP con Tau corto).
  • El estrangulamiento térmico comienza antes porque la nueva CPU hace boost de manera diferente.
  • Cambios en NUMA/topología causan ineficiencia del planificador (especialmente en máquinas virtuales).

3) Errores corregidos aleatorios (WHEA/EDAC) que “no son un problema” hasta que lo son

Los errores de machine check corregidos pueden indicar estabilidad marginal: problemas de entrenamiento de memoria, Vcore marginal, caída de VRM o problemas de señalización PCIe tras un cambio de plataforma. A producción le encanta convertir “corregido” en “no corregido” durante el tráfico pico.

4) No pasa POST, o solo hace POST tras reset del BIOS

Esto suele ser falta de soporte de la CPU en el BIOS, o una regresión en el entrenamiento de memoria. Otra trampa: placas que requieren un BIOS más nuevo pero no pueden flashear sin una CPU antigua soportada instalada. Es una trampa perfecta: necesitas la CPU para arrancar y flashear el BIOS, y necesitas el BIOS para arrancar la CPU.

5) Oscilación de rendimiento: los relojes rebotan, picos de latencia

Busca conflictos de gestión de energía: governor del kernel, estados C del BIOS, CPPC, políticas de turbo o estrangulamiento térmico. Los ajustes “auto” rara vez son una política estable; son una táctica de ventas.

6) Comportamiento extraño en virtualización después del intercambio de CPU

Nuevas funciones de CPU pueden cambiar los conjuntos de instrucciones expuestos a las VM. La migración en vivo puede fallar. Licencias o flags de funciones pueden romperse. Algunos entornos requieren enmascaramiento de funciones de CPU para mantener el clúster consistente.

Guion rápido de diagnóstico

Cuando la actualización ya está hecha y el sistema se comporta mal, no tienes tiempo para un seminario de filosofía. Necesitas encontrar el cuello de botella y decidir si revertir, parchear o reconfigurar.

Primero: ¿es estrangulamiento por potencia/térmico?

  • Comprueba frecuencias actuales y máximas bajo carga.
  • Verifica banderas de throttling (cuando estén disponibles) y sensores de temperatura de la CPU.
  • Correlaciona el throttling con fases de la carga (AVX, compresión, ráfagas).

Segundo: ¿es incompatibilidad de microcódigo/firmware o consecuencias de erratas?

  • Confirma versión de BIOS, revisión de microcódigo y estado del microcódigo en el kernel.
  • Revisa logs en busca de MCE/WHEA, EDAC y eventos PCIe AER.
  • Compara comportamiento entre hosts idénticos—si solo uno es “especial”, probablemente lo es.

Tercero: ¿es entrenamiento de memoria/IMC inestable?

  • Busca correcciones ECC, contadores EDAC y MCE relacionados con memoria.
  • Reduce la velocidad de memoria (o desactiva XMP/DOCP) como prueba, no como solución permanente.
  • Ejecuta una prueba de estrés de memoria controlada durante la ventana de cambio, no después.

Cuarto: ¿el planificador/ topología del SO está ahora equivocado?

  • Valida conteo de núcleos, estado de SMT, nodos NUMA y ajustes de aislamiento de CPU.
  • En arquitecturas híbridas, valida soporte del kernel y la política de pinning.
  • En virtualización, confirma mask de características de CPU y compatibilidad de clúster.

Si no puedes explicar el comportamiento en 30 minutos con estas comprobaciones, ya pasaste de “ajuste” a “revertir y re-evaluar.” Eso no es derrota. Es madurez.

Tareas prácticas: comandos, salidas y decisiones (12+)

Estas son centradas en Linux porque Linux tiende a decir la verdad (eventualmente). Úsalas durante prechequeos y validación post-actualización. Cada tarea incluye: comando, qué significa la salida y la decisión que tomas.

Task 1: Identify the CPU model, stepping, and microcode revision

cr0x@server:~$ lscpu | egrep 'Model name|Socket|Stepping|CPU\(s\)|Thread|Core|NUMA|Vendor|Flags'
Vendor ID:                       GenuineIntel
Model name:                      Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
CPU(s):                          44
Thread(s) per core:              2
Core(s) per socket:              22
Socket(s):                       1
Stepping:                        1
NUMA node(s):                    1
Flags:                           fpu vme de pse tsc msr pae mce cx8 apic sep mtrr ... avx2

Significado: Confirma topología (cores/threads/sockets), stepping y flags de características. El stepping importa para el soporte del BIOS y el comportamiento de erratas.

Decisión: Si el stepping difiere de tu flota validada, trátalo como una nueva variante de plataforma. Actualiza el runbook y prueba migración/enmascaramiento de funciones en virtualización.

cr0x@server:~$ grep -m1 -E 'microcode|model|stepping' /proc/cpuinfo
model		: 79
stepping	: 1
microcode	: 0xb00003e

Significado: Muestra la revisión de microcódigo en uso ahora mismo.

Decisión: Si esto difiere de otros hosts con el mismo BIOS/kernel, tienes drift. Arregla el drift antes de culpar a la aplicación.

Task 2: Verify BIOS/UEFI version (and vendor strings)

cr0x@server:~$ sudo dmidecode -t bios | egrep 'Vendor|Version|Release Date|BIOS Revision'
Vendor: American Megatrends Inc.
Version: 3.2
Release Date: 08/17/2022
BIOS Revision: 5.27

Significado: Esta es la identidad del firmware que correlacionarás con comportamientos conocidos.

Decisión: Si la actualización requirió un bump de BIOS, asegura que todo el clúster esté en la misma línea base a menos que hayas diseñado explícitamente para heterogeneidad.

Task 3: Confirm whether microcode was loaded by the kernel

cr0x@server:~$ dmesg -T | egrep -i 'microcode|ucode' | tail -n 5
[Tue Feb  4 10:22:11 2026] microcode: microcode updated early to revision 0xb00003e, date = 2023-10-12
[Tue Feb  4 10:22:11 2026] microcode: CPU0: patch_level=0x00000000

Significado: “updated early” indica microcódigo entregado por el SO (initramfs) aplicado antes de que corra la mayor parte del kernel. Eso suele ser lo deseable.

Decisión: Si el microcódigo no se aplica temprano (o no se aplica), arregla el paquete/configuración de microcódigo en initramfs. No operes CPUs medio parcheadas en producción.

Task 4: Look for machine check errors (MCE) and corrected hardware errors

cr0x@server:~$ sudo journalctl -k -b | egrep -i 'mce|machine check|hardware error|whea|edac' | tail -n 20
Feb 04 10:41:12 server kernel: mce: [Hardware Error]: CPU 3: Machine Check: 0 Bank 6: b200000000070005
Feb 04 10:41:12 server kernel: mce: [Hardware Error]: TSC 0 ADDR fef1a140 MISC d012000100000000 SYND 4d000000 IPID 60000000000000
Feb 04 10:41:12 server kernel: EDAC MC0: 1 CE memory read error on CPU_SrcID#0_Ha#0_Chan#1_DIMM#0

Significado: Entradas MCE/EDAC significan que la plataforma está viendo y corrigiendo (o no corrigiendo) errores. Tras una actualización de CPU, esto suele ser entrenamiento de memoria o entrega de potencia marginal.

Decisión: Si ves nuevos errores corregidos después de la actualización, para. Investiga antes de escalar el despliegue. Los errores corregidos son un sistema de alarma temprana, no una característica decorativa de logs.

Task 5: Check CPU frequency behavior and current governor

cr0x@server:~$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance

Significado: Muestra el governor para cpu0 (usualmente representativo). “performance” mantiene relojes más altos; “powersave” puede aún hacer boost en CPUs modernas pero las políticas varían.

Decisión: Si persigues regresiones de latencia, fija una política conocida y prueba. No dejes el comportamiento del governor implícito en la flota.

cr0x@server:~$ grep -E 'cpu MHz|model name' -m3 /proc/cpuinfo
model name	: Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
cpu MHz		: 1200.000
model name	: Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz

Significado: Instantánea de la frecuencia efectiva actual. Números de idle no prueban throttling; comprueba bajo carga.

Decisión: Si bajo carga las frecuencias se estancan por debajo del turbo all-core esperado, sospecha límites de potencia o térmicos antes de culpar al microcódigo.

Task 6: Check temperature sensors and throttling hints

cr0x@server:~$ sudo sensors
coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +78.0°C  (high = +80.0°C, crit = +100.0°C)
Core 0:        +76.0°C  (high = +80.0°C, crit = +100.0°C)
Core 1:        +77.0°C  (high = +80.0°C, crit = +100.0°C)

Significado: Si estás sentado en “high” durante carga normal, vives de prestado. Las CPUs de servidor se protegerán; tus SLOs no.

Decisión: Mejora la refrigeración, reduce límites de potencia o cambia el SKU de CPU. No “resuelvas” fingiendo que los sensores son pesimistas.

Task 7: Inspect power limit behavior via RAPL (Intel) when available

cr0x@server:~$ sudo powercap-info -p intel-rapl
Zone 0
  Name: package-0
  Power limits:
    long_term: 140.00 W (enabled)
    short_term: 180.00 W (enabled)

Significado: Muestra límites de potencia de paquete configurados. Estos influyen fuertemente en la frecuencia sostenida.

Decisión: Si los límites son más bajos de lo esperado para la CPU y el chasis, ajusta en BIOS a una política validada. Si tus VRM/refrigeración no soportan más, esa también es la respuesta.

Task 8: Detect thermal throttling and frequency caps via kernel messages

cr0x@server:~$ dmesg -T | egrep -i 'thrott|thermal|power limit' | tail -n 20
[Tue Feb  4 11:02:03 2026] CPU0: Core temperature above threshold, cpu clock throttled (total events = 12)
[Tue Feb  4 11:02:03 2026] CPU0: Package temperature above threshold, cpu clock throttled (total events = 12)

Significado: El kernel está reportando eventos de throttling térmico. Eso no es “normal.” Es la CPU pidiendo un plan menos ambicioso.

Decisión: Si el throttling ocurre durante una carga en estado estable, trátalo como pérdida de capacidad. Arregla la refrigeración o limita el turbo/potencia en BIOS para rendimiento predecible.

Task 9: Validate memory speed and configuration post-upgrade

cr0x@server:~$ sudo dmidecode -t memory | egrep -A3 'Memory Device|Speed:|Configured Memory Speed:|Manufacturer:|Part Number:' | head -n 40
Memory Device
	Manufacturer: Samsung
	Part Number: M393A2K40BB1-CRC
	Speed: 2400 MT/s
	Configured Memory Speed: 2133 MT/s

Significado: Muestra la velocidad nominal del DIMM frente a la velocidad configurada. Una actualización de CPU puede cambiar los multiplicadores de memoria soportados, o el BIOS puede reentrenar a una velocidad inferior por estabilidad.

Decisión: Si la velocidad configurada bajó inesperadamente, verifica las velocidades soportadas por el IMC con tu población de DIMMs. La estabilidad gana a la banda teórica, pero downclocks inesperados explican regresiones de rendimiento.

Task 10: Check PCIe errors after platform changes

cr0x@server:~$ sudo journalctl -k -b | egrep -i 'aer|pcie|corrected error' | tail -n 20
Feb 04 10:55:21 server kernel: pcieport 0000:00:1c.0: AER: Corrected error received: id=00e0
Feb 04 10:55:21 server kernel: pcieport 0000:00:1c.0: AER: [ 0] RxErr

Significado: Los errores corregidos PCIe AER pueden aparecer tras cambios de CPU/BIOS (entrenamiento PCIe, integridad de señal, políticas ASPM).

Decisión: Unos pocos durante el arranque pueden ser tolerables; persistentes bajo carga no lo son. Investiga ajustes PCIe en BIOS, vuelve a asentar tarjetas, revisa risers/cables y considera actualizaciones de firmware de los endpoints.

Task 11: Confirm NUMA layout and CPU topology (important for perf regressions)

cr0x@server:~$ numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
node 0 size: 257761 MB
node 0 free: 244120 MB

Significado: Confirma nodos NUMA y mapeo de CPU. Una actualización de CPU (o un reset de BIOS) puede cambiar el comportamiento NUMA, interleaving de memoria o SNC (sub-NUMA clustering).

Decisión: Si el layout NUMA cambió respecto a tu baseline, revisa pinning, asignación de hugepages y supuestos de localización de memoria.

Task 12: Confirm virtualization CPU feature exposure (KVM example)

cr0x@server:~$ sudo virsh capabilities | egrep -n 'model|vendor|feature' | head -n 25
12:    Intel
18:    Broadwell
19:    
20:    
21:    

Significado: Muestra lo que el host anuncia. Tras una actualización de CPU, el modelo/características pueden diferir, rompiendo la compatibilidad de migración en vivo.

Decisión: Si dependes de migración, impón un modelo de CPU consistente (enmascaramiento) en todo el clúster. “Arranca” no es la prueba de aceptación para virtualización.

Task 13: Check kernel mitigations state (performance regression clue)

cr0x@server:~$ grep . /sys/devices/system/cpu/vulnerabilities/* | head -n 20
/sys/devices/system/cpu/vulnerabilities/spectre_v1: Mitigation: usercopy/swapgs barriers and __user pointer sanitization
/sys/devices/system/cpu/vulnerabilities/spectre_v2: Mitigation: Retpolines; IBPB: conditional; IBRS_FW; STIBP: disabled; RSB filling

Significado: Muestra qué mitigaciones están activas. El microcódigo y las actualizaciones del BIOS pueden cambiar esto sin pedirte permiso.

Decisión: Si el rendimiento regresó, cuantifícalo y decide con seguridad si los niveles de mitigación son aceptables. No desactives mitigaciones en secreto para ganar una batalla de benchmarks contigo mismo.

Task 14: Stress test in a controlled way (and watch errors)

cr0x@server:~$ sudo stress-ng --cpu 0 --cpu-method matrixprod --metrics-brief --timeout 120s
stress-ng: info:  [27184] setting to a 120s run per stressor
stress-ng: info:  [27184] dispatching hogs: 44 cpu
stress-ng: info:  [27184] successful run completed in 120.00s
stress-ng: info:  [27184] stressor       bogo ops real time  usr time  sys time   bogo ops/s
stress-ng: info:  [27184] cpu             1234567   120.00   5100.00     12.34     10288.06

Significado: Una carga de CPU repetible. Combínala con monitorización de sensores y logs para sacar a la luz throttling o errores durante la ventana.

Decisión: Si el estrés induce throttling o eventos MCE/EDAC, la actualización no está lista para producción. Arregla potencia/refrigeración/BIOS primero.

Tres mini-historias corporativas del campo minado de actualizaciones

Mini-historia 1: El incidente causado por una suposición errónea

La empresa tenía una pequeña flota de servidores 1U “idénticos” usados para pipelines de build. Mismo modelo de chasis, misma revisión de placa, misma PSU. Tenían un backlog de actualizaciones de CPU en un armario: piezas más rápidas, mismo socket, misma generación. La solicitud de cambio se trató como rutina: actualización en rodadura, un host a la vez, sin cambios a nivel de aplicación.

El primer host actualizado arrancó y volvió al pool. Las builds corrieron unas horas y luego el host se reinició por completo bajo compilación paralela máxima. Sin pánico, sin logs más allá de las últimas líneas. Volvió, se reincorporó y se cayó otra vez. El equipo asumió un CPU defectuoso y lo cambiaron. Mismo comportamiento. Luego culparon a la PSU. Luego al kernel porque es lo que hacemos cuando estamos cansados.

Eventualmente alguien notó que el comportamiento de turbo de la CPU actualizada era diferente: las ráfagas cortas estaban bien, la carga sostenida provocaba un consumo por todos los núcleos más alto que el SKU antiguo nunca solicitó. El disipador del VRM de la placa estaba diseñado para los SKUs validados originales, y el perfil de flujo de aire del chasis no era bueno en la esquina del VRM. Bajo compilaciones paralelas sostenidas, la temperatura del VRM subía en silencio hasta que la protección saltaba—reset instantáneo.

La suposición errónea fue “mismo socket significa mismo perfil de potencia.” La compatibilidad de socket es un requisito de arranque, no una garantía operativa. Lo resolvieron limitando los límites de potencia en BIOS a un sobre probado y aumentando la curva de ventiladores del chasis para ese pool. La solución final fue en compras: dejar de comprar la variante de placa más barata para roles intensivos en CPU.

Mini-historia 2: La optimización que salió mal

Otro equipo ejecutaba servicios de baja latencia en metal desnudo. Tras una actualización de CPU, vieron que su latencia p99 empeoró durante picos de tráfico. La utilización de CPU estaba bien. El load average no alarmaba. La primera conjetura fue “pausas de GC” o “jitter de red”. Empezaron a tunear hilos de aplicación y a fijar cores. Incluso consideraron reescribir una vía caliente porque así fue esa semana.

Un ingeniero de rendimiento vio algo en la monitorización: la frecuencia oscilaba bajo carga en ráfagas. El nuevo BIOS tenía “turbo mejorado” habilitado por defecto, lo que efectivamente eliminó límites de potencia sensatos. La CPU subía mucho, alcanzaba límites térmicos rápidamente y luego se estrangulaba. El resultado no fue menor rendimiento medio; fue rendimiento inconsistente. La latencia odia la inconsistencia más que relojes ligeramente más bajos.

“Optimizaron” habilitando la política de boost más agresiva porque se veía bien en un benchmark. En producción produjo un patrón en sierra: boost, sobrecalentamiento, throttling, recuperación, repetir. El planificador del SO movía trabajo a “núcleos más rápidos”, lo que cambió la localidad de caché y empeoró aún más la latencia de cola.

La solución fue aburrida: establecer PL1/PL2/Tau explícitos a un perfil estable que la refrigeración pudiera sostener y bloquear curvas de ventilador. La latencia mejoró de inmediato y el equipo dejó de discutir con la realidad. Dejaron algo de rendimiento pico en la mesa. Ganaron predictibilidad, que es lo que los clientes realmente notan.

Mini-historia 3: La práctica aburrida pero correcta que salvó el día

Un equipo de almacenamiento planificó actualizaciones de CPU para un conjunto de nodos intensivos en cifrado. Habían aprendido—por las malas—que “pequeños cambios de firmware” no son pequeños. Así que trataron la actualización como un cambio de plataforma: preflight, canario, rollout, postflight, con un plan de reversión estricto.

Empezaron por inventariar versiones de BIOS, revisiones de microcódigo y poblaciones de DIMM en la flota. Descubrieron drift: un puñado de nodos tenía un BIOS más nuevo porque alguien había reemplazado una placa bajo garantía y no estandarizó el firmware después. Ese drift nunca había importado—hasta que una actualización de CPU lo habría hecho a escala.

Eligieron un host canario, actualizaron el BIOS a la línea base objetivo, validaron la carga de microcódigo en initramfs y ejecutaron una suite de estrés controlada que incluyó pruebas AVX intensas y presión de I/O. Vigilaron contadores EDAC y logs PCIe AER como si fuera un monitor cardíaco. El host pasó, pero solo después de que ajustaron la velocidad de memoria un grado hacia abajo debido a una inestabilidad de entrenamiento con los DIMMs existentes.

Cuando comenzó el despliegue, un nodo no pasó POST tras el intercambio de CPU. En lugar de improvisar, ejecutaron el procedimiento de reversión: restaurar la CPU vieja, arrancar, flashear BIOS otra vez, limpiar NVRAM y reintentar. Funcionó. El incidente quedó contenido porque el plan asumía rarezas y dio permiso a la gente para parar y revertir.

No obtuvieron una historia heroica. Obtuvieron una semana tranquila. Ese es el resultado correcto.

Errores comunes: síntoma → causa raíz → solución

1) Síntoma: reinicios aleatorios solo durante cómputo intenso

Causa raíz: Sobrecalentamiento de VRM o protección por sobrecorriente, a menudo desencadenado por AVX sostenido o boost all-core.

Solución: Limitar los límites de potencia en BIOS a lo que la placa y la refrigeración pueden sostener; mejorar flujo de aire en VRM; evitar valores por defecto de “mejora multinúcleo/turbo ilimitado”.

2) Síntoma: la CPU es “más rápida” en papel pero el rendimiento de throughput es peor

Causa raíz: Límites de potencia conservadores (PL1 demasiado bajo), throttling térmico o mitigaciones habilitadas por microcódigo/BIOS más nuevo.

Solución: Mide relojes bajo carga; establece límites de potencia explícitos; asegura refrigeración; compara estados de mitigación; toma una decisión consciente de seguridad/rendimiento.

3) Síntoma: fallo de POST tras intercambio de CPU

Causa raíz: El BIOS no soporta la CPU, o ajustes NVRAM incompatibles con el nuevo stepping, o regresión en el entrenamiento de memoria.

Solución: Actualiza BIOS usando una CPU conocida buena primero; limpia CMOS/NVRAM; reduce temporalmente la velocidad de memoria y quita DIMMs marginales para completar el entrenamiento.

4) Síntoma: nuevos errores de memoria corregidos (ECC) tras la actualización

Causa raíz: Diferencias en el controlador de memoria, algoritmos de entrenamiento cambiados en BIOS, integridad de señal marginal en DIMMs o condiciones de VDD/Vcore inestables.

Solución: Baja la velocidad de memoria; asegura que los DIMMs cumplan reglas de población; actualiza BIOS; valida con estrés de memoria; reemplaza DIMMs sospechosos si los errores se concentran en un módulo.

5) Síntoma: falla la migración en vivo tras la actualización de CPU

Causa raíz: El conjunto de características de la CPU cambió; el clúster ya no es homogéneo; el hipervisor rechaza la migración por incompatibilidad de funciones.

Solución: Configura líneas base de modelo de CPU y enmascaramiento de funciones; estandariza microcódigo/BIOS en el clúster; valida rutas de migración antes del despliegue.

6) Síntoma: errores intermitentes en dispositivos PCIe tras la actualización

Causa raíz: Cambios en el entrenamiento PCIe, toggles ASPM, cambios en valores por defecto del BIOS o sensibilidad del firmware del endpoint.

Solución: Revisa logs AER; vuelve a asentar hardware; fija ajustes PCIe conocidos en BIOS; actualiza firmware de endpoints cuando corresponda; intercambia risers/cables.

7) Síntoma: ventiladores más ruidosos y aún así throttling

Causa raíz: Solución de refrigeración no dimensionada para el nuevo comportamiento de potencia sostenida; pasta térmica o montaje incorrecto tras reinstalar.

Solución: Remonta el disipador, confirma contacto; usa torque correcto; valida flujo de aire; establece límites de potencia estables en vez de perseguir picos de boost.

8) Síntoma: logs del kernel muestran “microcode updated” y cambios de rendimiento inesperados

Causa raíz: La revisión de microcódigo difiere entre hosts, o el microcódigo nuevo cambia mitigaciones/erratas.

Solución: Estandariza versiones de paquete de microcódigo; inclúyelas en imágenes golden; monitoriza la revisión de microcódigo como ítem de configuración; despliega como una actualización de kernel.

Broma #2: “Auto” en el BIOS significa “sorpresas automáticas.” Es el equivalente firmware de dejar que un niño pequeño conduzca porque está entusiasmado.

Listas de verificación / plan paso a paso

Lista pre-actualización: decide si la actualización siquiera es buena idea

  1. Confirma soporte de plataforma: lista de soporte de CPU del proveedor de placa por SKU exacto y stepping, no solo por generación de marketing.
  2. Confirma la ruta de firmware: versión objetivo de BIOS, disponibilidad de downgrade/rollback y método de flasheo (in-band vs out-of-band).
  3. Confirma entrega de potencia y refrigeración: idoneidad del diseño VRM, flujo de aire del chasis, clase de disipador y margen de PSU.
  4. Confirma reglas de población de memoria: mezcla de rangos/tamaños de DIMM, velocidad y si el SKU de CPU cambia tasas de memoria soportadas.
  5. Confirma características de la carga de trabajo: intensidad AVX, carga all-core sostenida, tráfico con sensibilidad a latencia en ráfagas o combinación I/O + CPU.
  6. Confirma restricciones de virtualización: línea base/enmascaramiento de CPU, compatibilidad de migración y ataduras de licencias al modelo de CPU si aplica.

Plan para la ventana de cambio: ejecuta como si esperases problemas

  1. Inventario y baseline: captura BIOS actual, microcódigo, kernel, estado de mitigaciones y métricas clave de rendimiento.
  2. Estandarización de firmware primero: actualiza BIOS/UEFI a la objetivo en la CPU existente si es necesario, valida arranque y logs.
  3. Canario un host: no actualices en lote. Un host, una validación completa.
  4. Instala la CPU: sigue guías ESD y de torque. Reasienta memoria si la tocaste. No “limpies y reutilices pasta” como si fuera 1999.
  5. Chequeos al primer arranque: confirma ID de CPU, revisión de microcódigo, velocidad de memoria y que no haya nuevos errores MCE/EDAC/AER.
  6. Stress controlado: ejecuta estrés de CPU + memoria y vigila temperaturas, relojes y logs de errores en tiempo real.
  7. Prueba de humo de la carga: ejecuta una carga representativa o un sintético que coincida con tu cuello de botella (crypto, compresión, compilación, JVM, base de datos).
  8. Punto de decisión de rollback: si ves errores corregidos, throttling o inestabilidad, revierte. No negocies con una señal de advertencia.

Lista post-actualización: evita incidentes de lento desarrollo

  1. Bloquea la configuración: documenta ajustes de BIOS que importan (límites de potencia, estados C, SMT, perfil de memoria, ajustes PCIe).
  2. Monitoriza los contadores correctos: MCE/EDAC, PCIe AER, eventos de throttling, distribuciones de frecuencia y tendencias de temperatura.
  3. Estandariza entrega de microcódigo: asegura paquetes de microcódigo en initramfs consistentes en la flota.
  4. Revisa modelos de capacidad: actualiza líneas base de rendimiento y umbrales de margen usando rendimiento sostenido observado, no picos de boost.
  5. Actualiza reglas de compatibilidad del clúster: líneas base de CPU del hipervisor, enmascaramiento de funciones y políticas de migración.

Plan de reversión (escríbelo antes de necesitarlo)

  • Mantén al menos una CPU conocida buena in situ para rutas de recuperación de BIOS.
  • Mantén imágenes de flasheo de BIOS para versiones actual y objetivo, y sabe en qué dirección está permitido flashear.
  • Captura ajustes del BIOS (fotos, exportación o texto cuando sea posible) antes del cambio.
  • Define “condiciones de parada”: cualquier MCE nuevo, aumento de tasas EDAC CE, throttling térmico durante carga en estado estable o reseteos inexplicables.

Preguntas frecuentes

1) Si el socket de la placa coincide, ¿por qué no puedo asumir que funcionará?

Porque el ajuste de socket es compatibilidad física. La compatibilidad operativa requiere soporte de firmware, microcódigo estable, entrega de potencia correcta y entrenamiento de memoria validado para ese stepping de CPU.

2) ¿Debo actualizar el BIOS antes o después de instalar la nueva CPU?

Antes, cuando sea posible. Actualiza el BIOS con la CPU antigua, verifica estabilidad y luego intercambia las CPUs. Reduce variables y evita la trampa de “no puedo arrancar para flashear”.

3) ¿Es suficiente el microcódigo entregado por el SO o también necesito una actualización de BIOS?

A menudo necesitas ambos. Las actualizaciones de BIOS pueden incluir código de inicialización de CPU, correcciones de entrenamiento de memoria y ajustes de plataforma que el SO no puede reemplazar. El microcódigo del SO por sí solo no arreglará todo lo que controla un BIOS.

4) ¿Pueden las actualizaciones de microcódigo reducir el rendimiento?

Sí, dependiendo de mitigaciones y soluciones de erratas. El enfoque correcto es medir y decidir conscientemente, no pretender que no pueda pasar.

5) ¿Cómo sé si los límites de VRM son el problema?

Mira reinicios bajo carga sostenida, throttling por potencia/térmico y un patrón donde las pruebas cortas pasan pero las pruebas largas fallan. En algunas plataformas puedes observar eventos de throttling y correlacionarlos con temperaturas y límites de potencia.

6) ¿Por qué difiere el comportamiento de potencia “auto” entre placas?

Porque los proveedores afinan “auto” para metas distintas: ganar benchmarks, objetivos acústicos, márgenes térmicos o estabilidad conservadora empresarial. “Auto” no es un estándar; es una personalidad.

7) ¿Cuál es la forma más segura de desplegar actualizaciones de CPU en un clúster?

Estandariza firmware primero, canaría un host, ejecuta pruebas de estrés + carga representativa, y luego despliega gradualmente mientras monitorizas contadores de errores de hardware y distribuciones de rendimiento.

8) ¿Debo preocuparme por la velocidad de memoria después de una actualización de CPU?

Sí. El controlador de memoria del CPU y el código de entrenamiento del BIOS interactúan. Un nuevo stepping de CPU o un BIOS nuevo puede cambiar lo que es estable con una población dada de DIMMs. Valida la velocidad configurada y vigila EDAC.

9) ¿Puede una actualización de CPU romper la migración en vivo de virtualización?

Absolutamente. Pueden aparecer nuevas funciones de CPU, y los hipervisores pueden rechazar migraciones entre conjuntos de funciones no coincidentes. Usa líneas base/enmascaramiento de CPU y mantén clústeres consistentes.

10) ¿Cuándo debo dejar de depurar y simplemente revertir?

Si ves nuevos errores de hardware corregidos, throttling térmico bajo carga normal o reseteos inexplicables. Revertir, re-baselinear y re-enfocar con variables controladas.

Siguientes pasos que te mantienen empleado

Las actualizaciones de CPU no son “intercambiar y listo”. Trátalas como un cambio de plataforma, porque lo son. Aquí está el camino práctico a seguir:

  1. Define tu resultado objetivo: rendimiento sostenido y estabilidad vencen a los números de boost pico. Escríbelo en la solicitud de cambio.
  2. Estandariza firmware y microcódigo: decide tus líneas base y elimina drift. Inventario no es opcional.
  3. Haz explícita la política de potencia: establece límites de potencia y política de refrigeración a un sobre conocido bueno. No dejes que “auto” defina tu SLO.
  4. Usa canarios y condiciones de parada: un host no prueba nada; un host que falla te dice mucho. Revertir temprano y sin vergüenza.
  5. Instrumenta lo que importa: MCE/EDAC/AER, eventos de throttling, distribución de frecuencia bajo carga y temperaturas. Si no puedes verlo, no puedes operarlo.

Si haces esas cinco cosas, la actualización de CPU deja de ser una apuesta y se convierte en un cambio que puedes defender—técnica, operativa y delante de una sala llena de colegas escépticos.

]]>
https://cr0x.net/es/trampa-actualizacion-cpu-bios-microcodigo-vrm/feed/ 0
Intel VT-d vs AMD-Vi: ¿Cuál ofrece realmente mejor passthrough? https://cr0x.net/es/intel-vtd-amd-vi-mejor-passthrough/ https://cr0x.net/es/intel-vtd-amd-vi-mejor-passthrough/#respond Wed, 18 Feb 2026 01:46:13 +0000 https://cr0x.net/?p=34110 El passthrough PCIe es una característica que en una diapositiva parece determinista y en producción se comporta como el tiempo.
Un día tu VM con GPU es una ciudadana ejemplar; al siguiente se queda en pantalla negra al reiniciarla y tu ventana de mantenimiento se convierte en una sesión grupal de terapia.

La pregunta “¿Es Intel VT-d mejor que AMD-Vi?” suele surgir justo después de comprar hardware y justo antes de arrepentirse de al menos una configuración del BIOS.
La respuesta real tiene menos que ver con logos y más con comportamientos específicos de la plataforma: agrupamiento IOMMU, remapeo de interrupciones, calidad del firmware y cuánto necesitas un aislamiento limpio de dispositivos.

Qué significa realmente “mejor passthrough”

“Mejor passthrough” no es una única métrica. En producción te importan cuatro cosas, en este orden aproximado:

  1. Corrección del aislamiento: el dispositivo está en su propio grupo IOMMU, el DMA está contenido y los resets se comportan.
  2. Estabilidad operativa: reinicios, migraciones en vivo (donde aplique), recargas de controladores y actualizaciones del kernel no se convierten en tickets de incidentes.
  3. Consistencia del rendimiento: baja fluctuación bajo carga y latencia predecible, especialmente para NVMe, NICs y GPUs.
  4. Gestionabilidad: buena visibilidad con herramientas, logs sensatos y menos “flags especiales de arranque” que se convierten en conocimiento tribal.

Si estás montando un laboratorio casero, puedes tolerar hacks como ACS override y “simplemente no reinicies la VM dos veces seguidas”.
Si lo haces para un negocio—especialmente con cargas reguladas—tu “solución de passthrough” es un sistema, no una casilla marcada.

VT-d vs AMD-Vi: resumen con opinión

Tanto Intel VT-d como AMD-Vi (la IOMMU de AMD) pueden ofrecer un excelente passthrough. Las mayores diferencias que notarás no son teóricas.
Son detalles de implementación de la plataforma: firmware de la placa base, topología PCIe, agrupamiento IOMMU y si el remapeo de interrupciones está sólido.

Mi recomendación por defecto

  • Si necesitas passthrough de grado empresarial y aburrido (NICs SR-IOV, HBAs, NVMe, GPUs en flota): elige la plataforma con el mejor historial de placa + BIOS, no el proveedor del CPU.
    En la práctica, eso suele significar plataformas Intel en servidores certificados por fabricantes, y plataformas AMD en servidores EPYC modernos con firmware maduro.
  • Si compras equipo de consumo: los sistemas AMD suelen ofrecer más núcleos por dólar, pero también mayor variabilidad en el agrupamiento IOMMU según chipset y enrutamiento de la placa.
    Las placas Intel de consumo pueden ser más predecibles, aunque aún encontrarás el ocasional “grupo de puerto raíz compartido”.
  • Si dependes de grupos IOMMU limpios y no puedes tolerar ACS override: prioriza plataformas que expongan más puertos raíz PCIe y un aislamiento descendente más limpio.
    Eso tiene menos que ver con “Intel vs AMD” y más con “esta placa y generación de CPU específicas”.

Aquí va la versión franca: el mejor passthrough es el passthrough que puedes reiniciar.
Si no puedes reiniciar en frío el host, reiniciar el guest y volver a adjuntar el dispositivo repetidamente sin rarezas, no tienes una solución—tienes una demo.

Cómo funciona realmente el passthrough IOMMU (y dónde falla)

El passthrough es un contrato de tres partes:

  • El dispositivo hace DMA y genera interrupciones.
  • La IOMMU traduce las direcciones DMA del dispositivo mediante tablas de páginas, restringiendo qué memoria física puede tocar el dispositivo.
  • El hipervisor (KVM/QEMU vía VFIO en Linux, o un hipervisor tipo 1) vincula el dispositivo a un guest y programa los mapeos de la IOMMU.

Cuando funciona, tu guest puede manejar el dispositivo casi como si fuera bare metal, pero el host mantiene límites de seguridad DMA.
Cuando no funciona, los modos de fallo son… educativos:

  • Mal agrupamiento: tu GPU y tu controlador USB comparten un grupo IOMMU; no puedes pasar uno sin el otro de forma segura.
  • Fallo de reset: el guest se apaga, el dispositivo no se reinicia correctamente y el siguiente arranque se queda atascado en “Starting bootloader…” o en pantalla negra.
  • Problemas de interrupciones: la entrega de MSI/MSI-X se vuelve rara; el rendimiento cae o la latencia se dispara; algunos dispositivos solo funcionan con ciertos parámetros de kernel.
  • Fallos de página: aparecen fallos de IOMMU en dmesg; el driver del guest está bien, pero los mapeos o comportamientos ATS/PRI no coinciden con lo esperado.

Además: el passthrough es un problema de topología.
Dos CPUs idénticas con placas base diferentes pueden comportarse como especies distintas, porque el diseño PCIe determina qué dispositivos están detrás de qué puertos raíz y bridges,
y eso determina agrupamientos y dominios de reset.

Broma #1: El passthrough PCIe es sencillo—hasta que lo intentas.

Hechos interesantes y contexto histórico (la versión corta y útil)

Estos no son datos para la noche de trivialidades. Explican por qué existen ciertos errores y peculiaridades de plataforma.

  1. VT-d llegó después de VT-x: la virtualización de CPU (VT-x) no fue suficiente para un DMA seguro, así que VT-d rellenó la laguna para I/O dirigido.
  2. AMD-Vi aparece como “IOMMU” en los logs de Linux: Linux a menudo informa la implementación de AMD bajo el nombre genérico IOMMU, y verás “AMD-Vi” en dmesg en muchos sistemas.
  3. El remapeo de interrupciones es una característica de fiabilidad: no es solo rendimiento—sin ello, puedes verte forzado a modos de interrupción menos seguros o funcionales.
  4. ACS es una característica de PCIe, no de la IOMMU: Access Control Services puede ayudar a hacer cumplir el aislamiento entre puertos descendentes; la ausencia de ACS suele provocar agrupamientos feos.
  5. “ACS override” es una solución en Linux: puede dividir los grupos IOMMU fingiendo que existe aislamiento ACS. A veces está bien; otras veces es una autogol.
  6. SR-IOV hizo a la IOMMU algo mainstream: cuando las NICs empezaron a presentar múltiples funciones virtuales, la corrección de la IOMMU dejó de ser nicho y pasó a ser imprescindible en centros de datos.
  7. DMAR es la tabla ACPI de Intel para IOMMU: si las tablas DMAR están mal, VT-d puede estar “habilitado” pero ser efectivamente poco fiable.
  8. AMD IOMMU usa tablas IVRS: de forma similar, entradas IVRS defectuosas pueden llevar a dispositivos faltantes, mapeos rotos o una topología de grupos confusa.
  9. El dolor del reset de GPU es en parte histórico: muchas GPUs nunca fueron diseñadas para resets frecuentes a nivel de función en entornos virtualizados, así que heredas supuestos de hardware del mundo bare-metal.

Diferencias de plataforma que cambian resultados

1) Calidad de los grupos IOMMU: el hacedor silencioso de reyes

Tu mejor caso: cada dispositivo que quieras pasar está solo en su grupo IOMMU (o comparte solo con funciones inofensivas del mismo dispositivo, como el audio de la GPU).
El peor caso: la mitad de la placa base es un solo grupo porque el firmware expone una topología grosera o los switches PCIe no soportan ACS.

Intel vs AMD aquí no es un concurso moral. Es sobre la combinación de:
complejos raíz PCIe integrados en el CPU, carriles del chipset, switches/retimers PCIe a bordo y el enrutamiento de la placa.
Las placas de servidor tienden a ser más limpias que las de consumo. Las placas de estación de trabajo pueden ser un paraíso o un carnaval.

2) Remapeo de interrupciones: la diferencia entre “bien” y “¿por qué la latencia es variable?”

Con passthrough quieres que las interrupciones MSI/MSI-X se entreguen limpiamente al guest. El remapeo de interrupciones ayuda a mantener eso coherente y seguro.
Sin él, puedes ver advertencias en dmesg, retrocesos o restricciones. Cuando la gente describe “jitter” en dispositivos passthrough, las interrupciones a menudo están involucradas.

3) ATS/PRI y afines: cuando los dispositivos se vuelven listos

Algunos dispositivos pueden participar activamente en la traducción de direcciones (ATS) o solicitar páginas (PRI). En teoría, esto mejora el rendimiento.
En la práctica, amplía la superficie para peculiaridades de plataforma. Si persigues fallos raros de IOMMU bajo carga, estas características pueden ser relevantes.
No necesitas memorizar acrónimos; necesitas reconocer patrones y saber dónde mirar.

4) Dominios de reset y soporte FLR

Function Level Reset (FLR) facilita mucho la gestión del ciclo de vida del passthrough.
Si tu dispositivo no puede reiniciarse limpiamente, obtendrás el síntoma clásico: el primer arranque funciona, el segundo falla hasta reiniciar el host.
Esto afecta tanto a sistemas Intel como AMD porque a menudo es limitación del dispositivo, no de la IOMMU.

5) Madurez del firmware: el BIOS es parte de tu hipervisor

En el papel, VT-d y AMD-Vi son tecnologías maduras. En realidad, la calidad del firmware varía desde “sólida” hasta “alguien lo envió un viernes”.
Una placa puede anunciar soporte IOMMU y aun así tener tablas IVRS/DMAR rotas o valores por defecto cuestionables.
Actualiza el BIOS temprano y trata las notas de la versión como retrospectivas de incidentes—porque eso es lo que son.

Rendimiento: dónde se esconde la sobrecarga

Con passthrough, el rendimiento bruto suele estar cerca del bare metal. Los asesinos son:

  • Latencia y jitter por manejo de interrupciones, planificación y desajustes NUMA.
  • Coste de mapeo DMA cuando la memoria del guest está fragmentada o la carga churnea mapeos.
  • Ubicación NUMA incorrecta: pasar un dispositivo conectado al nodo NUMA 1 a un guest fijado al nodo 0 es una caída lenta.
  • Hugepages vs no: las hugepages reducen la presión de TLB y pueden disminuir la sobrecarga de mapeo para algunas cargas.

Si comparas Intel y AMD puramente por “rendimiento de passthrough”, probablemente estás midiendo lo incorrecto.
El diferenciador real es cuán fácil es hacer que el sistema sea estable y predecible bajo tu carga y patrones de reinicio.

Seguridad y fiabilidad: lo que obtienes cuando está correcto

La IOMMU es un límite de seguridad. Sin ella, un dispositivo con capacidad DMA puede leer/escribir la memoria del host directamente.
Con ella, el dispositivo queda restringido a un mapeo definido por el kernel/hipervisor del host.

Eso importa para:

  • Anfitriones multi-tenant (incluso “tenants” dentro de la misma empresa).
  • Controladores no confiables en guests (especialmente stacks de GPU y aceleradores nicho).
  • Contención de mal comportamiento del dispositivo (bugs de firmware, DMA perezoso, etc.).

Un encuadre útil de fiabilidad: el passthrough es seguro cuando tu IOMMU es estricta, tu agrupamiento es limpio y los resets del ciclo de vida son correctos.
Pierde cualquiera de esos, y pasarás el tiempo inventando rituales en vez de ejecutar servicios.

Una cita para mantenerte honesto: La esperanza no es una estrategia. — Rick Pitino

Tareas prácticas: comandos, salidas y decisiones (12+)

Estas son centradas en Linux, porque es donde vive la mayoría del passthrough VFIO/KVM y donde depurarás a las 02:00.
Los comandos son ejecutables en distribuciones modernas; ajusta nombres de paquetes según tu entorno.

Tarea 1: Confirma la CPU y las banderas de virtualización

cr0x@server:~$ lscpu | egrep -i 'Vendor ID|Model name|Virtualization|Flags'
Vendor ID:             GenuineIntel
Model name:            Intel(R) Xeon(R) CPU
Virtualization:        VT-x
Flags:                 ... vmx ...

Qué significa: “Virtualization: VT-x” (Intel) o “AMD-V” (AMD) te dice que la virtualización de CPU existe. No prueba que la IOMMU esté habilitada.

Decisión: Si la virtualización no está presente, detente. No vas a hacer passthrough en ese host de forma sensata.

Tarea 2: Confirma que la IOMMU está habilitada en el kernel (Intel VT-d)

cr0x@server:~$ dmesg | egrep -i 'DMAR|IOMMU|VT-d' | head -n 30
[    0.612345] DMAR: IOMMU enabled
[    0.612678] DMAR: Host address width 46
[    0.613210] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[    0.615432] DMAR: Interrupt remapping enabled

Qué significa: “DMAR: IOMMU enabled” es la línea clave. “Interrupt remapping enabled” es un fuerte indicio de que tendrás menos casos raros de interrupciones.

Decisión: Si no ves líneas DMAR, revisa ajustes del BIOS y parámetros del kernel (tareas posteriores). No depures VFIO hasta que esto esté correcto.

Tarea 3: Confirma que la IOMMU está habilitada en el kernel (AMD-Vi)

cr0x@server:~$ dmesg | egrep -i 'AMD-Vi|IOMMU|IVRS' | head -n 40
[    0.501234] AMD-Vi: IOMMU performance counters supported
[    0.501567] AMD-Vi: Lazy IO/TLB flushing enabled
[    0.504321] ivrs: IOAPIC[4] not in IVRS table

Qué significa: Las líneas AMD-Vi indican que el driver de IOMMU de AMD está activo. Las advertencias IVRS pueden ser inofensivas o un olor a firmware según la gravedad.

Decisión: Si los logs muestran repetidas quejas IVRS/IOAPIC y el passthrough es inestable, actualiza el BIOS y considera otra placa antes de perder una semana.

Tarea 4: Verifica la línea de comandos del kernel (intel_iommu / amd_iommu)

cr0x@server:~$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-6.8.0 root=/dev/mapper/vg0-root ro quiet intel_iommu=on iommu=pt

Qué significa: intel_iommu=on (o amd_iommu=on) habilita la IOMMU. iommu=pt pone dispositivos del host en modo pass-through para menor sobrecarga manteniendo traducción para guests.

Decisión: Para hosts de virtualización, iommu=pt suele ser un buen valor por defecto. Si depuras aislamiento de dispositivos o fallos, puedes quitarlo temporalmente para comparar comportamiento.

Tarea 5: Confirma grupos IOMMU y detecta “compartición mala”

cr0x@server:~$ find /sys/kernel/iommu_groups/ -maxdepth 2 -type l | sed 's#.*/##' | sort | head
0000:00:01.0
0000:00:14.0
0000:00:14.2
0000:01:00.0
0000:01:00.1

Qué significa: Esto lista dispositivos en grupos IOMMU. Necesitas inspeccionar a qué grupo pertenece cada dispositivo y si tu dispositivo objetivo está aislado.

Decisión: Si tu GPU/NVMe/NIC objetivo comparte grupo con dispositivos no relacionados que no puedes pasar también, o cambias de ranura, cambias placa, o aceptas el riesgo del ACS override.

Tarea 6: Imprime grupos con nombres legibles

cr0x@server:~$ for g in /sys/kernel/iommu_groups/*; do echo "Group ${g##*/}"; for d in $g/devices/*; do lspci -nns ${d##*/}; done; echo; done | sed -n '1,40p'
Group 0
00:00.0 Host bridge [0600]: Intel Corporation Device [8086:1234] (rev 02)

Group 1
00:01.0 PCI bridge [0604]: Intel Corporation Device [8086:5678] (rev 02)
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:2684] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:22ba] (rev a1)

Qué significa: Buscas “solo las funciones de la GPU” en un grupo, no la GPU más SATA más USB más un bridge aleatorio con amigos.

Decisión: Agrupamiento limpio? Procede con VFIO. Agrupamiento desordenado? Considera otra ranura PCIe (a menudo cambia el puerto raíz), o una placa diferente.

Tarea 7: Comprueba si tu dispositivo soporta señales de reset (FLR)

cr0x@server:~$ lspci -s 01:00.0 -vv | egrep -i 'Capabilities:|FLR|Reset' -n | head -n 20
45:Capabilities: [1b0] Vendor Specific Information: ID=0001 Rev=1 Len=024
78:Capabilities: [1e0] Device Serial Number 00-00-00-00-00-00-00-00
92:Capabilities: [250] Latency Tolerance Reporting
110:Capabilities: [300] Secondary PCI Express
132:Capabilities: [400] Physical Resizable BAR
160:Capabilities: [420] Data Link Feature

Qué significa: No todos los dispositivos anuncian claramente FLR en un grep obvio. Algunos mostrarán “Function Level Reset” explícitamente; otros no.

Decisión: Si tu GPU muestra mal comportamiento de reset en la práctica, planifica mitigaciones: módulos de reset por proveedor (cuando aplique), evitar patrones de reinicio en caliente o seleccionar un modelo de GPU conocido por reiniciarse bien.

Tarea 8: Identifica el driver actualmente ligado a un dispositivo PCI

cr0x@server:~$ lspci -k -s 01:00.0
01:00.0 VGA compatible controller: NVIDIA Corporation Device 2684 (rev a1)
	Subsystem: Micro-Star International Co., Ltd. [MSI] Device 5110
	Kernel driver in use: nvidia
	Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia

Qué significa: Si “Kernel driver in use” es el driver del proveedor, no lo has entregado aún a VFIO.

Decisión: Para passthrough, vincúlalo a vfio-pci en el host y mantén la gráfica del host en otra tarjeta (iGPU o GPU separada).

Tarea 9: Vincular un dispositivo a vfio-pci (persistente vía configuración modprobe)

cr0x@server:~$ sudo tee /etc/modprobe.d/vfio.conf >/dev/null <<'EOF'
options vfio-pci ids=10de:2684,10de:22ba disable_vga=1
EOF
cr0x@server:~$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.8.0

Qué significa: Estás diciendo al host que vincule esos IDs PCI a vfio-pci temprano en el arranque. La actualización del initramfs asegura que surta efecto.

Decisión: Si dependes de la GPU para la consola del host, no hagas esto. Usa una iGPU o serial/IPMI. De lo contrario te bloquearás de forma definitiva.

Tarea 10: Confirma el enlace vfio-pci después del reinicio

cr0x@server:~$ lspci -k -s 01:00.0
01:00.0 VGA compatible controller: NVIDIA Corporation Device 2684 (rev a1)
	Subsystem: Micro-Star International Co., Ltd. [MSI] Device 5110
	Kernel driver in use: vfio-pci
	Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia

Qué significa: “Kernel driver in use: vfio-pci” es lo que quieres. “Kernel modules” puede seguir listando módulos del proveedor; eso está bien.

Decisión: Si no está vinculado, revisa initramfs, pon en la lista negra drivers conflictivos y confirma la política de Secure Boot si interfiere con la carga de módulos en tu entorno.

Tarea 11: Busca fallos de IOMMU y errores de remapeo DMA

cr0x@server:~$ sudo dmesg -T | egrep -i 'DMAR|IOMMU|fault|vfio|remapping' | tail -n 30
[Tue Feb  4 01:12:11 2026] vfio-pci 0000:01:00.0: enabling device (0000 -> 0003)
[Tue Feb  4 01:13:09 2026] DMAR: [DMA Read] Request device [01:00.0] fault addr 0x7f2b0000 [fault reason 05] PTE Read access is not set

Qué significa: Los fallos DMA indican problemas de mapeo o comportamiento del dispositivo que viola los mapeos actuales. A veces es un driver de guest mal configurado; otras veces son peculiaridades de la plataforma.

Decisión: Si los fallos se correlacionan con crashes del guest o bloqueos del dispositivo, prioriza estabilidad sobre ajustes. Revisa el aislamiento de grupos, la versión del kernel y considera deshabilitar características avanzadas (como ATS) si tu plataforma lo permite.

Tarea 12: Confirma hugepages (higiene de latencia para guests)

cr0x@server:~$ grep -i huge /proc/meminfo | head
AnonHugePages:    1048576 kB
HugePages_Total:      256
HugePages_Free:       200
HugePages_Rsvd:        10
Hugepagesize:       2048 kB

Qué significa: Esto muestra si hay hugepages explícitas provisionadas. Muchas cargas sensibles a latencia con passthrough funcionan mejor con backing de memoria predecible.

Decisión: Si ves micro-tartamudeos bajo carga en una VM GPU o VM de procesamiento de paquetes, las hugepages son una palanca razonable—tras haber arreglado agrupamiento IOMMU y colocación NUMA.

Tarea 13: Comprueba la localidad NUMA de un dispositivo pasado

cr0x@server:~$ cat /sys/bus/pci/devices/0000:01:00.0/numa_node
1

Qué significa: El dispositivo reside en el nodo NUMA 1. Si los vCPUs y la memoria de tu VM están en el nodo 0, pagarás una penalización cross-socket.

Decisión: Fija los vCPUs y la memoria de la VM al nodo NUMA del dispositivo cuando sea posible. Si no puedes, reconsidera en qué ranura está el dispositivo (algunas ranuras mapean a raíces de CPU diferentes).

Tarea 14: Inspecciona la topología PCIe para entender causas de agrupamiento

cr0x@server:~$ lspci -t
-[0000:00]-+-00.0
           +-01.0-[01]----00.0
           +-14.0
           \-1c.0-[02]----00.0-[03]----00.0

Qué significa: Esto muestra el árbol de bridges. Los dispositivos detrás del mismo bridge descendente a menudo caen en el mismo grupo IOMMU a menos que ACS esté disponible y habilitado.

Decisión: Si tu GPU comparte bridge con dispositivos críticos del host, muévela a una ranura conectada a un puerto raíz distinto, o te quedarás negociando con la física.

Tarea 15: Verifica que VFIO está cargado y qué módulos están activos

cr0x@server:~$ lsmod | egrep 'vfio|kvm' | head
vfio_pci               65536  0
vfio_pci_core          90112  1 vfio_pci
vfio_iommu_type1       45056  0
vfio                   45056  2 vfio_pci_core,vfio_iommu_type1
kvm_intel             409600  0

Qué significa: VFIO core y type1 IOMMU están cargados. Si faltan, tu host no está listo para passthrough incluso si el BIOS está configurado.

Decisión: Carga los módulos, arregla initramfs y confirma que tu kernel tiene soporte VFIO. No intentes configuraciones de guest hasta que la base del host esté estable.

Tarea 16: Comprueba si el kernel usa remapeo de interrupciones

cr0x@server:~$ dmesg | egrep -i 'interrupt remapping|IR:' | head
[    0.615432] DMAR: Interrupt remapping enabled

Qué significa: En Intel esto es explícito. En AMD puedes ver una redacción distinta. De cualquier manera, buscas indicios de que el manejo moderno de interrupciones está habilitado.

Decisión: Si el remapeo de interrupciones está deshabilitado y ves inestabilidad o advertencias de seguridad, considera toggles del BIOS relacionados con VT-d/IOMMU de AMD y remapeo de interrupciones, y vuelve a probar.

Guion rápido de diagnóstico

Cuando el passthrough está roto, no empiezas reescribiendo tu configuración QEMU. Empiezas demostrando que la plataforma es capaz de estar correcta.
Aquí está el flujo “encontrar el cuello de botella rápido” que uso.

Primero: ¿La IOMMU está realmente activada y sensata?

  • Revisa /proc/cmdline por intel_iommu=on o amd_iommu=on.
  • Revisa dmesg por “IOMMU enabled” y cualquier queja de tablas DMAR/IVRS.
  • Confirma que los módulos VFIO se cargan.

Segundo: ¿Son aceptables los grupos IOMMU?

  • Enumera grupos en /sys/kernel/iommu_groups.
  • Verifica que tu dispositivo objetivo esté aislado o solo agrupado con sus propias funciones.
  • Si no lo está: cambia de ranura, deshabilita dispositivos a bordo no usados o acepta que la placa no sirve para este requisito.

Tercero: ¿Es esto una rareza de reset/firmware y no “tuning de VFIO”?

  • ¿El primer arranque del VM funciona pero los posteriores fallan? Huele a problemas de reset/FLR.
  • ¿Necesitas un reboot del host para recuperar el dispositivo? Eso es dolor de dominio de reset.
  • Actualiza BIOS. Luego actualiza kernel. Luego retesta. No cambies doce variables a la vez.

Cuarto: ¿Es NUMA/latencia de interrupciones que se disfraza de “passthrough lento”?

  • Revisa el nodo NUMA del dispositivo y alinea el pinning de la VM en consecuencia.
  • Mira el estado del remapeo de interrupciones y problemas MSI/MSI-X en los logs.
  • Sólo después: considera hugepages, aislamiento de CPU del host y ajuste del scheduler.

Broma #2: La IOMMU no “se rompió aleatoriamente.” Esperó hasta que estabas confiado.

Errores comunes: síntoma → causa raíz → arreglo

1) “VFIO funciona una vez, luego pantalla negra en segundo arranque”

Síntoma: El guest arranca y usa la GPU una vez. Tras apagar/reiniciar, la GPU nunca se inicializa de nuevo hasta reiniciar el host.

Causa raíz: El dispositivo no soporta un FLR limpio o el reset no se propaga a través del bridge; común con algunas GPUs de consumo.

Arreglo: Prefiere GPUs conocidas por resets amigables con virtualización; prueba otra ranura (cambia dominio de reset); actualiza BIOS; considera un módulo de workaround de reset si aplica; evita bucles de reinicio rápidos.

2) “El dispositivo está en un grupo IOMMU gigante con SATA/USB; no puedo pasarlo con seguridad”

Síntoma: Tu GPU comparte un grupo IOMMU con el controlador SATA del chipset y el controlador USB.

Causa raíz: No hay aislamiento ACS en el camino descendente relevante; la placa enruta múltiples funciones detrás de un bridge; el firmware expone un agrupamiento grosero.

Arreglo: Mueve la tarjeta a una ranura enraizada en el CPU; deshabilita dispositivos a bordo no usados; elige otra placa con mejor aislamiento PCIe. Usa ACS override solo si aceptas el trade-off de seguridad y estabilidad.

3) “Alto throughput pero latencia/jitter horrible”

Síntoma: Benchmarks NVMe van bien, pero la latencia de la aplicación se dispara; tiempos de frame de GPU irregulares; procesamiento de paquetes NIC entrecortado.

Causa raíz: Desajuste NUMA, problemas de manejo de interrupciones, contención en el host, falta de hugepages.

Arreglo: Alinea vCPU y memoria del guest con el nodo NUMA del dispositivo; asegura remapeo de interrupciones y que MSI/MSI-X funcionen; aisla CPUs del host para guests sensibles; usa hugepages para el guest.

4) “IOMMU está habilitada pero no aparecen grupos”

Síntoma: dmesg menciona IOMMU, pero /sys/kernel/iommu_groups está vacío o falta.

Causa raíz: Kernel arrancó sin parámetros de IOMMU; virtualización deshabilitada en BIOS; o hay un desajuste de modo kernel/boot (raro, pero ocurre).

Arreglo: Verifica toggles del BIOS (VT-d/IOMMU de AMD); verifica /proc/cmdline; actualiza kernel; asegúrate de no estar ejecutando un kernel recortado.

5) “Fallos de IOMMU bajo carga”

Síntoma: Aparecen fallos DMAR/AMD-Vi en dmesg durante I/O intenso; el guest se congela o el dispositivo cae.

Causa raíz: Bugs de firmware de plataforma, enlace PCIe inestable o interacción desafortunada de características avanzadas de traducción.

Arreglo: Actualiza BIOS y kernel; asienta la tarjeta; reduce la velocidad del enlace PCIe como prueba; verifica la entrega de energía; considera deshabilitar características avanzadas si tu stack provee toggles seguros. Si persiste, reemplaza la placa antes de normalizarla.

6) “El host pierde red o almacenamiento cuando arranco la VM”

Síntoma: Al iniciar una VM con passthrough, los servicios del host mueren.

Causa raíz: Pasaste el dispositivo equivocado (o el correcto que está en el mismo grupo que dispositivos críticos del host) porque se ignoró el agrupamiento.

Arreglo: Revisa los grupos IOMMU, vincula solo los IDs de dispositivo objetivo y mantiene los controladores críticos del host fuera de los grupos de passthrough. Si no puedes, el hardware no es apropiado para este diseño.

Tres micro-historias corporativas desde las trincheras

Micro-historia 1: El incidente causado por una suposición equivocada

Una compañía mediana quería passthrough de GPU para un puñado de estaciones de trabajo de anotación ML ejecutándose como VMs.
El plan parecía simple: un host por equipo, una GPU por VM, escalado fácil.
Compras adquirió un lote de máquinas “listas para virtualización” porque la hoja de especificaciones del CPU decía soporte VT-d o AMD-Vi.

La primera semana fue bien. La segunda semana, tras parches rutinarios, empezaron los tickets: pantallas negras tras reinicio de VM, desconexiones aleatorias de USB y un host que se negaba a arrancar una VM si un hub USB específico estaba enchufado.
El equipo supuso que era “un problema de drivers” y pasó días culpando a actualizaciones del OS del guest.

La falla real fue la topología: la GPU y el controlador USB estaban en el mismo grupo IOMMU en esa placa base.
El “arreglo” que aplicaron por accidente fue reiniciar el host frecuentemente, lo que temporalmente limpiaba el estado de reset y enmascaraba el problema.
Una vez correlacionaron las fallas con los grupos IOMMU, el patrón fue embarazosamente consistente.

Terminaron moviendo GPUs a ranuras diferentes donde fue posible y, para un subconjunto de hosts, reemplazando el modelo de placa por completo.
La lección no fue “Intel vs AMD.” La lección fue: una lista de características del CPU no garantiza passthrough. El producto es la placa.

Micro-historia 2: La optimización que salió mal

Otra organización ejecutaba una VM de appliance de almacenamiento virtualizada con un HBA pasado, más una NIC de alto rendimiento pasada para tráfico de replicación.
Perseguían unos puntos porcentuales de throughput y decidieron “optimizar” habilitando todas las características de rendimiento en BIOS: ajustes agresivos de energía, estados C más profundos y algunos knobs de rendimiento de IOMMU.

El throughput mejoró en un benchmark sintético. La latencia empeoró en producción.
Las ventanas de replicación empezaron a no cumplir sus objetivos y, peor aún: la VM de almacenamiento ocasionalmente registró timeouts de I/O bajo carga máxima.
Nada estaba completamente roto, lo que hizo más caro depurarlo porque parecía “la red comportándose raro”.

La causa raíz fue una combinación de gestión de energía e interacción de latencia de interrupciones con la NIC de passthrough.
Los vCPUs de la VM también estaban fijados en el nodo NUMA equivocado respecto a la NIC, así que cada interrupción era efectivamente una pequeña negociación cross-socket.
Habían optimizado la métrica equivocada y luego la desplegaron contra la única métrica que importa: la latencia vista por el usuario.

Revertir las “optimizaciones”, alinear el pinning NUMA y usar un perfil de energía conservador restauró la estabilidad.
La parte más divertida (en tono seco) fue que el sistema original estaba bien; su triunfo en el benchmark creó el incidente.

Micro-historia 3: La práctica aburrida pero correcta que salvó el día

Una firma financiera ejecutaba un clúster de hosts de virtualización con cargas mixtas, incluidas algunas VMs con NICs en passthrough para captura de paquetes especializada.
Al principio trataron los hosts de passthrough como mascotas—afinados a mano, configurados con cariño e imposibles de reproducir.
Eventualmente se cansaron de sorpresas y estandarizaron.

La “práctica aburrida” fue una lista de verificación preflight ejecutada en cada host nuevo y después de cada actualización de BIOS:
confirmar IOMMU activada, confirmar remapeo de interrupciones, volcar grupos IOMMU, snapshot de la topología PCIe y registrar parámetros del kernel conocidos como buenos.
Nada glamuroso. Solo disciplina.

Luego una actualización de BIOS del proveedor cambió silenciosamente el orden de enumeración PCIe en un subconjunto de máquinas.
Sin el preflight lo habrían descubierto durante una ventana de mantenimiento en producción cuando dispositivos se adjuntaron a diferentes grupos y las antiguas vinculaciones VFIO tomaron el controlador equivocado.
Con el preflight lo detectaron en staging, ajustaron bindings y despacharon sin drama.

Su sistema no se volvió más rápido. Se volvió predecible. En operaciones, eso suele ser la mejor ganancia.

Listas de verificación / plan paso a paso

Paso a paso: seleccionar hardware para passthrough (para no comprar arrepentimientos)

  1. Empieza por el modelo de placa base, no por el CPU. Verifica si la gente reporta grupos IOMMU limpios para los dispositivos y ranuras que planeas usar.
  2. Prefiere ranuras PCIe enraizadas en la CPU para dispositivos de passthrough (GPU, adaptador NVMe, NIC). Las ranuras enraizadas en el chipset suelen agruparse más agresivamente.
  3. Evita plataformas que requieran ACS override para un aislamiento básico. Si debes usarlo, documenta explícitamente la aceptación del riesgo.
  4. Planifica acceso a la consola del host: iGPU, BMC/IPMI o serial. No dependas de la GPU pasada para acceso al host.
  5. Presupuesta actualizaciones de firmware: elige proveedores con historial de mantenimiento de BIOS para estabilidad, no solo microcódigo de CPU.

Paso a paso: línea base de configuración del host (Linux + KVM/VFIO)

  1. Habilita VT-d/IOMMU de AMD en BIOS/UEFI. También habilita cualquier ajuste llamado “interrupt remapping” si está presente.
  2. Arranca con intel_iommu=on iommu=pt o amd_iommu=on iommu=pt.
  3. Confirma que dmesg muestre IOMMU habilitada y sin errores serios de tablas DMAR/IVRS.
  4. Confirma grupos IOMMU; verifica aislamiento del dispositivo objetivo.
  5. Vincula IDs del dispositivo objetivo a vfio-pci en initramfs.
  6. Fija CPU/memoria de la VM al nodo NUMA correcto si la latencia importa.
  7. Prueba el ciclo de vida: arranca VM, somete a carga, apaga, arranca otra vez. Repite hasta aburrirte. Aburrirse es la meta.

Paso a paso: decidir entre passthrough y dispositivos paravirtualizados

  1. Usa virtio cuando puedas (disco, red). Es más simple y a menudo “lo suficientemente rápido”.
  2. Usa passthrough cuando debas (funciones especiales de NIC, cómputo/gráficos GPU, drivers que requieren acceso a la función física, HBAs para appliances de almacenamiento).
  3. En caso de duda, evita pasar controladores críticos del host. Si pasas el único HBA que contiene el OS del host, estás a un error de una reinstalación remota.

Preguntas frecuentes

1) ¿Es Intel VT-d inherentemente más estable que AMD-Vi?

No inherentemente. La estabilidad depende sobre todo de la implementación de la plataforma: tablas de firmware (DMAR/IVRS), topología PCIe y comportamiento de reset del dispositivo.
En plataformas de servidor certificadas, ambos pueden ser muy estables. En placas de consumo, ambos pueden ser caóticos—solo que de maneras diferentes.

2) ¿Por qué mis grupos IOMMU son “peores” en una placa que en otra?

Porque el agrupamiento está influenciado por bridges PCIe, switches y la capacidad ACS a lo largo del camino.
Una placa que enruta múltiples ranuras detrás de un bridge descendente (sin ACS) pegará dispositivos en un mismo grupo.
Otra placa con más puertos raíz o mejor aislamiento ACS producirá grupos más limpios.

3) ¿Debería usar ACS override?

Sólo si entiendes el trade-off: puede hacer que los grupos parezcan aislados incluso cuando el hardware no aplica separación completa.
Para laboratorios caseros suele ser aceptable. Para entornos con requisitos de aislamiento más fuertes, es un riesgo que no deberías normalizar.

4) ¿Reduce iommu=pt el aislamiento del guest?

Normalmente hace que los mapeos DMA propios del host sean identidad/passthrough por rendimiento mientras sigue usando traducción para dispositivos asignados a guests.
Se usa comúnmente en hosts de virtualización. Si depuras o validas estrictitud, puedes probar sin él.

5) ¿Por qué falla el passthrough de GPU tras reiniciar una VM?

Normalmente por comportamiento de reset: la GPU no se reinicia limpiamente (sin FLR usable, o el reset no se propaga), quedando en un estado malo.
A veces también es interacción driver/firmware. La solución fiable es elegir hardware conocido por ser amigable en reset, más una topología correcta.

6) ¿SR-IOV es más fácil en plataformas Intel o AMD?

El éxito de SR-IOV depende mucho del modelo/firmware de la NIC, madurez del driver y corrección de la IOMMU.
Tanto Intel como AMD pueden ejecutar SR-IOV bien. La experiencia “más fácil” suele venir de NICs empresariales y placas de servidor con BIOS maduras.

7) ¿Cuál es la forma más rápida de saber si el passthrough será indoloro en un host?

Revisa grupos IOMMU y prueba ciclos de reinicio. Si el dispositivo está limpiamente aislado y puedes reiniciar el guest repetidamente sin reiniciar el host, estás en un 80% del camino.
El 20% restante es ajuste de rendimiento y manejo de casos límite.

8) ¿Importan las versiones del kernel para passthrough VT-d/AMD-Vi?

Sí. IOMMU, VFIO y quirks de PCIe reciben correcciones con el tiempo. Si persigues fallos raros o problemas de reset, kernels más nuevos pueden ayudar.
Simplemente actualiza de forma metódica: una variable a la vez, con plan de reversión.

9) ¿Es buena idea pasar un disco NVMe?

Puede ser excelente para rendimiento y para appliances de almacenamiento que quieren control directo.
Pero los NVMe pueden compartir grupos IOMMU con otros dispositivos del chipset en algunas placas, y debes evitar pasar cualquier cosa que el host necesite para arrancar.

10) ¿Debo elegir Intel o AMD para un build Proxmox/KVM con passthrough?

Elige la placa + plataforma que genere grupos limpios para tus dispositivos objetivo y que tenga buen soporte de firmware.
Si ya tienes el hardware, evalúalo con las tareas de inspección de grupos arriba antes de diseñar el servicio alrededor.

Pasos prácticos siguientes

Si estás decidiendo entre Intel VT-d y AMD-Vi para passthrough, no lo trates como una preferencia de marca.
Trátalo como un problema de cadena de suministro: escoge una plataforma donde la topología de la placa y la madurez del firmware coincidan con tus necesidades de aislamiento.

  • Para builds nuevos: preselecciona placas y luego verifica la calidad reportada de los grupos IOMMU para tus tipos de dispositivo y ranuras exactas.
  • Para hosts existentes: ejecuta las tareas de enumeración de grupos, confirma el remapeo de interrupciones y prueba ciclos de reinicio bajo carga.
  • Para despliegues en producción: estandariza una lista de verificación preflight, controla actualizaciones de BIOS y kernel, y documenta qué ranuras son “seguras para passthrough”.

La condición de victoria no es “máximo throughput.” Es “sin sorpresas al reiniciar.” Cuando logras eso, tanto VT-d como AMD-Vi se ven bastante bien.

]]>
https://cr0x.net/es/intel-vtd-amd-vi-mejor-passthrough/feed/ 0
Por qué Intel adoptó AMD64 (y por qué cambió todo) https://cr0x.net/es/por-que-intel-adopto-amd64/ https://cr0x.net/es/por-que-intel-adopto-amd64/#respond Mon, 02 Feb 2026 08:23:07 +0000 https://cr0x.net/por-que-intel-adopto-amd64/ Si alguna vez desplegaste “una simple actualización de CPU” y luego pasaste el fin de semana persiguiendo una fuga de memoria que solo se reproduce en la nueva flota,
ya lo sabes: las transiciones de arquitectura no solo cambian números de rendimiento. Cambian los modos de falla.

La adopción de AMD64 por parte de Intel no fue una historia optimista sobre estándares. Fue una historia de producción: compatibilidad de software, fricción en el despliegue,
y la brutal economía de lo que la gente realmente estaba dispuesta a ejecutar en sus centros de datos.

El problema que Intel intentaba resolver

A finales de los 90 y principios de los 2000, los “límites de 32 bits” dejaron de ser un tema teórico de ciencias de la computación y se convirtieron en una línea de factura.
La memoria se abarataba; los conjuntos de datos crecían; la virtualización y las grandes cachés en memoria se volvían normales.
El techo de 4 GiB de espacio de direcciones virtuales del x86 clásico no era solo molesto: era una barrera rígida que forzaba diseños feos:
fragmentación de procesos, contorsiones manuales con mmap, capas de caché “split brain” extrañas y bases de datos que trataban la memoria como un lujo escaso.

La apuesta estratégica de Intel fue Itanium (IA-64), una nueva arquitectura co-desarrollada con HP que tenía como objetivo reemplazar completamente x86.
Si te fijas bien, tenía sentido: x86 era desordenado, cargado de legado y difícil de empujar hacia adelante limpiamente.
IA-64 prometía un diseño moderno, un modelo de ejecución dirigido por compiladores (EPIC) y un futuro donde la industria podría dejar atrás los fantasmas de 16 bits.

El problema: la producción no califica por elegancia. La producción califica por “¿ejecuta mis cosas, rápido, hoy, con mi monitorización y mis drivers raros?”.
Las empresas tenían una cantidad absurda de software x86 y memoria operacional arraigada. Una ruptura limpia no era una ruptura limpia; era un impuesto de reescritura.

AMD vio una oportunidad distinta: mantener la compatibilidad x86, añadir capacidad de 64 bits y permitir que el mundo avanzara sin quemar el ecosistema de software.
Esa extensión se convirtió en AMD64 (también llamada x86-64).

La encrucijada: Itanium vs x86-64

Itanium: el “nuevo mundo” que pedía a todos moverse

IA-64 no era “x86 pero más grande”. Era una ISA diferente con suposiciones distintas.
La compatibilidad con x86 existía, pero nunca fue de esa clase que tranquiliza a un sysadmin.
Incluso cuando podías ejecutar código x86, a menudo no era competitivo con servidores x86 nativos—especialmente cuando los núcleos x86 mejoraron en ejecución fuera de orden y cachés.

IA-64 dependía mucho de los compiladores para programar instrucciones y extraer paralelismo. En el mundo real, los compiladores son buenos,
pero el mundo real es desordenado: ramas impredecibles, cargas de trabajo con muchos punteros y acantilados de rendimiento.
Podías obtener buenos resultados con software afinado, pero “software afinado” es corporativo para “mucho dinero y mucho tiempo”.

AMD64: el “mismo mundo, techo más alto” que las operaciones podían soportar

AMD64 extendió el conjunto de instrucciones x86 existente. Conservó la ejecución de 32 bits, añadió un modo de 64 bits y amplió los registros.
Lo crucial fue que permitió a los proveedores enviar sistemas que podían ejecutar sistemas operativos y aplicaciones de 32 bits existentes mientras habilitaban un camino hacia sistemas operativos y software de 64 bits.
Ese camino de migración no es sexy, pero es lo que gana.

Hay una razón por la que la industria ama la compatibilidad hacia atrás: reduce el radio de explosión.
Puedes escalonar las actualizaciones, mantener binarios antiguos en ejecución y revertir sin reescribir la mitad de la pila.
AMD64 dio al ecosistema un puente pragmático.

Broma #1: Itanium era el futuro—simplemente no el que aparecía en tu orden de compra.

La comprobación de la realidad para Intel

Intel no se despertó una mañana y decidió copiar a AMD por admiración.
Intel adoptó AMD64 porque clientes, proveedores de OS y desarrolladores de aplicaciones se estaban estandarizando en x86-64,
y Itanium no se estaba convirtiendo en el reemplazo universal que Intel necesitaba.

La implementación de Intel se comercializó primero como EM64T, luego más tarde como “Intel 64”.
Pero el titular es simple: Intel envío CPUs que ejecutaban código x86 de 64 bits compatible con AMD64 porque el mercado eligió la vía de la compatibilidad.

Qué cambió arquitectónicamente AMD64

La gente suele resumir AMD64 como “x86 pero de 64 bits.” Eso es cierto en la misma medida en que “un centro de datos es solo una habitación con ordenadores” es cierto.
Los detalles son donde viven las consecuencias operativas.

1) Más registros (y por qué importa en producción)

El x86 clásico de 32 bits tenía ocho registros de propósito general (EAX, EBX, …) y eran un cuello de botella constante.
AMD64 amplió a dieciséis registros de propósito general (RAX…R15) y los amplió a 64 bits.
Los compiladores de repente tuvieron aire para respirar: menos volcados a la pila, menos accesos a memoria y mejores convenciones de llamadas.

Para los SREs, esto se manifiesta como: la misma base de código, compilada para x86-64, a menudo usa menos instrucciones para el mantenimiento.
Eso significa menos CPU por solicitud en caminos calientes—hasta que aparecen nuevos cuellos de botella como fallos de caché o predicción de ramas,
que son más difíciles de “simplemente optimizar”.

2) Un ABI de syscalls más limpio y transiciones usuario/núcleo más rápidas

x86-64 estandarizó un mecanismo moderno de syscalls (SYSCALL/SYSRET en AMD64 y en implementaciones Intel compatibles).
Los sistemas de 32 bits históricamente usaban INT 0x80 o SYSENTER/SYSEXIT, con mucho equipaje histórico.

El ABI de syscalls también cambió: los argumentos se pasan principalmente en registros en lugar de en la pila.
El efecto práctico: las cargas de trabajo con muchas llamadas al sistema (red, sistema de archivos, gestión de procesos) obtuvieron un impulso de eficiencia medible.

3) Direccionamiento canónico y la realidad de “no todos los 64 bits se usan”

AMD64 introdujo direcciones virtuales de 64 bits, pero en la práctica solo se implementó un subconjunto de bits inicialmente (y aún hoy, no se usan los 64 completos).
Las direcciones son “canónicas”: los bits altos deben replicar un bit de signo, y las direcciones no canónicas provocan fallo.

Operativamente, el direccionamiento canónico reduce cierta rareza, pero también crea bordes afilados para errores:
truncamiento de punteros, errores de extensión de signo y uso accidental de bits altos que pueden hacer fallar procesos de maneras que solo ocurren en builds de 64 bits.

4) Nuevas estructuras de tablas de páginas y comportamiento del TLB

El paginado de 64 bits introdujo tablas de páginas multinivel (comúnmente 4 niveles en long mode; luego 5 niveles en sistemas más nuevos).
El comportamiento del TLB cambia. Las páginas enormes se vuelven más atractivas para la presión del TLB.

Esto importa porque “mi servicio está más lento tras migrar a 64 bits” a menudo no es sobre el conteo de instrucciones.
Es sobre la jerarquía de memoria: punteros más grandes aumentan el tamaño del footprint; más fallos de caché; más fallos de TLB; más walks de página.

5) Bit NX y un cambio en la postura de seguridad

El bit de “no ejecutar” (NX) se hizo omnipresente en esta era. No es exclusivo de AMD64, pero AMD lo impulsó en el mercado.
El resultado: mejores mitigaciones frente a exploits y una separación más estricta de páginas de código y datos.

Desde la perspectiva de operaciones: las funciones de endurecimiento de seguridad suelen aparecer primero como “¿por qué se colapsó mi JIT antiguo?” y solo después como “evitamos una catástrofe.”
Planea pruebas de compatibilidad, especialmente para runtimes antiguos o plugins propietarios.

6) Long mode: compatibilidad sin fingir que es lo mismo

x86-64 introdujo el “long mode” con submódos: modo de 64 bits y modo de compatibilidad (para ejecutar aplicaciones protegidas de 32 bits).
No es una batidora mágica; es un conjunto estructurado de entornos de ejecución.

Esa estructura es por lo que la transición funcionó: podías arrancar con kernels de 64 bits mientras aún soportabas userland de 32 bits donde era necesario,
y retirar gradualmente dependencias de 32 bits.

Por qué Intel “cedió”: pragmatismo, escala y el ecosistema

La adopción de AMD64 por Intel no se trató de superioridad técnica en abstracto. Se trató de ganar la guerra de plataformas que importaba:
la definida por desarrolladores, sistemas operativos, fabricantes OEM y el coste de migración.

Los ecosistemas se vuelven pegajosos. Ese es el punto.

Para cuando AMD64 ganaba tracción, el mundo del software ya había invertido masivamente en x86.
Toolchains, depuradores, perfiles de rendimiento, controladores de dispositivos, hipervisores y cadenas completas de compra asumían x86.
IA-64 requería un mundo paralelo: binarios diferentes, afinación diferente, runbooks operativos diferentes.

Los clientes empresariales son conservadores por buenas razones. Una nueva arquitectura no es solo “nuevas CPUs”.
Es nuevos comportamientos de firmware, nuevos casos límite, nuevas rutas de escalado con el proveedor y un nuevo conjunto de mitos de rendimiento.
AMD64 permitió al mundo mantener sus hábitos operativos mientras elevaba el techo de espacio de direcciones.

La compatibilidad no es nostalgia; es apalancamiento

Si puedes ejecutar aplicaciones existentes mientras te mueves gradualmente a 64 bits, reduces el riesgo de adopción.
El riesgo es lo que realmente compra el departamento de aprovisionamiento.
IA-64 pedía a los clientes apostar todo por compiladores futuros y ports de software futuros.
AMD64 ofreció un camino donde podías estar mayormente correcto de inmediato.

El rendimiento alcanzó “suficientemente bueno” antes

IA-64 podía rendir bien en ciertas cargas, especialmente cuando el software estaba diseñado y compilado para ella.
Pero las cargas de servidor de propósito general—bases de datos, servicios web, servidores de archivos—se beneficiaron de la mejora implacable de los núcleos x86,
las jerarquías de caché y los subsistemas de memoria.

Una vez que los sistemas x86-64 ofrecieron rendimiento 64-bit sólido sin abandonar la compatibilidad x86, el argumento a favor de IA-64 se volvió angosto:
“esta pila de nicho, afinada, podría ganar.” Eso no es cómo dominan las plataformas.

Intel 64: una concesión que normalizó el mundo

Que Intel enviara CPUs compatibles con AMD64 acabó con la incertidumbre. Los proveedores de OS pudieron tratar x86-64 como el objetivo estándar de servidores.
Los ISV pudieron distribuir una compilación primaria x86 de 64 bits sin preocuparse por qué CPU había dentro.
Los centros de datos pudieron estandarizar hardware sin cargar con dos toolchains de arquitectura diferentes.

En términos operativos: redujo la heterogeneidad. Menos heterogeneidad significa menos casos extraños a las 3 a.m.

Datos interesantes y contexto histórico

  • AMD64 debutó comercialmente en 2003 con Opteron y Athlon 64, haciendo de x86 de 64 bits una realidad en producción, no un demo de laboratorio.
  • El primer branding ampliamente reconocido de Intel compatible con AMD64 fue EM64T, luego renombrado a Intel 64.
  • IA-64 (Itanium) no fue una extensión de x86; fue una ISA distinta con una filosofía de ejecución diferente.
  • Windows y Linux se movieron decididamente a x86-64 una vez que AMD64 demostró ser viable; ese compromiso a nivel de OS consolidó el ecosistema.
  • x86-64 aumentó los registros de propósito general de 8 a 16, lo que mejoró materialmente la salida de los compiladores para cargas reales.
  • El ABI AMD64 pasa muchos argumentos de función en registros, reduciendo el tráfico de pila comparado con convenciones comunes de 32 bits.
  • No se usan todos los bits de dirección de 64 en implementaciones típicas; las “direcciones canónicas” requieren que los bits superiores estén extendidos por signo.
  • El bit NX se volvió mainstream en esta era, incorporando mitigaciones frente a exploits en despliegues de servidores por defecto.
  • El éxito de x86-64 hizo que la “portabilidad” fuera menos sobre ISA y más sobre límites de OS/contenedor, cambiando cómo los proveedores de software pensaban sobre la distribución.

Dónde afecta esto en producción hoy

Podrías pensar que esto es historia. No lo es. La victoria de AMD64 está integrada en casi toda decisión operacional que tomes hoy:
cómo dimensionas instancias, cómo interpretas el uso de memoria, cómo depuras el rendimiento y qué significa “compatible”.

Las dos grandes consecuencias en producción con las que la gente aún tropieza

Primera: los punteros de 64 bits inflan el uso de memoria. Tus estructuras de datos se hacen más grandes. Tus cachés se vuelven menos densos.
La tasa de aciertos en L3 cae. De repente te importan las páginas enormes, la localidad NUMA y el comportamiento del asignador.

Segunda: la compatibilidad es una escalera, no un interruptor. Userlands mixtos 32-bit/64-bit,
bibliotecas heredadas, flags de compilación antiguos y desajustes de ABI pueden hacer que “funciona en mi portátil” se sienta como un ataque personal.

Una cita (idea parafraseada)

La esperanza no es una estrategia. — idea parafraseada común en círculos de ingeniería; trátala como principio operativo, no como cita literal.

Una cosa más: la adopción de AMD64 por Intel cambió el comportamiento de compra

Una vez que Intel distribuyó x86-64 ampliamente, los compradores dejaron de evaluar “futuros de arquitectura” y comenzaron a evaluar plataformas:
precio/rendimiento, consumo, soporte del proveedor y suministro. Ese cambio empujó a toda la industria hacia un ritmo de actualizaciones incrementales
en lugar de revoluciones ISA de golpe. Lo cual es genial—hasta que hace que los equipos se confíen con “pequeños cambios” que en realidad son cambios de ABI.

Tareas prácticas: comandos, salidas, decisiones

El propósito de la historia es tomar mejores decisiones en el presente. Aquí tienes tareas prácticas que puedes ejecutar en una flota Linux para confirmar en qué modo estás,
qué ABI ejecutas, dónde va la memoria y qué cuello de botella deberías perseguir.
Cada tarea incluye: el comando, un fragmento de salida realista, lo que significa y la decisión que tomas.

Tarea 1: Confirmar que la CPU soporta long mode (AMD64)

cr0x@server:~$ lscpu | egrep 'Architecture|Model name|Flags'
Architecture:                         x86_64
Model name:                           Intel(R) Xeon(R) CPU
Flags:                                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr ... lm ... nx ...

Qué significa: x86_64 más la bandera lm confirman que la CPU puede ejecutar long mode de 64 bits. nx indica soporte no-ejecutable.

Decisión: Si falta lm, detente. No puedes migrar ese equipo a un SO de 64 bits.

Tarea 2: Confirmar que el kernel es de 64 bits (no solo la CPU)

cr0x@server:~$ uname -m
x86_64

Qué significa: El kernel en ejecución es de 64 bits.

Decisión: Si ves i686 o i386, estás dejando rendimiento y espacio de direcciones en la mesa. Planifica una ruta de actualización de kernel/userspace.

Tarea 3: Comprobar si estás ejecutando un binario userland de 32 bits en un kernel de 64 bits

cr0x@server:~$ file /usr/bin/python3
/usr/bin/python3: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, stripped

Qué significa: Este binario es ELF de 64 bits para x86-64, usando el cargador de 64 bits.

Decisión: Si dice ELF 32-bit, confirma que querías ejecutar 32 bits y audita las bibliotecas/suposiciones de ABI. Los entornos mixtos son donde “funciona en staging” muere.

Tarea 4: Identificar procesos de 32 bits aún en ejecución (común durante migraciones)

cr0x@server:~$ ps -eo pid,comm,args | head
  PID COMMAND         COMMAND
    1 systemd         /sbin/init
 1450 node            node /srv/app/server.js
 2122 legacy-agent    /opt/legacy/bin/agent --config /etc/agent.conf
cr0x@server:~$ file /proc/2122/exe
/proc/2122/exe: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2

Qué significa: Tienes al menos un proceso de 32 bits en un host de 64 bits.

Decisión: Decide si mantener soporte multiarch. Si es una dependencia de monitorización/agent, plánifica su reemplazo; si es crítica para el negocio, aíslala y asigna un responsable.

Tarea 5: Comprobar límites de direcciones virtuales y política de overcommit

cr0x@server:~$ sysctl vm.overcommit_memory vm.max_map_count
vm.overcommit_memory = 0
vm.max_map_count = 65530

Qué significa: Heurística de overcommit por defecto (0) y un límite típico de conteo de mapeos.

Decisión: Para cargas mmap-intensivas (motores de búsqueda, JVM, bases de datos), aumenta vm.max_map_count deliberadamente. No lo “maximices”; ajústalo a necesidades observadas y prueba comportamiento bajo presión de memoria.

Tarea 6: Medir el impacto del tamaño de puntero en tu proceso (chequeo rápido)

cr0x@server:~$ getconf LONG_BIT
64

Qué significa: El espacio de usuario es de 64 bits; los punteros suelen tener 8 bytes.

Decisión: Cuando una migración a 64 bits aumenta el RSS, asume inflación de estructuras hasta demostrar lo contrario. Revisa tamaño de cachés, crecimiento de slabs y afinamiento del asignador.

Tarea 7: Identificar si el host está haciendo paging y si afecta la latencia

cr0x@server:~$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0  81240  42160 512340    0    0    12    20  310  540 18  6 74  2  0
 3  1   2048  10240  18800 410200   10   20   900  1200  900 1600 45 10 35 10  0

Qué significa: En la segunda muestra, si/so (swap in/out) y alto wa indican presión de memoria causando swap y espera de IO.

Decisión: Si la actividad de swap se correlaciona con latencias en cola, arregla la memoria primero: reduce footprint, añade RAM, ajusta la carga o modifica límites de cgroup. No “optimices CPU” mientras tu máquina está literalmente leyendo memoria del disco.

Tarea 8: Comprobar señales de presión de TLB/walk de páginas vía estado de huge pages

cr0x@server:~$ grep -E 'HugePages|Hugepagesize' /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
Hugepagesize:       2048 kB

Qué significa: No hay huge pages preasignadas. Transparent Huge Pages puede seguir habilitado; esto solo cubre huge pages explícitas.

Decisión: Para bases de datos/JVMs con altas tasas de fallo de TLB, considera huge pages como un cambio probado con rollback. También revisa efectos NUMA; las huge pages pueden amplificar mal posicionamiento.

Tarea 9: Confirmar si THP está habilitado (y si ayuda o perjudica)

cr0x@server:~$ cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

Qué significa: THP está configurado en always.

Decisión: Para servicios sensibles a latencia, prueba madvise o never. “Always” puede causar paradas en la asignación y trabajo de compactación en los peores momentos.

Tarea 10: Chequeo rápido de NUMA (los boxes más grandes vinieron con 64-bit; NUMA llegó con ellos)

cr0x@server:~$ numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7
node 0 size: 64238 MB
node 0 free: 2100 MB
node 1 cpus: 8 9 10 11 12 13 14 15
node 1 size: 64238 MB
node 1 free: 52000 MB

Qué significa: El nodo 0 está casi sin memoria libre mientras el nodo 1 está mayormente inactivo. Eso es un desequilibrio clásico.

Decisión: Si tu servicio está fijado a CPUs del nodo 0 pero asigna memoria desde el nodo 0, sufrirás presión local y tráfico de memoria remota. Considera enlazar CPU/memoria o arreglar la configuración del scheduler/cgroup.

Tarea 11: Identificar si estás limitado por interacciones de aleatorización de espacio de direcciones (raro, pero real)

cr0x@server:~$ sysctl kernel.randomize_va_space
kernel.randomize_va_space = 2

Qué significa: ASLR completo habilitado.

Decisión: No deshabilites ASLR para “arreglar” un crash a menos que estés haciendo debug dirigido. Si un binario heredado falla bajo ASLR, arregla el binario, no la postura del kernel.

Tarea 12: Inspeccionar mapas de memoria por proceso para ver fragmentación/explosión de mmap

cr0x@server:~$ cat /proc/1450/maps | head
55b19c3b9000-55b19c3e6000 r--p 00000000 08:01 1048577                    /usr/bin/node
55b19c3e6000-55b19c4f2000 r-xp 0002d000 08:01 1048577                    /usr/bin/node
55b19c4f2000-55b19c55a000 r--p 00139000 08:01 1048577                    /usr/bin/node
7f2d2c000000-7f2d2e100000 rw-p 00000000 00:00 0                          [heap]

Qué significa: Puedes ver el layout de mapeos y si el proceso crea montones de mapeos pequeños (olor a fragmentación).

Decisión: Si el conteo de mapas es enorme y el rendimiento es malo, perfila el asignador/uso de mmap. Arreglar la estrategia de asignación; aumentar vm.max_map_count a veces es necesario, pero no es una optimización de rendimiento por sí sola.

Tarea 13: Comprobar si tus binarios usan el linker dinámico esperado (trampa multiarch)

cr0x@server:~$ readelf -l /usr/bin/python3 | grep 'interpreter'
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

Qué significa: Ruta de intérprete de 64 bits correcta.

Decisión: Si un despliegue “de 64 bits” intenta usar /lib/ld-linux.so.2, estás en tierra de 32 bits o mal empaquetado. Arregla el empaquetado antes de perseguir fantasmas de rendimiento.

Tarea 14: Confirmar el estado de mitigaciones de vulnerabilidades de CPU (porque el microcódigo y las transiciones de modo importan)

cr0x@server:~$ grep -E 'Mitigation|Vulnerable' /sys/devices/system/cpu/vulnerabilities/* | head
/sys/devices/system/cpu/vulnerabilities/spectre_v1: Mitigation: usercopy/swapgs barriers and __user pointer sanitization
/sys/devices/system/cpu/vulnerabilities/spectre_v2: Mitigation: Retpolines; STIBP: disabled; RSB filling

Qué significa: El kernel tiene mitigaciones habilitadas; pueden afectar el rendimiento de cargas con muchas syscalls.

Decisión: Trata las mitigaciones como parte de la línea base de rendimiento. No las deshabilites por imitación. Si el rendimiento es inaceptable, escala horizontalmente, reduce syscalls o usa hardware/kernel más nuevos.

Tarea 15: Confirmar que el IO de almacenamiento no es el verdadero cuello de botella (las migraciones a 64 bits a menudo “revelan” dolor de IO)

cr0x@server:~$ iostat -xz 1 3
Device            r/s     w/s   rkB/s   wkB/s  await  svctm  %util
nvme0n1         120.0   300.0  4096.0  8192.0   2.10   0.25  10.5
sda              10.0    80.0   128.0   2048.0  35.00   2.50  95.0

Qué significa: sda está saturado (%util ~95%) con await alto. Ese es un cuello de botella de almacenamiento.

Decisión: Deja de culpar a AMD64. Mueve IO caliente a NVMe, arregla depths de cola, afina el sistema de archivos o cambia el comportamiento de escritura de la carga.

Tarea 16: Validar que tu kernel está usando tablas de páginas de 64 bits como se espera

cr0x@server:~$ dmesg | grep -E 'x86_64|NX|Memory' | head
[    0.000000] Linux version 6.1.0 (gcc) #1 SMP PREEMPT_DYNAMIC
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] Memory: 131072MB available (16384MB kernel code, 2048MB rwdata, 8192MB rodata, 1024MB init, 4096MB bss)

Qué significa: El kernel reporta NX activo y reconoce gran memoria, consistente con operación de 64 bits.

Decisión: Si no ves la memoria o protecciones esperadas, verifica ajustes de firmware, parámetros de arranque y si has arrancado accidentalmente un kernel de rescate.

Guion de diagnóstico rápido

Cuando una carga “empeoró después de pasar a x86-64” (o tras una renovación de hardware donde se asume AMD64/Intel 64),
no tienes tiempo para ideología. Necesitas un camino rápido al cuello de botella.

Primero: confirma lo que realmente desplegaste

  1. ¿El kernel es de 64 bits? Comprueba uname -m. Si no es x86_64, detente y arregla la imagen base.
  2. ¿Los binarios son de 64 bits? Usa file en el ejecutable principal y en las librerías compartidas clave.
  3. ¿Estás mezclando dependencias de 32 bits? Busca agentes/plugins de 32 bits que forcen rutas de loader multiarch.

Segundo: identifica el recurso que te está limitando

  1. ¿Presión de memoria? Usa vmstat y revisa actividad de swap. Si hay swapping, arregla memoria antes que otra cosa.
  2. ¿Presión de CPU? Revisa carga, cola de ejecución y saturación por núcleo. Si la CPU está alta pero IPC bajo, sospecha efectos de memoria/caché.
  3. ¿Presión de IO? Usa iostat -xz. Await alto + util alto significa que tus discos son el problema, no tu ISA.

Tercero: aisla culpables específicos de arquitectura

  1. Inflación de punteros y fallos de caché: RSS subió, CPU subió, throughput bajó. Eso es clásico “64-bit hizo mis estructuras más grandes.”
  2. Efectos NUMA: Footprints de memoria mayores significan más tráfico de memoria remota. Revisa numactl --hardware y el posicionamiento.
  3. Comportamiento THP/huge pages: Picos de latencia durante asignaciones pueden venir de compactación de THP.
  4. Overhead de mitigaciones: Las mitigaciones de seguridad pueden aumentar el coste de syscalls; trátalas como parte de la nueva línea base.

Si todavía estás adivinando después de estos pasos, no estás diagnosticando—estás turisteando.

Errores comunes (síntomas → causa raíz → solución)

1) Síntoma: RSS aumentó 20–40% tras “migrar a 64 bits”

Causa raíz: el tamaño de puntero se duplicó; cambió el padding/alineación; las estructuras se hicieron menos densas para caché.

Solución: perfila asignaciones; reduce overhead de objetos; usa estructuras empaquetadas solo cuando sea seguro; rediseña estructuras calientes; considera allocadores por arena. Redimensiona cachés basándote en el conteo de objetos, no en bytes.

2) Síntoma: picos en latencia tail, especialmente bajo carga, sin saturación de CPU obvia

Causa raíz: compactación THP o tormentas de fallos de página; comportamiento del asignador cambió en builds de 64 bits; desequilibrio NUMA.

Solución: prueba THP madvise/never; fija memoria/CPU para servicios críticos; reduce fragmentación; precalienta working sets.

3) Síntoma: “Illegal instruction” en algunos nodos tras el despliegue

Causa raíz: compilaste con flags de CPU agresivos (AVX2, BMI2, etc.) y desplegaste en hardware heterogéneo.

Solución: compila para una baseline conservadora; usa dispatch en tiempo de ejecución si necesitas instrucciones avanzadas; aplica homogeneidad de hardware por pool.

4) Síntoma: el servicio funciona pero rinde peor en nodos nuevos de 64 bits

Causa raíz: presión de caché/TLB domina; más walks de página; mayor uso de ancho de banda de memoria; acceso NUMA remoto.

Solución: mide tasa de fallos de LLC con perfiles adecuados; prueba huge pages para cargas específicas; mejora localidad; evita demasiada puntería.

5) Síntoma: builds tienen éxito, pero prod cae en una llamada a librería

Causa raíz: desajuste de ABI entre librerías 32-bit y 64-bit; ruta de loader errónea; plugin binario obsoleto.

Solución: aplica comprobaciones de arquitectura en CI; escanea artefactos con file/readelf; rechaza contenedores mixtos salvo que estén explícitamente requeridos.

6) Síntoma: “Out of memory” a pesar de mucha RAM libre

Causa raíz: límite de conteo de mapas de memoria virtual; fragmentación de espacio de direcciones; límites de cgroup; sorpresas de contabilidad del kernel.

Solución: revisa vm.max_map_count; inspecciona mapeos; arregla churn de mmap; ajusta límites de cgroup comprendiendo RSS vs cache.

7) Síntoma: almacenamiento se volvió el cuello de botella tras la renovación de CPU

Causa raíz: la CPU se volvió más rápida; la app ahora emite IO más rápido; tu subsistema de disco se quedó igual.

Solución: rebalancea el sistema: pasa a medios más rápidos, afina patrones de IO, añade caching o añade nodos. La CPU más rápida expone almacenamiento lento como encender la luz en una habitación desordenada.

Mini-historias de la realidad corporativa

Mini-historia 1: El incidente causado por una suposición equivocada

Una empresa SaaS de tamaño medio decidió estandarizar en “x86-64 en todas partes.” El plan de migración estaba limpio en papel:
imagen golden nueva, kernel de 64 bits, toolchain de compilación nuevo y un despliegue rápido detrás de una feature flag.
Hicieron lo responsable y canaryearon—solo que no en la dimensión correcta.

Los nodos canary estaban todos en la pool de hardware más nueva. La flota, sin embargo, no era homogénea:
algunos servidores antiguos carecían de ciertas extensiones de conjunto de instrucciones. Nadie pensó que eso importara porque “sigue siendo x86-64.”
Esa frase debería encender alarmas en tu cabeza.

La pipeline de build había empezado a compilar silenciosamente con -march=native en los hosts de build, que casualmente eran las CPUs más nuevas.
Los binarios funcionaban de maravilla en los nodos canary. Luego el despliegue alcanzó la pool mixta, y un subconjunto de nodos empezó a fallar en arranque con “illegal instruction.”
Los checks de salud tambalearon. El autoscaling intentó compensar. El plano de control se volvió ruidoso.

El incidente no fue dramático—sin pérdida de datos, sin brecha de seguridad. Solo una falla en cámara lenta donde el sistema siguió intentando sanarse con el medicamento equivocado.
La solución fue aburrida: recompilar para una baseline conservadora, añadir detección de características en tiempo de ejecución para paths vectoriales opcionales y etiquetar pools de nodos por capacidad de CPU.

La lección: AMD64 hizo real la compatibilidad x86-64, pero “x86-64” no es una promesa de que todas las características de CPU estén presentes.
Trata las banderas de CPU como versiones de API. No desplegarías código que llame a un método de API no publicado; no despliegues binarios que llamen a instrucciones no desplegadas.

Mini-historia 2: La optimización que salió mal

Otro equipo migró una tubería de telemetría de alto rendimiento de 32 bits a 64 bits. La expectativa de rendimiento fue simple:
“más registros, mejor ABI, más rápido.” Obtuvieron lo contrario: throughput bajó y la latencia p99 se volvió fea.
La dirección inmediatamente preguntó si debían “revertir a 32 bits.” Ahí sabes que nadie tenía un plan de medición.

El servicio usaba una tabla hash en memoria con nodos ricos en punteros y listas enlazadas para manejar colisiones. En 32 bits, esos nodos eran compactos.
En 64 bits, las mismas estructuras crecieron considerablemente por los punteros de 8 bytes y el padding de alineación.
El conjunto de datos aún cabía en RAM, pero dejó de caber en caché.

La utilización de CPU aumentó, pero el IPC cayó. Los trazados de perf mostraron un desfile de fallos de caché.
El equipo intentó una “optimización”: aumentar el tamaño de la caché, asumiendo que más caché = mejor. Pero la caché ya era efectivamente todo el conjunto de datos.
Simplemente aumentaron el churn de memoria y el overhead del asignador, lo que empeoró la latencia tail.

La solución final fue estructural: rediseñaron la tabla para reducir puntería, usaron direccionamiento abierto para las estructuras más calientes
y comprimieron claves. También re-evaluaron qué debía estar en memoria vs qué podía aproxímarse.
El resultado superó el throughput original de 32 bits, pero solo después de respetar lo que 64 bits cambió: la densidad de memoria.

La lección: 64 bits te da espacio de direcciones y registros. No te regala localidad de caché.
Si tu carga es sopa de punteros, 64 bits puede ser más lento hasta que cambies la receta.

Mini-historia 3: La práctica aburrida pero correcta que salvó el día

Una compañía financiera tenía un plan multianual para eliminar dependencias de 32 bits. No era un trabajo glamoroso.
Mantenían un inventario de binarios y librerías compartidas, incluyendo metadatos de arquitectura.
Cada artefacto era escaneado durante CI: clase ELF, ruta del intérprete y objetos compartidos requeridos.

Durante una actualización de proveedor, llegó un plugin nuevo que era silenciosamente solo de 32 bits. Se habría instalado bien,
e incluso habría pasado una prueba superficial—en un entorno de staging que todavía tenía librerías multiarch instaladas.
En producción, la nueva imagen base mínima no incluía soporte del cargador de 32 bits.

La puerta de CI bloqueó el release porque los encabezados ELF del plugin no coincidían con la política de arquitectura objetivo.
Se pidió al proveedor una build de 64 bits; mientras tanto el despliegue se retrasó sin downtime.
Nadie celebró. Nadie recibió un bono. El servicio se mantuvo en pie.

Así es la operación madura: menos heroísmo, más fricción controlada.
El éxito de AMD64 hizo comunes las migraciones de arquitecturas mixtas; la fricción controlada es cómo evitas arqueología nocturna aleatoria.

Broma #2: El mejor incidente es el que tu pipeline se niega a desplegar.

Listas de verificación / plan paso a paso

Plan A: migrar un servicio de 32 bits a x86-64 con el mínimo drama

  1. Inventario de binarios y librerías: registra clase ELF, intérprete y dependencias de cada artefacto.
  2. Define una baseline de CPU: elige un conjunto mínimo de instrucciones para la flota. Prohíbe -march=native en builds de release.
  3. Construye artefactos duales temporalmente: 32-bit y 64-bit, si necesitas rollback controlado.
  4. Canary en pools heterogéneos: haz canary en tus CPUs más antiguas soportadas, no solo en las más nuevas.
  5. Vigila la densidad de memoria: compara conteos de objetos y RSS; mide fallos de caché si el throughput retrocede.
  6. Valida ajustes del kernel: vm.max_map_count, modo THP, postura ASLR, límites de cgroup.
  7. Ejecuta pruebas de carga con datos realistas: la inflación de punteros depende de la forma del conjunto de datos.
  8. Despliega por dependencias: primero runtimes (JVM, Python, libc), luego plugins, luego la app.
  9. Ten un rollback realmente ejecutable: artefacto viejo + runtime viejo + imagen base vieja, no solo “git revert.”
  10. Limpieza post-migración: elimina paquetes y soporte de loader de 32 bits no usados para evitar deriva accidental.

Plan B: validar la compatibilidad “Intel 64” vs “AMD64” en la práctica

  1. No sobrepienses el branding: si es x86_64 y tiene lm, estás en la misma familia ISA para la mayoría de cargas.
  2. Piénsalo en microarquitectura: AVX/AVX2/AVX-512, tamaños de caché, canales de memoria y mitigaciones importan.
  3. Impon etiquetas en la flota: pools de nodos por banderas de CPU, no por nombre de proveedor.
  4. Benchmarkea la carga que ejecutas: los benchmarks sintéticos son la forma segura de comprar hardware equivocado con confianza.

Qué evitar (porque todavía sucede)

  • Asumir “64 bits significa más rápido” sin medir la localidad de memoria.
  • Enviar un único binario compilado en la workstation de un desarrollador al azar.
  • Mantener dependencias de 32 bits “por si acaso” sin asumir el coste operacional.
  • Tratar NUMA como un problema que solo tienen personas de HPC.

Preguntas frecuentes

1) ¿Intel literalmente adoptó la arquitectura de AMD?

Intel implementó una extensión ISA compatible con x86-64 (inicialmente EM64T, luego Intel 64) que ejecuta el mismo modelo de software de 64 bits x86.
Es mejor entenderlo como la adopción del estándar de facto que eligió el ecosistema.

2) ¿AMD64 es lo mismo que Intel 64?

Para la mayoría del software y propósitos operativos, sí: ambos implementan long mode x86-64 y ejecutan los mismos OS y aplicaciones de 64 bits.
Las diferencias que importan en producción suelen ser microarquitectura, banderas de CPU y comportamientos de firmware de plataforma más que la ISA base.

3) ¿Por qué Itanium no ganó si era “más limpio”?

Porque lo “limpio” no paga tu factura de migración. Itanium pedía un ecosistema de software nuevo y entregó valor irregular para cargas de propósito general.
AMD64 entregó capacidad de 64 bits preservando continuidad operacional.

4) ¿Cuál fue el mayor triunfo técnico único de AMD64?

Espacio de direcciones de 64 bits práctico sin abandonar la compatibilidad x86. La expansión de registros y las convenciones de llamadas mejoradas también fueron enormes,
pero el espacio de direcciones más la compatibilidad es lo que lo hizo imparable.

5) ¿Por qué algunos servicios usan más memoria en 64 bits?

Los punteros y algunos tipos son más grandes; cambia el padding de estructuras; los asignadores pueden comportarse distinto; y aumenta el overhead de metadatos.
Los incrementos de footprint de memoria no son “bugs” por defecto—son física con recibo.

6) ¿Las aplicaciones de 32 bits aún pueden ejecutarse en un kernel de 64 bits?

A menudo sí, vía modo de compatibilidad y librerías multiarch. Pero es deuda operacional: paquetes extra, loaders diferentes
y más formas de romper despliegues. Manténlo solo si hay un propietario claro y un plan de retirada.

7) ¿x86-64 hace automáticamente más rápidas las syscalls?

El ABI y los mecanismos de syscall son generalmente más eficientes, pero el rendimiento real depende de mitigaciones del kernel,
patrones de carga y IO. Si estás acotado por syscalls, mide; no asumas.

8) ¿Cuál es la forma más rápida de confirmar que un nodo puede ejecutar cargas de 64 bits?

Revisa lscpu buscando Architecture: x86_64 y la bandera lm. Luego confirma con uname -m que sea x86_64.
Capacidad de CPU y kernel en ejecución son cosas diferentes.

9) ¿“x86-64” es lo mismo que “64 bits”?

“64 bits” es una etiqueta amplia. x86-64 es una familia ISA específica de 64 bits (AMD64/Intel 64).
Hay otras ISA de 64 bits (como ARM64), con ABIs y características de rendimiento diferentes.

10) ¿En qué debo estandarizar hoy para servidores?

Estandariza en builds de 64 bits y elimina dependencias de 32 bits agresivamente salvo que tengas una razón contractual para no hacerlo.
Luego estandariza tu baseline de características de CPU por pool para poder optimizar sin enviar instrucciones ilegales.

Conclusión: siguientes pasos prácticos

Intel adoptó AMD64 porque el mundo eligió un camino que las operaciones realmente podían recorrer:
mantener compatibilidad x86, obtener espacio de direcciones de 64 bits y mover el ecosistema adelante sin una hoguera de reescrituras.
Esa decisión convirtió a x86-64 en el objetivo predeterminado de servidores y remodeló silenciosamente todo, desde distribuciones OS hasta adquisición.

Si ejecutas sistemas en producción, la lección accionable no es “AMD ganó” o “Intel cedió.”
La lección es: las transiciones de arquitectura triunfan cuando minimizan la discontinuidad operacional—y fallan cuando los equipos las tratan como meras mejoras técnicas.

Haz esto a continuación

  • Audita tu flota por binarios mixtos y elimínalos o aíslalos.
  • Bloquea tus flags de compilación a una baseline de CPU definida; prohíbe liberaciones accidentales con -march=native.
  • Mide la densidad de memoria (RSS, tasas de aciertos de caché, señales de presión de TLB) antes y después de migraciones a 64 bits.
  • Adopta el guion de diagnóstico rápido para no perder días discutiendo sobre ISA cuando el disco está al máximo.
  • Haz que las “puertas aburridas” sean normales: escaneo de artefactos, comprobaciones ABI y políticas de dependencias. Es más barato que los heroísmos.
]]>
https://cr0x.net/es/por-que-intel-adopto-amd64/feed/ 0
Overclocking en 2026: hobby, lotería o ambos? https://cr0x.net/es/overclocking-hobby-loteria/ https://cr0x.net/es/overclocking-hobby-loteria/#respond Sat, 31 Jan 2026 06:29:24 +0000 https://cr0x.net/overclocking-hobby-loteria/ A las 02:13, tu estación de trabajo “estable” se reinicia durante una compilación. A las 09:40, la misma máquina pasa todos los benchmarks que encuentras. A las 11:05, aparece una discrepancia en la suma de verificación de una base de datos y de pronto todos recuerdan que activaste EXPO “porque era rendimiento gratis”.

El overclocking en 2026 no está muerto. Simplemente se ha movido. La acción tiene menos que ver con capturas de GHz heroicas y más con límites de potencia, comportamiento de boost, entrenamiento de memoria y la aburrida realidad de que los chips modernos ya corren al límite por sí solos. Si quieres velocidad, todavía puedes obtenerla. Si quieres fiabilidad, necesitas disciplina —y aceptar que algunas ganancias son puramente de lotería.

Qué significa realmente “overclocking” en 2026

Cuando la gente dice “overclocking”, todavía imaginan un multiplicador fijo, un voltaje fijo y un arranque triunfal en un sistema operativo que puede o no sobrevivir la semana. Eso todavía existe, pero en 2026 es la forma menos interesante (y menos sensata) de hacerlo para la mayoría de sistemas mainstream.

El tuning actual suele caer en cuatro categorías:

  • Modelado de límites de potencia: aumentar (o bajar) los límites de potencia del paquete para que la CPU/GPU pueda hacer boost más tiempo bajo carga sostenida.
  • Manipulación de la curva de boost: ajustar la lógica interna de boost de la CPU (piensa en cambios en la curva voltaje/frecuencia por núcleo) en lugar de forzar una única frecuencia para todos los núcleos.
  • Ajuste de memoria: perfiles EXPO/XMP, ajustes de voltaje del controlador de memoria, subtimming. Aquí es donde “parece bien” se convierte en “bits que se invierten a las 3 a.m.”
  • Undervolting: el movimiento silencioso y maduro—reducir voltaje para cortar calor y sostener el boost. Es el primo responsable del overclocking, y a menudo gana en cargas reales.

En términos de producción: overclockear es intentar empujar un sistema hacia un margen operativo diferente al validado por el proveedor. Ese margen no es solo frecuencia; incluye voltaje, temperatura, entrega de potencia, respuesta a transitorios, comportamiento del firmware e integridad de memoria. Cuantas más piezas toques, más formas de fallar tendrás.

Y sí, es a la vez hobby y lotería. Se convierte en hobby cuando lo tratas como ingeniería: hipótesis, control de cambios, reversión, medición. Se convierte en lotería cuando lo tratas como concurso de capturas de pantalla y declaras victoria tras una sola ejecución de benchmark.

Hobby vs lotería: de dónde viene la aleatoriedad

La aleatoriedad no es mística. Es variación de fabricación, variación de firmware y variación ambiental apiladas hasta que tu “misma configuración” se comporta distinto que la de tu amigo.

1) La variación del silicio es real, y no es nueva

Dentro del mismo modelo de CPU, dos chips pueden requerir voltajes significativamente diferentes para la misma frecuencia. Puedes llamarlo “lotería del silicio” o “variación de proceso”; el resultado es el mismo: un chip funciona bien, otro se queja. Los proveedores ya clasifican chips en bins, pero el binning está optimizado para su línea de producto, no para tu fantasía de voltaje/frecuencia personal.

2) Controladores de memoria y DIMM: la lotería silenciosa

La gente culpa a la “RAM mala”. A menudo es el controlador de memoria integrado (IMC), el trazado de la placa base o el algoritmo de entrenamiento en la BIOS. Puedes comprar DIMMs premium y aun así tener inestabilidad si el margen de la plataforma es estrecho. El overclocking de memoria es la forma de inestabilidad menos probada porque puede pasar horas de estrés básico y aún así corromper un archivo bajo un patrón de acceso extraño.

3) El firmware es ahora una política de rendimiento

Una actualización de BIOS puede cambiar el comportamiento de boost, tablas de voltaje, entrenamiento de memoria y límites de potencia—a veces mejorando la estabilidad, otras veces “optimizándote” hasta provocar reinicios. La placa base funciona efectivamente como un motor de políticas para tu CPU.

4) Tu disipador forma parte del plan de reloj

El boost moderno es oportunismo térmico. Si no tienes margen térmico, no tienes margen de frecuencia sostenida. Si tienes margen, puede que ni necesites un overclock: solo mejor refrigeración, mejor flujo de aire en la carcasa o menor voltaje.

Broma #1: El overclocking es como adoptar una mascota: la compra es la parte barata; la electricidad, la refrigeración y el apoyo emocional vienen después.

Hechos e historia que aún importan

Algunos puntos de contexto que explican por qué el overclocking se siente distinto ahora:

  1. Finales de 1990–principios de 2000: las CPUs a menudo tenían gran margen porque los proveedores enviaban relojes conservadores para cubrir peores casos de silicio y refrigeración.
  2. Cultura del “golden sample”: los entusiastas descubrieron que los chips individuales variaban ampliamente; el binning no era tan ajustado como lo es ahora para piezas mainstream.
  3. Se popularizaron los bloqueos de multiplicador: los proveedores empujaron a los usuarios hacia SKU autorizados para overclocking; los fabricantes de placas respondieron con funciones que facilitaban el tuning de todos modos.
  4. El Turbo Boost cambió el juego: las CPUs empezaron a auto-overclockearse dentro de límites de potencia/térmicos, reduciendo la brecha entre stock y “manual”.
  5. Los perfiles de memoria se masificaron: XMP/EXPO convirtieron la “RAM overclockeada” en una función de un solo interruptor—también convirtiendo la RAM inestable en una falla de un solo interruptor.
  6. La densidad de potencia aumentó bruscamente: nodos más pequeños y más núcleos incrementaron el flujo de calor; la calidad de la refrigeración ahora restringe el rendimiento tanto como el silicio.
  7. La calidad del VRM se volvió diferenciadora: la entrega de potencia de la placa base dejó de ser una casilla y se convirtió en un factor de estabilidad bajo cargas transitorias.
  8. Las GPUs normalizaron el boosting dinámico: el OC manual de GPU pasó a tratarse más de ajustar curvas de potencia/voltaje y perfiles de ventilador que de añadir MHz fijos.
  9. La detección de errores mejoró—pero no es universal: ECC es común en servidores, raro en rigs de juego, y los errores de memoria todavía se filtran en flujos de trabajo de consumo.

Realidad moderna: algoritmos de turbo, límites de potencia y térmicos

En 2026, el comportamiento por defecto de la mayoría de CPUs es “hacer boost hasta que algo me detenga”. Ese “algo” suele ser uno de estos: límite de temperatura, límite de potencia del paquete, límite de corriente o restricciones de fiabilidad de voltaje. Cuando “overclockeas”, a menudo solo estás moviendo esos postes de meta.

Límites de potencia: la palanca furtiva que parece rendimiento gratis

Aumentar límites de potencia puede ofrecer ganancias reales en cargas todo-núcleo sostenidas—renders, compilaciones, simulación—porque reduces el throttling. Pero también aumenta calor, ruido de ventiladores y estrés en los VRM. El sistema puede parecer estable en una ejecución corta y luego fallar después de que la carcasa se caliente y las temperaturas de los VRM suban.

Ajuste de la curva de boost: rendimiento sin forzar voltajes en peores casos

El ajuste de curvas por núcleo (u mecanismos equivalentes) suele superar los overclocks fijos de todo-núcleo porque la CPU puede reducir la frecuencia en núcleos calientes y mantener núcleos eficientes en boost. Esto se parece más a “enseñar al chip que tu refrigeración es buena” que a “hacer que el chip se someta”.

Undervolting: el adulto en la sala

El undervolt puede aumentar el rendimiento sostenido al bajar los térmicos, lo que reduce el throttling. También puede reducir picos transitorios que activan la inestabilidad. La pega: un undervolt demasiado agresivo produce los mismos errores que un overclock: reinicios aleatorios, errores WHEA/MCE, fallos silenciosos en cálculos—solo con una gráfica de temperatura orgullosamente más baja.

Una verdad operacional: Estabilidad no es “no se bloquea”. Estabilidad es “produce resultados correctos a través de variación de tiempo, temperatura y carga”. Si administras un sistema donde la corrección importa—sistemas de ficheros, builds, bases de datos, cálculo científico—trata la inestabilidad como pérdida de datos, no como inconveniente.

Idea parafraseada, atribuida: “La esperanza no es una estrategia.” — Gene Kranz (idea parafraseada, citada ampliamente en contextos de ingeniería/operaciones). Se aplica perfectamente aquí: no esperes que tu OC sea estable; diseña un plan de pruebas que lo demuestre.

Qué ajustar (y qué dejar en paz)

Puedes ajustar casi cualquier cosa. La cuestión es qué vale la pena arriesgar.

CPU: prioriza rendimiento sostenido y comportamiento sin errores

Si tu carga es intermitente—juego, uso general de escritorio—la lógica de boost de stock ya es muy buena. Los overclocks manuales de todo-núcleo suelen reducir el boost de un solo núcleo y hacen el sistema más caliente por ganancias marginales.

Si tu carga es sostenida todo-núcleo—compilaciones, codificación, renderizado—los límites de potencia y mejoras de refrigeración suelen superar los incrementos de frecuencia fijos. Quieres que la CPU mantenga un clock medio más alto sin disparar límites térmicos o de corriente.

Memoria: la palanca de rendimiento con las cuchillas más afiladas

La frecuencia y temporizaciones de memoria importan para cargas sensibles a latencia y algunos juegos, pero los modos de error son brutales. Un crash de CPU es obvio. Un error de memoria puede ser un archivo corrupto, una build CI inestable o una página de base de datos que falla la suma de verificación la semana siguiente.

Si puedes usar ECC, úsalo. Si no puedes, sé conservador: considera dejar la memoria en un perfil validado y céntrate primero en el tuning de potencia/boost de CPU.

GPU: ajusta para la carga, no por relojes de vanidad

El tuning de GPU trata principalmente sobre el objetivo de potencia, eficiencia de la curva de voltaje y térmicos. Para cargas de cómputo, a menudo consigues mejor rendimiento por vatio con un ligero undervolt, permitiendo que la tarjeta mantenga relojes altos sin rebotar en límites de potencia.

Almacenamiento y PCIe: no “overclockees” la ruta de E/S

Si tu placa base ofrece conmutadores de spread-spectrum de PCIe, juegos raros de BCLK o ajustes experimentales de PCIe: no lo hagas. Los errores de almacenamiento son los que descubres cuando la restauración falla.

Broma #2: Si tu “overclock” estable solo se bloquea durante las copias de seguridad, no es un overclock—es un simulacro no solicitado de recuperación ante desastres.

Modelo de fiabilidad: modos de fallo que la gente finge no ver

La mayoría de consejos de overclocking buscan pasar un benchmark. Pensar en producción es distinto: nos importan los comportamientos de cola, no el comportamiento medio. La cola es donde vive el pager.

Modo de fallo A: inestabilidad obvia

Reinicios, pantallas azules, kernel panics, fallos de aplicaciones. Son irritantes pero diagnosticables. Normalmente verás logs, volcados de memoria o al menos un patrón bajo carga.

Modo de fallo B: fallos marginales de cómputo

El sistema se mantiene arriba pero produce resultados incorrectos ocasionalmente. Este es el modo pesadilla para quien hace trabajo científico, cálculos financieros o compiladores. Puede manifestarse como:

  • Fallos aleatorios en pruebas CI que desaparecen al reejecutar
  • Archivos corruptos con tamaños que parecen válidos
  • Divergencia en entrenamiento de modelos que “desaparece” al cambiar el tamaño de lote

Modo de fallo C: corrupción de E/S desencadenada por errores de memoria

Tu sistema de ficheros puede escribir la basura que la RAM le entrega. Los sistemas de ficheros con suma de verificación pueden detectarlo, pero detectar no es prevenir; aún puedes perder datos si la corrupción ocurre antes de que la redundancia ayude, o si la corrupción está en tránsito por encima de la capa de suma de verificación.

Modo de fallo D: degradación térmica y de VRM con el tiempo

Ese sistema “estable” en invierno se vuelve inestable en verano. Los VRM se empapan de calor. El polvo se acumula. La pasta térmica se seca. Los ventiladores desaceleran. Un overclock que no deja margen envejece mal.

Modo de fallo E: deriva de firmware

Actualización de BIOS, actualización de controlador GPU, microcódigo: el ajuste que era estable el mes pasado ahora produce errores. No porque la actualización sea “mala”, sino porque cambió la política de boost/potencia y te movió a otro borde.

Guía rápida de diagnóstico (encuentra el cuello de botella)

Este es el flujo de trabajo de “deja de adivinar”. Úsalo cuando el rendimiento sea decepcionante o cuando la estabilidad sea cuestionable después de ajustar.

Primero: confirma si estás thermal-throttling (o no)

  • Comprueba la frecuencia de la CPU bajo carga, la potencia del paquete y la temperatura.
  • Verifica si la CPU está alcanzando límite térmico o límite de potencia/corriente.
  • En GPUs, comprueba límite de potencia, límite térmico y comportamiento de reloj a lo largo del tiempo.

Segundo: aisla el subsistema (CPU vs memoria vs GPU vs almacenamiento)

  • Estrés solo CPU: ¿se bloquea o registra errores de machine check?
  • Estrés de memoria: ¿obtienes errores o eventos WHEA/MCE?
  • Estrés GPU: ¿ves reseteos de driver o errores PCIe?
  • Integridad de almacenamiento: ¿ves errores de checksum, errores de I/O o resets por timeout?

Tercero: determina si el problema es margen o configuración

  • Problemas de margen mejoran con más voltaje, menos frecuencia, menor temperatura o menor límite de potencia.
  • Problemas de configuración mejoran con actualizaciones/retrocesos de BIOS, perfil de memoria correcto, plan de energía correcto y deshabilitar funciones “auto-OC” conflictivas.

Cuarto: revierte cambios en orden de mayor riesgo

  1. OC de memoria / EXPO/XMP y ajustes de voltaje del controlador de memoria
  2. Offsets de undervolt y cambios del curve optimizer
  3. Aumento de límites de potencia y sobreescrituras exóticas de boost
  4. Multiplicadores fijos para todo-núcleo / cambios de BCLK

En la práctica: si ves rarezas, restablece la memoria a JEDEC primero. Es la forma más rápida de eliminar una gran clase de riesgos de corrupción silenciosa.

Tareas prácticas: comandos, salidas y decisiones (12+)

A continuación hay tareas prácticas que puedes ejecutar en un host Linux para evaluar rendimiento, estabilidad y si tu overclock ayuda o perjudica. Cada tarea incluye un comando, salida de ejemplo, qué significa y la decisión que tomas.

Task 1: Identificar modelo y topología de CPU (chequeo de cordura)

cr0x@server:~$ lscpu | egrep 'Model name|Socket|Core|Thread|CPU\(s\)|MHz'
CPU(s):                               32
Model name:                           AMD Ryzen 9 7950X
Thread(s) per core:                   2
Core(s) per socket:                   16
Socket(s):                            1
CPU MHz:                              5048.123

Qué significa: Confirma lo que realmente estás ajustando: recuento de núcleos, SMT y frecuencia reportada actual.

Decisión: Si la topología no coincide con lo esperado (SMT desactivado, núcleos aparcados), arregla eso antes de tocar relojes.

Task 2: Comprobar el governor actual y el comportamiento de escalado de frecuencia

cr0x@server:~$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
schedutil

Qué significa: Estás usando el governor conducido por el scheduler del kernel, que generalmente se comporta bien para CPUs con boost.

Decisión: Si estás atascado en powersave con relojes bajos, arregla tu perfil de energía antes de culpar al silicio.

Task 3: Observar relojes, potencia y throttling en tiempo real (Intel/AMD vía turbostat)

cr0x@server:~$ sudo turbostat --Summary --interval 2
Avg_MHz  Busy%  Bzy_MHz  TSC_MHz  PkgTmp  PkgWatt
 4920     88.5    5560     4000     92     205.3
 4880     90.1    5410     4000     95     218.7

Qué significa: Estás caliente (92–95°C) y consumiendo mucha potencia del paquete. El boost es fuerte pero probablemente cerca de límites térmicos.

Decisión: Si PkgTmp roza el techo térmico, perseguir más MHz generalmente es una pérdida. Mejora la refrigeración o undervoltea para mantener relojes sostenidos.

Task 4: Confirmar que el kernel detecta eventos de thermal throttling

cr0x@server:~$ sudo dmesg -T | egrep -i 'thrott|thermal' | tail -n 5
[Sun Jan 12 10:14:31 2026] CPU0: Package temperature above threshold, cpu clock throttled
[Sun Jan 12 10:14:31 2026] CPU0: Package temperature/speed normal

Qué significa: La CPU está rebotando contra límites térmicos. Tu “overclock” puede ser un generador de calor, no una mejora de rendimiento.

Decisión: Reduce voltaje/límites de potencia o aumenta la refrigeración. Si quieres rendimiento estable, deja de depender de boosts transitorios.

Task 5: Buscar errores de machine check (MCE) que indiquen estabilidad marginal

cr0x@server:~$ sudo journalctl -k -b | egrep -i 'mce|machine check|hardware error|whea' | tail -n 8
Jan 12 10:22:08 server kernel: mce: [Hardware Error]: CPU 3: Machine Check: 0 Bank 27: baa0000000000108
Jan 12 10:22:08 server kernel: mce: [Hardware Error]: TSC 0 ADDR fef1a140 MISC d012000100000000 SYND 4d000000 IPID 1002e00000000

Qué significa: No estás “estable”. Entradas MCE durante carga son señales clásicas de voltaje insuficiente, curve optimizer demasiado agresivo o silicio demasiado caliente.

Decisión: Retrocede el undervolt/curve, reduce la frecuencia o mejora la refrigeración. Trata MCE como una falla de corrección, no como un “tal vez”.

Task 6: Estrés rápido de CPU para reproducir fallos (corto y ruidoso)

cr0x@server:~$ stress-ng --cpu 32 --cpu-method matrixprod --timeout 5m --metrics-brief
stress-ng: info:  [18422] dispatching hogs: 32 cpu
stress-ng: metrc: [18422] cpu                300.00s   12654.12 bogo ops/s
stress-ng: info:  [18422] successful run completed in 300.02s

Qué significa: Una ejecución corta solo-CPU se completó. Esto es necesario, no suficiente.

Decisión: Si falla rápidamente, tu OC es obviamente inestable. Si pasa, procede a pruebas de memoria y cargas mixtas.

Task 7: Estrés de memoria que realmente intenta romper cosas

cr0x@server:~$ stress-ng --vm 4 --vm-bytes 75% --vm-method all --timeout 30m --metrics-brief
stress-ng: info:  [18701] dispatching hogs: 4 vm
stress-ng: info:  [18701] successful run completed in 1800.03s

Qué significa: Has ejercitado la RAM intensamente. Aún no es una prueba definitiva, pero es una puerta útil.

Decisión: Si obtienes segfault, OOM extraño o MCE/WHEA durante esto, sospecha del OC de memoria/voltaje del IMC. Retrocede EXPO/XMP primero.

Task 8: Comprobar contadores de errores ECC (si tienes ECC)

cr0x@server:~$ sudo edac-util -v
edac-util: EDAC drivers loaded: amd64_edac
mc0: 0 Uncorrected Errors with no DIMM info
mc0: 2 Corrected Errors with no DIMM info

Qué significa: Ocurrieron errores corregidos. ECC te salvó, pero también te está indicando que estás operando cerca del límite.

Decisión: Cualquier cuenta de errores corregidos que crezca bajo carga es señal para reducir OC de memoria, bajar temperatura o aumentar márgenes de estabilidad. Errores no corregidos son territorio de “detenerse ahora”.

Task 9: Validar señales de integridad de almacenamiento (ejemplo ZFS)

cr0x@server:~$ sudo zpool status -x
all pools are healthy

Qué significa: No hay errores conocidos de ZFS por ahora.

Decisión: Si alguna vez ves errores de checksum tras ajustar RAM/CPU, asume primero inestabilidad de memoria, no “discos malos”. Los discos fallan; la RAM marginal también.

Task 10: Forzar un scrub y vigilar errores de checksum (ZFS)

cr0x@server:~$ sudo zpool scrub tank
cr0x@server:~$ sudo zpool status tank | egrep 'scan:|errors:'
  scan: scrub in progress since Sun Jan 12 10:55:11 2026
errors: No known data errors

Qué significa: El scrub está en progreso y actualmente limpio.

Decisión: Si un scrub informa errores de checksum después de cambiar ajustes de memoria, no empiezes reemplazando discos. Revierte el OC de memoria y vuelve a hacer scrub.

Task 11: Verificar síntomas de estabilidad PCIe/NVMe vía logs del kernel

cr0x@server:~$ sudo journalctl -k -b | egrep -i 'nvme|pcie|aer|reset' | tail -n 10
Jan 12 11:10:44 server kernel: nvme nvme0: I/O 123 QID 7 timeout, reset controller
Jan 12 11:10:45 server kernel: pcieport 0000:00:01.0: AER: Corrected error received: id=00e0

Qué significa: Tienes timeouts/resets y eventos AER de PCIe. Estos pueden ser provocados por BCLK inestable, undervolt o entrega de potencia de plataforma marginal.

Decisión: Detén cualquier experimentación con BCLK. Vuelve a configuraciones stock de PCIe. Valida la PSU y la estabilidad de la placa base. Los timeouts de almacenamiento no son “normales”.

Task 12: Medir si tu tuning ayudó la carga real (ejemplo: build)

cr0x@server:~$ /usr/bin/time -v make -j32
	Command being timed: "make -j32"
	User time (seconds): 512.43
	System time (seconds): 44.02
	Percent of CPU this job got: 3180%
	Elapsed (wall clock) time (h:mm:ss or m:ss): 0:18.20
	Maximum resident set size (kbytes): 2483100

Qué significa: Obtuviste un tiempo de build de 18.2s bajo una configuración definida. Ese es tu métrico de referencia, no el “score de Cinebench”.

Decisión: Si el tuning mejora benchmarks pero no el tiempo real de tu trabajo, revierte. Calor y riesgo son costes; págales solo por ganancias reales.

Task 13: Confirmar que no estás intercambiando (las “ganancias” de OC de memoria pueden ser falsas)

cr0x@server:~$ free -h
               total        used        free      shared  buff/cache   available
Mem:            64Gi        31Gi        18Gi       1.2Gi        15Gi        33Gi
Swap:          8.0Gi       0.0Gi       8.0Gi

Qué significa: No hay presión de swap en este instantáneo.

Decisión: Si el swap está en uso durante tus pruebas, tus resultados de benchmark miden comportamiento de almacenamiento y reclamación del SO, no pura velocidad CPU/memoria.

Task 14: Rastrear sensores de temperatura y comportamiento de ventiladores a lo largo del tiempo

cr0x@server:~$ sensors | egrep -i 'Package|Tctl|Core|VRM|edge|junction' | head
Tctl:         +94.8°C
Core 0:       +86.0°C
Core 1:       +88.0°C

Qué significa: Estás cerca del techo térmico.

Decisión: Si las temperaturas están cerca del límite durante cargas sostenidas, prioriza reducir voltaje o mejorar refrigeración en lugar de empujar la frecuencia.

Tres microhistorias corporativas del mundo real

Microhistoria #1: Un incidente causado por una suposición equivocada

Un equipo gestionaba una flota mixta de estaciones de trabajo de desarrollador y algunos agentes de build. Estaban orgullosos de su “imagen estándar” y de sus “ajustes de BIOS estándar”. Cuando llegó un lote nuevo de máquinas, alguien activó un perfil de memoria porque el marketing del proveedor lo llamaba “validado”. La suposición era simple: si hace boot y ejecuta algunas pruebas, está bien.

Dos semanas después, la pipeline de build comenzó a mostrar fallos intermitentes. No reproducibles localmente. No ligados a un repositorio. Simplemente aleatorios. Los ingenieros reejecutaban trabajos y pasaban. La firma del fallo no era un crash; era una discrepancia en una prueba unitaria, una descoincidencia de hash y, una vez, un error interno del compilador que desaparecía al reintentar.

SRE se involucró porque los fallos estaban consumiendo capacidad. Se culparon a los sospechosos habituales: almacenamiento inestable, hiccups de red, “caché mala”. Los logs estaban limpios. Las métricas del sistema estaban bien. El giro vino cuando alguien correlacionó fallos con un host específico—y luego con la temperatura ambiente de ese host. La máquina vivía junto a una ventana soleada. Se calentaba por la tarde. Los errores de memoria no necesitan un foco, solo margen.

La solución no fue heroica. Restablecieron la memoria a JEDEC, ejecutaron estrés de memoria más largo y los fallos desaparecieron. Más tarde reintrodujeron el perfil con una frecuencia menor y temporizaciones un poco más laxas y encontraron un punto estable. La lección cara: “validado” no es lo mismo que “validado para tu IMC, tu placa, tu refrigeración y tu carga a lo largo del tiempo”.

Microhistoria #2: Una optimización que salió mal

Un grupo orientado al rendimiento tenía cargas intensivas en GPU y un objetivo: reducir costes de ejecución. Leyeron sobre undervolting y decidieron implementar un “undervolt de flota” en un conjunto de nodos de cómputo. El razonamiento era sensato: menor voltaje, menos calor, boost sostenido, menos ruido de ventiladores, mejor rendimiento por vatio. Lo probaron con su suite de benchmarks y se veía genial.

Entonces llegó la realidad. Bajo ciertos trabajos—los que tenían comportamiento de potencia espikeado y ráfagas ocasionales de CPU—los nodos empezaron a caerse. No de forma consistente. No inmediatamente. A veces después de seis horas. El driver de GPU se reiniciaba. A veces el kernel registraba errores PCIe AER corregidos; a veces no. Lo peor: los trabajos completaban con salida incorrecta ocasionalmente. No era obvio—suficiente para fallar una validación downstream más tarde.

El equipo había optimizado para el rendimiento medio en cargas estables. Pero sus trabajos de producción no eran estables. Tenían fases mixtas CPU+GPU, ráfagas de almacenamiento y ciclos térmicos. El undervolt redujo el margen de voltaje lo justo para que transitorios raros se volvieran fatales. El benchmark no reproducía la forma de onda de potencia de la carga, así que el ajuste era “estable” solo en el mundo donde no ocurre nada inesperado.

Hicieron rollback, luego reintrodujeron el undervolt con salvaguardas: calificación por nodo, offsets conservadores y una política de “no ajustes que produzcan errores hardware corregidos”. Aún ahorraron energía, pero dejaron de apostar con la corrección.

Microhistoria #3: Una práctica aburrida pero correcta que salvó el día

Un equipo centrado en almacenamiento gestionaba algunas máquinas “todo en uno”: build, test y ocasionalmente hospedar datasets en ZFS. No overclockeaban esas cajas, pero hicieron algo poco fashion: documentaron ajustes de BIOS, fijaron versiones de firmware y mantuvieron un plan de reversión. También ejecutaban scrubs mensuales de ZFS y vigilaban contadores de errores.

Un día llegó una actualización de BIOS rutinaria con una nota de “mejor compatibilidad de memoria”. Un desarrollador la instaló en una máquina para “ver si ayuda el tiempo de arranque”. El sistema arrancó, funcionó bien y nadie notó nada. Semanas después, el scrub de ZFS reportó un pequeño número de errores de checksum solo en ese host. Los discos parecían sanos. SMART parecía bien. Olía a memoria o inestabilidad de plataforma.

Porque tenían disciplina aburrida, pudieron responder preguntas básicas rápidamente: qué cambió, cuándo y en qué host. Revirtieron la BIOS, restablecieron ajustes de entrenamiento de memoria, volvieron a hacer scrub y los errores pararon. No perdieron datos porque lo detectaron temprano y porque el sistema tenía checksum, redundancia y scrubs regulares.

La moraleja no es “nunca actualices BIOS”. Es “trata el firmware como código”. Versionarlo, desplegarlo gradualmente y observar señales de corrección que son aburridas hasta que dejan de serlo.

Errores comunes: síntomas → causa raíz → solución

Estos son los patrones que veo una y otra vez—los que desperdician fines de semana y arruinan datos en silencio.

1) Síntoma: Reinicios aleatorios solo bajo carga intensa

Causa raíz: Límite de potencia aumentado sin suficiente margen de refrigeración/VRM; respuesta transitoria de PSU insuficiente; OC agresivo de todo-núcleo.

Solución: Reduce límites de potencia del paquete; mejora el flujo de aire; confirma temperaturas de VRM; considera undervolt en lugar de aumentar frecuencia.

2) Síntoma: Pasa benchmarks cortos, falla renders o compilaciones largas

Causa raíz: Heat soak; el margen de estabilidad desaparece a medida que suben las temperaturas; curva de ventiladores demasiado tímida; recirculación en la carcasa.

Solución: Ejecuta pruebas de estabilidad más largas; ajusta curvas de ventilador para cargas sostenidas; mejora presión de caja; baja voltaje.

3) Síntoma: Fallos intermitentes en CI/tests que desaparecen al reejecutar

Causa raíz: OC de memoria/IMC marginal; undervolt causando fallos raros de cómputo; ajustes inestables de infinity fabric / controlador de memoria (dependiente de la plataforma).

Solución: Revierte memoria a JEDEC; ejecuta estrés de memoria; si los errores desaparecen, reintroduce ajustes de forma conservadora. Trata las “inestabilidades” como hardware hasta demostrar lo contrario.

4) Síntoma: Errores de checksum de ZFS o errores de scrub después de ajustar

Causa raíz: Inestabilidad de memoria que corrompe datos antes de que lleguen al disco; inestabilidad PCIe causando problemas DMA; timeouts NVMe.

Solución: Restablece OC de memoria; revisa logs del kernel por AER/NVMe resets; vuelve a scrappear tras estabilizar. No empieces reemplazando discos.

5) Síntoma: Reseteos de driver GPU durante cargas mixtas

Causa raíz: Undervolt demasiado agresivo para picos transitorios; límite de potencia demasiado estricto; hotspot térmico causando throttling local; OC de VRAM inestable.

Solución: Retrocede undervolt/OC de VRAM; aumenta ligeramente objetivo de potencia; mejora refrigeración; valida con estrés mixto largo CPU+GPU.

6) Síntoma: El sistema es “estable” pero más lento

Causa raíz: OC fijo de todo-núcleo reduce boost de un solo núcleo; throttling térmico reduce relojes medios; temporizaciones de memoria empeoran latencia mientras la frecuencia sube.

Solución: Mide tiempo real en tu carga; prefiere ajuste de curva de boost/undervolt y mejoras de refrigeración; no persigas MHz de titular.

7) Síntoma: Rendimiento varía enormemente entre ejecuciones

Causa raíz: Boost dependiente de temperatura; tareas en segundo plano; cambios de plan de energía; throttling térmico de VRM.

Solución: Fija condiciones de prueba; registra temperaturas y potencia; normaliza carga en segundo plano; asegura curvas de ventilador consistentes.

Listas de verificación / plan paso a paso

Así abordas el overclocking como alguien que ya se quemó antes.

Lista A: Decide si deberías overclockear en absoluto

  1. Define la métrica de la carga: tiempo de build en reloj de pared, tiempo de render, consistencia del frame time, rendimiento de entrenamiento—algo real.
  2. Define el requisito de corrección: “rig de juego” es distinto de “NAS de fotos familiares” y distinto de “pipeline de cómputo”.
  3. Inventario de detección de errores: ¿ECC? ¿Suma de verificación en el sistema de ficheros? ¿Validación CI? Si no puedes detectar errores, vuelas a ciegas.
  4. Revisa refrigeración y entrega de potencia: Si ya estás cerca del límite térmico en stock, no empieces subiendo potencia.

Lista B: Establece una línea base (no la omitas)

  1. Registra versión de BIOS y ajustes clave (fotos cuentan como documentación).
  2. Mide temperaturas y potencia de base bajo tu carga real.
  3. Mide rendimiento base con un comando repetible (ver Task 12).
  4. Ejecuta una barrida de estabilidad base: estrés CPU + estrés memoria + una carga mixta larga.

Lista C: Cambia una variable a la vez

  1. Empieza con undervolt/eficiencia en lugar de frecuencia bruta.
  2. Luego ajusta límites de potencia si estás throttling en cargas sostenidas.
  3. Toca perfiles de memoria al final, y solo si tu carga se beneficia.
  4. Después de cada cambio: vuelve a ejecutar el mismo plan de pruebas, compara con la línea base y registra resultados.

Lista D: Define “estable” como un adulto

  1. No hay errores hardware MCE/WHEA del kernel durante estrés o cargas reales.
  2. No hay errores de checksum en el sistema de ficheros, errores de scrub ni resets inexplicables de I/O.
  3. Mejora de rendimiento en la carga real, no solo en una puntuación sintética.
  4. Estabilidad a lo largo del tiempo: al menos una ejecución larga que alcance heat soak.

Lista E: Plan de reversión (antes de necesitarlo)

  1. Sabe cómo limpiar CMOS y restaurar ajustes básicos.
  2. Mantén copia de versiones de BIOS/firmware conocidas como buenas.
  3. Si dependes de la máquina: programa cambios de tuning, no los hagas la noche antes de una entrega.

Preguntas frecuentes

¿Vale la pena el overclocking en 2026?

A veces. Para cargas sostenidas todo-núcleo, modelar límites de potencia y mejorar refrigeración puede dar ganancias reales. Para cargas intermitentes, el boost de stock suele estar muy cerca del óptimo. El ajuste de memoria puede ayudar, pero también es el riesgo más alto para errores silenciosos.

¿Por qué las CPUs modernas muestran ganancias de overclock menores que las antiguas?

Porque ya hacen boost agresivamente hasta límites térmicos/potencia. Los proveedores envían el hardware mucho más cerca del borde eficiente, y los algoritmos de boost aprovechan oportunísticamente el margen de tu refrigeración automáticamente.

¿Es más seguro el undervolting que el overclocking?

Más seguro en el sentido de que reduce calor y potencia, lo que puede mejorar la estabilidad. No es seguro en el sentido de “no puede romper la corrección”. Un undervolt excesivo puede causar errores MCE/WHEA y fallos raros de cálculo.

¿Cuál es el ajuste “fácil” más peligroso?

Perfiles de memoria de alta frecuencia habilitados sin validación. Son populares porque parecen sancionados, pero la inestabilidad de memoria puede ser sutil y destructiva.

¿Cómo sé si mi sistema está corrompiendo datos en silencio?

Normalmente no lo sabes—hasta que lo sabes. Por eso vigilas errores de machine check, ejecutas estrés mixto largo y confías en sumas de verificación cuando es posible (ECC, scrubs del sistema de ficheros, pipelines de validación).

¿Necesito ECC si hago overclock?

Si la corrección importa, ECC vale la pena priorizarlo independientemente del overclock. Si ajustas memoria agresivamente, ECC puede convertir corrupción silenciosa en errores corregidos que puedes observar—aún es un problema, pero al menos visible.

¿Debería overclockear un NAS o servidor de almacenamiento?

No. Si la máquina almacena datos importantes, prioriza márgenes de estabilidad, ECC, ajustes conservadores de memoria y térmicos predecibles. Los errores de almacenamiento son costosos y rara vez divertidos.

¿Por qué una actualización de BIOS cambió mi rendimiento o estabilidad?

Porque la BIOS controla política de boost, tablas de voltaje, entrenamiento de memoria y límites de potencia. Un firmware nuevo puede moverte a un punto operativo distinto, especialmente si ya estás cerca del borde con ajustes.

¿Cuál es la mejor mejora “barata” en lugar de overclocking?

Refrigeración y flujo de aire, además de un undervolt modesto. El rendimiento sostenido a menudo está limitado por térmicos. Menor temperatura puede significar más boost promedio con menos errores.

¿Qué pruebas debo ejecutar antes de declarar victoria?

Como mínimo: estrés CPU largo, estrés de memoria largo y una ejecución larga de tu carga real para alcanzar heat soak—mientras monitoreas logs por MCE/WHEA y resets de I/O. Si guardas datos: scrubs y comprobaciones de integridad.

Conclusión: pasos prácticos siguientes

El overclocking en 2026 sigue siendo un hobby y sigue siendo una lotería. La diferencia es que los boletos de lotería ahora están etiquetados “perfil de memoria”, “sobreescritura de boost” y “ajuste de curva”, y el pago suele ser unos pocos porcentajes—mientras que la desventaja va desde crashes molestos hasta fallos de corrección que no notarás hasta que no puedas confiar en tus resultados.

Haz esto:

  1. Mide tu carga real y define una línea base.
  2. Persigue rendimiento sostenido con refrigeración y undervolt modesto antes de ir tras MHz.
  3. Valida con logs: no MCE/WHEA, no resets PCIe/NVMe, no sorpresas de checksum en el sistema de ficheros.
  4. Trata el ajuste de memoria como peligroso. Si activas EXPO/XMP, demuéstralo con pruebas largas y ejecuciones de la carga real.
  5. Mantén un plan de reversión y úsalo rápidamente cuando aparezcan rarezas.

Si quieres la regla de decisión más simple: overclockea por diversión en sistemas donde puedes permitir fallos. En sistemas donde la corrección importa, ajusta para eficiencia, margen y observabilidad—y deja la lotería a otro.

]]>
https://cr0x.net/es/overclocking-hobby-loteria/feed/ 0
Elegir una CPU para 5 Años: Compra según la Carga de Trabajo, No por el Logo https://cr0x.net/es/elegir-cpu-por-carga-de-trabajo/ https://cr0x.net/es/elegir-cpu-por-carga-de-trabajo/#respond Sat, 31 Jan 2026 03:14:00 +0000 https://cr0x.net/elegir-cpu-por-carga-de-trabajo/ La CPU que compres hoy dictará en silencio tus próximos cinco años de tickets de incidentes: picos de latencia que no puedes reproducir,
pausas “misteriosas” del GC y ese trabajo por lotes que siempre se alarga justo antes de la reunión con el CFO.
La mayoría de los equipos todavía elige CPUs como eligen el café: lealtad a la marca, sensaciones y una captura de benchmark de un hilo de chat.

A Producción no le importan las sensaciones. A Producción le importan la latencia de cola, el comportamiento de la caché, la colocación NUMA y si
tu pila de almacenamiento está pidiendo ciclos que no presupuestaste. Si quieres cinco años de operaciones predecibles, compras según la carga de trabajo,
y lo demuestras con mediciones.

El principio central: carga de trabajo primero, logo al final

Una CPU no es un símbolo de estatus. Es un contrato: te comprometes con un equilibrio específico de núcleos, frecuencia,
caché, canales de memoria, lanes PCIe, límites de potencia y peculiaridades de plataforma. En cinco años, ese contrato o bien
mantendrá tus sistemas aburridos (el tipo bueno de aburrido) o convertirá cada conversación de escalado en una negociación presupuestaria.

Compra respondiendo estas preguntas con evidencia:

  • ¿Qué se satura primero? ¿Ciclos de CPU, ancho de banda de memoria, caché, E/S o red?
  • ¿Cuál es el SLO crítico? ¿Rendimiento, latencia p99, tiempo de finalización de trabajos o costo por unidad?
  • ¿Cuál es el modelo de concurrencia? ¿Bucle caliente de hilo único, muchos hilos independientes o fork/join?
  • ¿Qué tan “bursty” es? ¿Puedes aprovechar turbo/boost o vives a carga sostenida en todos los núcleos?
  • ¿Qué más se ejecutará ahí? Sidecars, agentes, cifrado, compresión, scrubbing, backups, observabilidad.

Luego seleccionas una plataforma (CPU + placa base + memoria + valores por defecto del BIOS + potencia/refrigeración) que sirva esas respuestas.
No al revés.

Broma #1: Si tu proceso de selección de CPU empieza con “mi amigo dice”, tu próximo outage terminará con “mi amigo se equivocaba.”

Hechos rápidos e historia que realmente importan

Algunos puntos concretos—históricos y técnicos—que te ayudan a razonar por qué comprar CPUs modernas se siente raro:

  1. Las velocidades de reloj dejaron de escalar linealmente a mediados de los 2000 debido a densidad de potencia y calor; la industria giró fuertemente hacia multicore.
  2. Los relojes “Turbo”/boost cambiaron la matemática de aprovisionamiento: los picos cortos pueden lucir increíbles en benchmarks pero colapsan bajo carga sostenida en todos los núcleos.
  3. Hyper-threading/SMT no es “2x núcleos”; es un truco de utilización que ayuda a algunas cargas y perjudica a otras, especialmente bajo contención.
  4. NUMA ha sido el impuesto silencioso al rendimiento de servidores por décadas: la memoria local es rápida; la memoria remota es “rápida-ish hasta que no lo es”.
  5. Los tamaños de caché explotaron porque la memoria no siguió el ritmo; la latencia a DRAM sigue siendo cara, y muchas cargas accidentalmente quedan limitadas por latencia de memoria.
  6. AES-NI y extensiones similares hicieron que el cifrado sea lo suficientemente barato como para ser “activado por defecto”, desplazando los cuellos de botella a otros lugares.
  7. Las mitigaciones por especulación (post-2018) hicieron que detalles de microarquitectura importen operativamente; los niveles de parches pueden cambiar perfiles de rendimiento.
  8. El conteo de lanes PCIe se volvió una métrica de capacidad de primera clase a medida que NVMe, GPUs y smart NICs se volvieron normales en servidores “de propósito general”.

Nada de esto te dice qué marca comprar. Te dice por qué un benchmark de un solo número nunca describió tu futuro.

Formas de carga de trabajo: qué hace realmente tu CPU

1) Servicios críticos de latencia (p95/p99 vive aquí)

APIs web, autenticación, pujas de anuncios, datos de mercado, pagos: la métrica de negocio es la latencia de cola. Estas cargas a menudo tienen
pequeños bucles calientes, muchas ramas y fallos frecuentes de caché causados por grandes conjuntos de trabajo o churn del asignador.

Lo que quieres:

  • Fuerte rendimiento por hilo (no solo pico turbo en un núcleo, sino sostenido bajo carga realista).
  • Jerarquía de caché grande y efectiva; menos fallos de caché a escala vence a “más núcleos” para latencia de cola.
  • Comportamiento de frecuencia predecible bajo límites térmicos y de potencia.
  • Historia NUMA clara: fijar procesos críticos, mantener la memoria local, evitar charla entre sockets.

2) Cargas orientadas a rendimiento (batch, ETL, render, cómputo offline)

Si el tiempo de finalización importa más que la latencia por petición, a menudo puedes lanzar núcleos—hasta que el ancho de banda de memoria o E/S se convierta en pared.
Compiladores, granjas de build, trabajos ETL y algo de analítica adoran el paralelismo, pero solo si no pelean por canales de memoria.

Lo que quieres:

  • Más núcleos físicos y suficiente ancho de banda de memoria para alimentarlos.
  • Rendimiento sostenido en todos los núcleos bajo límites de potencia, no relojes de marketing efímeros.
  • Suficiente PCIe para el almacenamiento y la red que inevitablemente añadirás a mitad de ciclo.

3) Hosts de virtualización y contenedores (la “mezcla”)

Hypervisores y nodos Kubernetes ejecutan un zoológico: algunas cosas son sensibles a latencia, otras están limitadas por CPU, y muchas son simplemente ruidosas.
Tu elección de CPU debe minimizar el radio de destrucción de ese ruido.

Lo que quieres:

  • Suficientes núcleos para consolidación, pero no tantos que no puedas mantener la localidad por socket bajo control.
  • Buena capacidad y canales de memoria; la sobreasignación de memoria se convierte en swap, y el swap en pánico existencial.
  • Estabilidad de plataforma: valores por defecto del BIOS predecibles, microcódigo estable y comportamiento IOMMU limpio para passthrough si es necesario.

4) Servidores de almacenamiento (sí, la CPU importa mucho)

Las pilas de almacenamiento consumen CPU de maneras poco glamorosas: checksums, compresión, paridad RAID, cifrado, deduplicación (si tienes valor),
y operaciones de metadata. ZFS, Ceph, mdraid, LVM, dm-crypt—esto no es gratis.

Lo que quieres:

  • Suficientes núcleos para trabajo en segundo plano (scrub, rebalanceo, compactación) mientras sirves E/S en primer plano.
  • Fuerte subsistema de memoria; la E/S con mucho uso de metadata se transforma en bound por latencia de memoria.
  • LANES y topología PCIe que coincidan con tu disposición de HBA/NVMe; “cabe en la ranura” no es lo mismo que “rinde”.

5) Cómputo especializado (transcoding, ML, crypto, compresión)

Estos son los más fáciles de acertar y los más fáciles de fallar. Acertar: medir las instrucciones usadas y elegir la mejor vía de acelerador
(GPU, Quick Sync, AVX-512, etc.). Fallar: asumir que la brillante extensión vectorial de tu CPU es una victoria garantizada.

Lo que quieres:

  • Soporte de conjunto de instrucciones que tu software realmente usa (y a lo que está compilado).
  • Térmicas y entrega de potencia que sostengan cargas vectoriales (pueden bajar mucho el reloj).
  • Suficiente E/S para alimentar la bestia (NVMe para datasets, red rápida, etc.).

Rasgos de CPU que mueven la aguja (y los que no)

Núcleos vs frecuencia: deja de tratarlo como una elección binaria

El conteo de núcleos ayuda cuando tienes trabajo paralelo que puede mantenerse ocupado sin pelear por recursos compartidos.
La frecuencia ayuda cuando un pequeño número de hilos domina la latencia o cuando la contención de locks hace que “más hilos” sean mayormente más contención.
En cinco años, tu carga de trabajo derivará. Pero no suele pasar de “bucle caliente de un solo hilo” a “perfectamente paralelo”.

El enfoque práctico es clasificar tu carga por paralelismo efectivo:

  • 1–4 hilos calientes importan más: prioriza fuerte rendimiento por núcleo y caché, y mantén la plataforma fría.
  • 8–32 hilos útiles: balancea frecuencia y núcleos, vigila el ancho de banda de memoria.
  • 64+ hilos útiles: los núcleos y los canales de memoria dominan; la topología y NUMA se vuelven el precipicio oculto.

La caché suele valer más de lo que presupuestas

Muchos servicios de producción son “limitados por CPU” solo porque están estancados en memoria. Si ves CPI alto, IPC bajo y muchos fallos de caché,
una CPU con más caché (o mejor comportamiento de caché) puede superar a una parte de mayor reloj. Esta es la forma menos sexy de ganar rendimiento y
la más repetible.

Canales de memoria, frecuencia y capacidad: el limitador silencioso

Si tu conjunto de trabajo no cabe en caché, ahora estás en el negocio de la memoria. Más núcleos sin suficiente ancho de banda de memoria se convierten en
“ocio caro”. Además, la capacidad de memoria es una característica de rendimiento: mantenerse fuera del swap y del thrash del page cache vence casi cualquier actualización de CPU.

NUMA y topología: el rendimiento que pierdes sin notarlo

En sistemas de doble socket (e incluso en algunos diseños complejos de un solo socket), la localidad de memoria importa. El acceso a memoria remota puede añadir latencia,
reducir ancho de banda e incrementar la varianza—especialmente visible en p99.

Si vas a multi-socket, presupuestar tiempo para:

  • Planificación NUMA-aware (systemd CPUAffinity, Kubernetes CPU Manager, pinning de procesos de BD).
  • Validar que tus NICs y dispositivos NVMe estén conectados al socket que ejecuta la carga.
  • Medir con tráfico real, no con pruebas sintéticas que accidentalmente se mantienen dentro de un nodo NUMA.

LANES PCIe y topología de E/S: la trampa en servidores “de propósito general”

Puedes comprar una CPU con mucha capacidad de cómputo y luego ahogarla con E/S: muy pocos lanes PCIe, root complexes sobresuscritos,
o unidades NVMe colgadas de un switch que comparte ancho de banda de formas que no modelaste. En cinco años, añadirás NICs, más NVMe,
tal vez una GPU, tal vez una DPU. Elige una plataforma con margen.

Límites de potencia y refrigeración: el rendimiento sostenido es el único rendimiento

Las CPUs no “tienen” una frecuencia; la negocian con la física. Si tu chasis, ventiladores o temperaturas de entrada del datacenter son marginales,
tu SKU caro se convierte en uno más barato bajo carga. Esto aparece como “benchmarks extrañamente inconsistentes” y luego como “¿por qué la latencia empeoró?”

La marca no es una estrategia

Compra la pieza que gana en tus métricas, en tu pila de compilador/tiempo de ejecución, en tu envelope de potencia, con tu cadena de suministro. Luego valida.
Eso es todo. El logo es para la factura.

Broma #2: La mejor CPU es la que no te obliga a aprender un nuevo portal de proveedor a las 3 a.m.

Planificación a cinco años: qué cambia y qué no

Cinco años es tiempo suficiente para que tu carga evolucione y corto suficiente para que sigas ejecutando algún legado vergonzoso.
La selección de CPU debe sobrevivir:

  • Actualizaciones de software que cambien características de rendimiento (nuevo comportamiento JIT, nuevos valores por defecto de motores de almacenamiento, nuevo scheduler del kernel).
  • Regímenes de parches de seguridad que pueden afectar el rendimiento microarquitectónico.
  • Nuevos agentes de observabilidad que “solo necesitan un poco de CPU.” Todos lo hacen.
  • Crecimiento en el tamaño de datasets que convierta cargas cache-friendly en cargas limitadas por latencia de memoria.
  • Deriva de plataforma: actualizaciones de BIOS, cambios de microcódigo y características de firmware como valores por defecto de gestión de potencia.

Compra margen en la dimensión correcta

El margen no es “50% más núcleos.” El margen es:

  • Capacidad de memoria para crecer sin hacer swap.
  • Ancho de banda de memoria para que los núcleos añadidos no se queden estancados.
  • Lanes PCIe para expansión sin sobresuscripción de E/S.
  • Margen térmico para que la carga sostenida no baje el reloj.
  • Una familia de SKU que puedas seguir adquiriendo en el año 3 sin rogar.

Prefiere plataformas aburridas cuando la disponibilidad es el producto

Las plataformas de vanguardia están bien cuando tienes un laboratorio, capacidad de sobra y un plan de rollback. Si gestionas un equipo austero,
prefiere la combinación CPU/plataforma con firmware predecible, soporte de kernel maduro y compatibilidad conocida con NIC/HBA.
No te pagan por novedad.

Una cita, porque sigue siendo el mejor consejo de ops

La esperanza no es una estrategia. — James Cameron

Se aplica de manera vergonzosamente buena a la planificación de capacidad y compra de CPU.

Tres microhistorias corporativas desde las trincheras

Microhistoria #1: El incidente causado por una suposición equivocada

Una compañía SaaS mediana migró su capa de API a servidores nuevos que parecían perfectos en papel: más núcleos, generación más nueva,
mejores puntuaciones sintéticas. La carga era un servicio Java con una ruta de autenticación caliente y un montón de pequeñas asignaciones.
Había sido estable por años.

En días, la latencia p99 empezó a dispararse. No la latencia promedio. No la utilización de CPU. Solo p99, en ráfagas que coincidían con picos de tráfico.
El equipo asumió ajuste de GC. Ajustaron tamaños de heap, cambiaron recolectores, hicieron roll forward y back. Los picos persistieron.

La suposición equivocada fue que “más núcleos” mejora automáticamente la latencia de cola. En realidad, la nueva plataforma tenía una topología NUMA diferente,
y su scheduler de contenedores colocaba felizmente el proceso en un socket mientras las asignaciones de memoria venían de otro. Añade un poco de contención de locks
y obtienes una lotería de latencia.

La solución no fue heroica. Fijaron conjuntos de CPU y la política de memoria para los pods críticos de latencia, ajustaron la afinidad de IRQ para que las colas NIC fueran
locales al cómputo y validaron con contadores perf. Los picos p99 desaparecieron. La CPU no era mala. La suposición sí.

Microhistoria #2: La optimización que salió mal

Un equipo de almacenamiento que ejecutaba un objeto store respaldado por ZFS decidió que eran “pesados en CPU”, basándose en top que mostraba mucho tiempo en system durante el ingest pico.
Alguien propuso habilitar compresión agresiva en todas partes y confiar en “CPUs modernas” para hacerlo gratis. Lo desplegaron gradualmente.

El ingest mejoró inicialmente. El dashboard se veía mejor. Luego la ventana semanal de scrub empezó a solaparse con horario laboral porque los scrubs tardaban más.
La latencia de lecturas se volvió más ruidosa y algunos clientes se quejaron de timeouts durante mantenimientos en segundo plano.

La compresión no era la villana; la compresión sin límites sí lo era. El sistema ahora hacía malabares con compresión en primer plano, checksums de scrub en segundo plano
e interrupciones de red en los mismos núcleos. Accidentalmente movieron el cuello de botella del disco a la programación de CPU y presión de caché.

El rollback fue parcial: mantuvieron compresión para datos fríos y ajustaron recordsize y nivel de compresión para buckets calientes.
Más importante, reservaron núcleos para mantenimiento de almacenamiento e aislaron el manejo de interrupciones. El rendimiento volvió y las ventanas de scrub se
volvieron predecibles otra vez. La lección: “La CPU es barata” es una frase peligrosa cuando también necesitas mantenimiento determinista.

Microhistoria #3: La práctica aburrida pero correcta que salvó el día

Una firma de servicios financieros tenía una costumbre que parecía dolorosamente conservadora: antes de aprobar cualquier nueva plataforma de CPU,
corrían un canario en producción durante una semana con tráfico espejado y puertas SLO estrictas. Procurement lo odiaba. Los ingenieros a veces refunfuñaban.
Lentificaba la “innovación”. También prevenía outages.

Durante un ciclo de renovación, un modelo nuevo de servidor pasó benchmarks básicos y pruebas unitarias pero mostró pérdidas de paquetes intermitentes bajo carga sostenida.
Las pérdidas eran lo bastante raras como para que pruebas cortas las perdieran. El canario las atrapó porque corrió lo suficiente para golpear las térmicas reales y
los patrones reales de colas NIC.

Trabajaron con el proveedor y encontraron una interacción firmware + BIOS power management que causaba breves picos de latencia en el manejo de interrupciones.
Una actualización de firmware y un cambio de ajuste en BIOS lo resolvieron. Ningún cliente lo vio. No fue necesaria una revisión de incidentes.

La práctica no era glamorosa: canarios largos, criterios de aceptación aburridos y la negativa a confiar en un solo benchmark.
Así es como se ve “reliability engineering” cuando funciona.

Tareas prácticas: comandos, salidas y decisiones (12+)

Estas son tareas de campo que puedes ejecutar en un servidor candidato (o en uno existente) para entender qué tipo de CPU necesitas.
Cada tarea incluye: el comando, qué significa la salida y la decisión que tomas a partir de ello.

Task 1: Identify CPU model, cores, threads, and sockets

cr0x@server:~$ lscpu
Architecture:                         x86_64
CPU(s):                               64
Thread(s) per core:                   2
Core(s) per socket:                   32
Socket(s):                            1
Model name:                           AMD EPYC 7543 32-Core Processor
NUMA node(s):                         1
L3 cache:                             256 MiB

Qué significa: Ahora conoces tu línea base: 32 núcleos físicos, SMT habilitado, socket único y gran caché L3.

Decisión: Si necesitas latencia predecible, socket único a menudo simplifica NUMA. Si tu carga es orientada a rendimiento, 32 núcleos pueden ser perfectos—o estar hambrientos de ancho de banda de memoria. No adivines; mide.

Task 2: Check CPU frequency behavior under load (governor and scaling)

cr0x@server:~$ cpupower frequency-info
analyzing CPU 0:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 0
  available cpufreq governors: performance powersave
  current policy: frequency should be within 1500 MHz and 3700 MHz.
                  The governor "performance" may decide which speed to use
  current CPU frequency: 3692 MHz (asserted by call to hardware)

Qué significa: Probablemente no estás atascado en un governor de baja potencia. Hay margen de frecuencia hasta ~3.7 GHz.

Decisión: Para nodos críticos de latencia, usa performance y valida relojes sostenidos bajo carga real. Si la frecuencia colapsa bajo carga, necesitas mejor refrigeración/límites de potencia o un SKU diferente.

Task 3: See if you’re CPU-saturated or just “busy”

cr0x@server:~$ mpstat -P ALL 1 3
Linux 6.5.0 (server) 	01/12/2026 	_x86_64_	(64 CPU)

12:00:01 PM  CPU   %usr  %nice   %sys %iowait  %irq  %soft  %steal  %idle
12:00:02 PM  all   62.10   0.00  10.40    0.20  0.10   1.30    0.00  25.90
12:00:02 PM   0   95.00   0.00   4.00    0.00  0.00   0.00    0.00   1.00
12:00:02 PM   1   10.00   0.00   1.00    0.00  0.00   0.00    0.00  89.00

Qué significa: Hay margen global, pero CPU0 está caliente. Eso es un hotspot de scheduling o interrupciones, no “necesitar más núcleos”.

Decisión: Antes de comprar una CPU más grande, arregla el pinning/afinidad de IRQ. Si %idle está cercano a cero en CPUs y la carga escala con la demanda, quizá necesites más cómputo.

Task 4: Check run queue pressure (are you waiting on CPU?)

cr0x@server:~$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 8  0      0 802312  11232 9212440    0    0     0    12 5821 9902 64 11 25  0  0
12  0      0 801900  11232 9212600    0    0     0     0 6001 11022 72 12 16  0  0

Qué significa: r son 8–12 tareas ejecutables. Si eso está consistentemente por encima del conteo de núcleos, estás saturado de CPU. Aquí está por debajo de 64 hilos pero podría estar por encima de núcleos físicos en sistemas más pequeños.

Decisión: Si r está consistentemente alto y la latencia aumenta, necesitas más núcleos o mejor paralelismo. Si wa sube, estás bloqueado en I/O, no en CPU.

Task 5: Determine if memory bandwidth/latency is the limit

cr0x@server:~$ perf stat -a -e cycles,instructions,cache-misses,LLC-load-misses -I 1000 sleep 3
#           time             counts unit events
     1.000349290    3,210,442,991      cycles
     1.000349290    2,120,112,884      instructions
     1.000349290       45,332,100      cache-misses
     1.000349290       12,501,883      LLC-load-misses

     2.000719401    3,188,102,112      cycles
     2.000719401    2,098,554,001      instructions
     2.000719401       46,110,220      cache-misses
     2.000719401       12,980,004      LLC-load-misses

Qué significa: Instructions per cycle está alrededor de 0.65 (2.1B / 3.2B), y los fallos de LLC son significativos. Eso apunta a stalls por memoria.

Decisión: Si tu servicio está pesado en stalls de memoria, elige CPUs con mejor comportamiento de caché e invierte en canales/velocidad de memoria. “Más GHz” no arreglará fallos de caché.

Task 6: Check NUMA layout and distances

cr0x@server:~$ numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0-31
node 0 size: 257837 MB
node 0 free: 210112 MB
node 1 cpus: 32-63
node 1 size: 257838 MB
node 1 free: 211004 MB
node distances:
node   0   1
  0:  10  21
  1:  21  10

Qué significa: Dos nodos NUMA con acceso remoto que cuesta ~2x local (distancia 21 vs 10). Eso es relativamente normal, pero se notará en p99 si lo ignoras.

Decisión: Si ejecutas servicios sensibles a latencia, prefiere socket único o aplica localidad NUMA. Si debes ir dual-socket, planifica pinning y política de memoria desde el día uno.

Task 7: Map PCIe devices to NUMA nodes (NICs, NVMe, HBAs)

cr0x@server:~$ lspci -vv | grep -E "Ethernet|Non-Volatile|NUMA"
3b:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
	NUMA node: 1
41:00.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
	NUMA node: 0

Qué significa: Tu NIC es local al nodo 0, NVMe al nodo 1. Si tu ruta de E/S cruza sockets, acabas de comprarte varianza de latencia.

Decisión: Alinea cargas con sus dispositivos de E/S (fija cómputo cerca de NIC/NVMe) o reubica hardware. Para compras nuevas, elige plataformas con suficientes lanes para evitar ubicaciones incómodas.

Task 8: Identify interrupt hotspots (often mistaken for “CPU needs upgrade”)

cr0x@server:~$ cat /proc/interrupts | head -n 8
           CPU0       CPU1       CPU2       CPU3
  24:  99211231          0          0          0   PCI-MSI 524288-edge      mlx5_comp0@pci:0000:41:00.0
  25:         0   98122010          0          0   PCI-MSI 524289-edge      mlx5_comp1@pci:0000:41:00.0
  26:         0          0   99100110          0   PCI-MSI 524290-edge      mlx5_comp2@pci:0000:41:00.0
  27:         0          0          0   98911220   PCI-MSI 524291-edge      mlx5_comp3@pci:0000:41:00.0

Qué significa: Las interrupciones están bien distribuidas aquí; en muchos sistemas no lo están y una CPU recibe la paliza.

Decisión: Si las interrupciones se acumulan en una CPU, arregla la afinidad de IRQ y los ajustes de colas antes de cambiar CPUs. La latencia de cola mejora dramáticamente con distribución correcta de interrupciones.

Task 9: Check for throttling and thermal limits

cr0x@server:~$ dmesg | grep -iE "thrott|thermal|powercap" | tail -n 5
[ 8921.112233] intel_rapl_common: Found RAPL domain package
[ 9122.445566] CPU0: Core temperature above threshold, cpu clock throttled (total events = 3)
[ 9122.445700] CPU0: Package temperature/speed normal

Qué significa: Estás térmicamente limitando ocasionalmente. Eso es variabilidad de rendimiento que sentirás en p99.

Decisión: Si el throttling aparece bajo carga normal, arregla refrigeración, curvas de ventilador, contacto del disipador o límites de potencia. Si no puedes, no compres el SKU top-bin que solo rinde en un laboratorio ideal.

Task 10: Validate virtualization overhead and steal time

cr0x@server:~$ mpstat 1 3 | tail -n 3
12:10:02 PM  all  40.00   0.00   8.00   0.00   0.00   0.50   7.50  44.00
12:10:03 PM  all  42.00   0.00   9.00   0.00   0.00   0.40   8.20  40.40
12:10:04 PM  all  41.50   0.00   8.80   0.00   0.00   0.60   8.10  41.00

Qué significa: %steal alrededor de 8% indica que tu VM está esperando porque el hypervisor está sobresuscrito o hay vecinos ruidosos.

Decisión: No “arregles” el tiempo de steal actualizando la CPU del guest. Arregla la sobresuscripción del host, reserva CPU o mueve cargas. Para compras, asegúrate de que los hosts tengan suficientes núcleos reales para los objetivos de consolidación.

Task 11: Determine if storage is stealing your cycles (ZFS example)

cr0x@server:~$ zpool iostat -v 1 3
              capacity     operations     bandwidth
pool        alloc   free   read  write   read  write
tank        7.21T  3.12T    980  4.20K  112M  610M
  raidz2    7.21T  3.12T    980  4.20K  112M  610M
    nvme0n1     -      -    120    520  14.0M 72.0M
    nvme1n1     -      -    118    525  13.8M 72.5M
    nvme2n1     -      -    121    515  14.2M 71.2M
    nvme3n1     -      -    119    518  13.9M 71.8M

Qué significa: Estás empujando 610 MB/s de escrituras con 4.2K ops/s. Si la CPU también está alta, checksumming/compresión/paridad puede ser el limitador, no las unidades.

Decisión: Para servidores de almacenamiento, favorece CPUs con suficientes núcleos para mantenimiento y servicios de datos, y asegura memoria abundante. Si el throughput de escritura se platea con la CPU al máximo, necesitas más CPU o distintas elecciones de RAID/compresión.

Task 12: Measure network processing load (softirq pressure)

cr0x@server:~$ sar -n DEV 1 3
Linux 6.5.0 (server) 	01/12/2026 	_x86_64_	(64 CPU)

12:15:01 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s
12:15:02 PM      eth0   120000    118500   980000    910000
12:15:03 PM      eth0   121200    119100   990500    915200

Qué significa: Tasas de paquetes muy altas. Eso es trabajo de CPU (softirq, interrupciones), no solo “ancho de banda de red”.

Decisión: Si la tasa de paquetes es alta, elige CPUs con fuerte rendimiento por núcleo y asegura la afinidad de colas/IRQ de la NIC. A veces menos núcleos más rápidos vencen a más núcleos más lentos para cargas con muchos paquetes.

Task 13: Check context switching and scheduler churn

cr0x@server:~$ pidstat -w 1 3
Linux 6.5.0 (server) 	01/12/2026 	_x86_64_	(64 CPU)

12:18:01 PM   UID       PID   cswch/s nvcswch/s  Command
12:18:02 PM     0      1221    1200.00    300.00  kubelet
12:18:02 PM   999      3456   22000.00   9000.00  java

Qué significa: Altos switches voluntarios y no voluntarios. Eso suele ser contención de locks, demasiados hilos o scheduling ruidoso.

Decisión: Antes de añadir núcleos, reduce conteos de hilos, afina runtimes o aísla cargas. Si no puedes, prefiere mayor rendimiento por núcleo y menos migraciones cross-NUMA.

Task 14: Confirm kernel sees correct mitigations (performance can shift)

cr0x@server:~$ grep -E "Mitigation|Vulnerable" /sys/devices/system/cpu/vulnerabilities/* | head
/sys/devices/system/cpu/vulnerabilities/meltdown:Mitigation: PTI
/sys/devices/system/cpu/vulnerabilities/spectre_v1:Mitigation: usercopy/swapgs barriers and __user pointer sanitization
/sys/devices/system/cpu/vulnerabilities/spectre_v2:Mitigation: Retpolines; IBPB: conditional; STIBP: disabled; RSB filling

Qué significa: No puedes ignorar las mitigaciones de seguridad; influyen en cargas con muchas syscalls y cambios de contexto.

Decisión: Para servicios con muchas syscalls, mide rendimiento con las mitigaciones reales que ejecutarás en producción. No hagas benchmarks con una configuración de kernel de laboratorio que no vas a desplegar.

Manual de diagnóstico rápido: encuentra el cuello de botella pronto

Cuando algo está lento y todos empiezan a discutir sobre CPUs, necesitas un manual corto que corte el ruido.
Esta secuencia está diseñada para triage en producción: mínima herramienta, máxima señal.

Primero: decide si estás limitado por CPU, E/S o esperando otra cosa

  • Ejecuta mpstat para ver idle, iowait y steal time.
  • Ejecuta vmstat para ver la cola ejecutable r y el wait wa.
  • Revisa load average con uptime, pero no lo trates como verdad—trátalo como humo.

Si %idle está bajo y r es alto, plausiblemente estás limitado por CPU.
Si %iowait está alto o aparecen procesos bloqueados, estás limitado por E/S.
Si %steal está alto en VMs, el hypervisor te está robando.

Segundo: clasifica el dolor de CPU (cómputo vs memoria vs scheduler)

  • Usa perf stat para IPC y fallos de caché. IPC bajo + muchos fallos sugiere stalls de memoria.
  • Usa pidstat -w para cambios de contexto. Muchos switches sugieren contención o demasiados hilos.
  • Revisa NUMA con numactl --hardware y la colocación de dispositivos con lspci.

Tercero: busca los pies de plomo específicos de la plataforma

  • Throttling en dmesg (térmico/powercap).
  • Desequilibrio de interrupciones en /proc/interrupts.
  • Mismatch de governor de frecuencia en cpupower frequency-info.
  • Tiempo de steal en virtualización: arregla el dimensionamiento del host, no las CPUs guest.

Cuarto: decide qué cambiar

  • Si está CPU-saturated y escala con la demanda: añade núcleos o divide el servicio.
  • Si está memory-stalled: prioriza caché/canales de memoria; considera menos núcleos más rápidos sobre muchos más lentos.
  • Si es NUMA/topología: pin, alinea dispositivos o prefiere socket único para niveles de latencia.
  • Si es térmico/potencia: arregla refrigeración o deja de comprar SKUs que no puedes sostener.

Errores comunes: síntomas → causa raíz → solución

1) Síntoma: la latencia p99 empeora después de la “actualización”

Causa raíz: Acceso remoto a memoria NUMA, IRQs en el socket equivocado o inestabilidad de frecuencia bajo carga.

Solución: Fija procesos y memoria, alinea NIC/NVMe al mismo nodo NUMA, establece el governor apropiado y verifica que no haya eventos de throttling.

2) Síntoma: uso de CPU es alto, pero el rendimiento no mejora con más núcleos

Causa raíz: Límite de ancho de banda de memoria, contención por locks o thrash de caché. Más núcleos aumentan contención y stalls.

Solución: Mide IPC y fallos de caché, reduce conteos de hilos, shardea o particiona trabajo, o elige una CPU con mejor caché/subsistema de memoria en lugar de más núcleos.

3) Síntoma: picos “aleatorios” durante tráfico pico

Causa raíz: Tormentas de interrupciones, vecinos ruidosos (steal), tareas en segundo plano (scrub, compactación), o throttling térmico.

Solución: Aísla núcleos para IRQs y trabajo en segundo plano, reserva CPU, corre canarios largos y audita térmicas bajo carga sostenida.

4) Síntoma: el load average es alto, pero la CPU no está ocupada

Causa raíz: Tareas bloqueadas en E/S, latencia de almacenamiento o esperas del kernel; el load average cuenta tareas ejecutables e ininterrumpibles.

Solución: Revisa %iowait, estadísticas de almacenamiento y procesos bloqueados. Mejora almacenamiento o arregla la ruta de E/S; no compres CPUs para compensar discos lentos.

5) Síntoma: el servidor de almacenamiento no alcanza velocidades NVMe esperadas

Causa raíz: Sobresuscripción de topología PCIe, ranura mal cableada, root complex compartido o overhead de CPU en checksums/paridad/cifrado.

Solución: Valida la colocación PCIe, asegura suficientes lanes, mide el costo de CPU de las features de almacenamiento y reserva CPU para mantenimiento en segundo plano.

6) Síntoma: el benchmark luce bien, producción luce mediocre

Causa raíz: El benchmark usa un solo hilo, cabe en caché o corre 30 segundos. Producción corre días y falla caché todo el tiempo.

Solución: Haz benchmarks con tamaños de dataset, concurrencia y duración reales. Usa tráfico canario y puertas SLO.

7) Síntoma: el rendimiento cambia después de actualizar firmware/microcódigo

Causa raíz: Cambiaron valores por defecto de gestión de potencia, el comportamiento de mitigaciones cambió o las interacciones con el scheduler se movieron.

Solución: Trata el firmware como una release: prueba, mide, fija ajustes de BIOS y documenta la configuración “conocida buena” para tu flota.

Listas de verificación / plan paso a paso

Pasos: elegir la CPU correcta para un horizonte de 5 años

  1. Escribe la mezcla real de cargas. Incluye tareas en segundo plano (backups, scrubs, compactación, agentes de observabilidad).
  2. Define métricas de éxito. Rendimiento, latencia p99, costo por petición, tiempo de finalización. Elige dos, no diez.
  3. Captura evidencia del cuello de botella actual. Usa mpstat, vmstat, perf stat, NUMA y mapeo de E/S.
  4. Clasifica la forma de la carga. Crítica de latencia vs throughput vs virtualización mixta vs orientada a almacenamiento.
  5. Elige restricciones de plataforma primero. Socket único vs dual, canales/capacidad de memoria, lanes PCIe, plan de NIC/HBA, potencia y refrigeración del rack.
  6. Selecciona 2–3 SKUs candidatos. Uno “seguro”, uno “de rendimiento”, uno “optimizado por costo”.
  7. Corre benchmarks realistas. Mismo kernel, mismas mitigaciones, mismo tamaño de dataset, misma duración de ejecución.
  8. Haz un canario en producción. Tráfico espejado, corre lo bastante para golpear térmicas y ciclos de mantenimiento.
  9. Fija ajustes de BIOS y firmware. Documenta. Hazlos reproducibles en la flota.
  10. Decide con una justificación escrita. Incluye qué optimizas, qué sacrificas y la evidencia.

Lista: no te sorprendan en el año 3

  • Ranuras de memoria libres para expansión, no totalmente pobladas el primer día a menos que sea necesario.
  • Margen de lanes PCIe para añadir NVMe o NICs más rápidas más adelante.
  • Margen de refrigeración probado a carga sostenida en tu chasis real.
  • Capacidad sobrante para mantenimiento en segundo plano (scrubs, compactación, indexación, backups).
  • Chequeo de realidad de la cadena de suministro: ¿puedes comprar la misma plataforma más tarde?
  • Listo el tooling operativo: ¿puedes observar utilización por núcleo, throttling y problemas NUMA?

Lista: ajustes de plataforma para estandarizar (para que el rendimiento no derive)

  • Governor de CPU / perfil de potencia
  • Política SMT (on/off) por clase de carga
  • Política de balanceo NUMA y estrategia de pinning
  • Afinidad de IRQ y configuración de colas NIC
  • Estrategia de fijado de versión de microcódigo y firmware
  • Política de mitigaciones del kernel consistente con la postura de seguridad

Preguntas frecuentes

1) ¿Debería comprar el mayor conteo de núcleos que pueda para “prepararme para el futuro”?

No. Compra la mezcla correcta. Alto conteo de núcleos sin ancho de banda de memoria y efectividad de caché suele empeorar p99 y aumentar costos.
Prepararse para el futuro suele ser capacidad de memoria + margen PCIe + rendimiento sostenido predecible.

2) ¿Es siempre mejor un socket único que dual-socket?

Para capas críticas de latencia, socket único suele ser más fácil de ejecutar bien porque reduces la complejidad NUMA.
Para cómputo orientado a throughput o necesidades masivas de memoria, dual-socket puede ser correcto—si te comprometes a operaciones NUMA-aware.

3) ¿Quiero SMT/Hyper-Threading habilitado?

Depende. SMT puede mejorar el throughput para algunas cargas mixtas. También puede incrementar contención y jitter para servicios sensibles a la latencia de cola.
Prueba ambos modos con carga realista; elige por rol de cluster, no como regla universal.

4) ¿Cómo sé si mi carga está limitada por latencia de memoria?

IPC bajo, muchos fallos de caché/LLC y escalado débil con más núcleos son signos clásicos. Usa perf stat para chequear instructions vs cycles y fallos de caché,
y valida con tamaños de dataset que coincidan con producción.

5) ¿Son inútiles los benchmarks sintéticos?

No inútiles—peligrosos cuando se usan solos. Sirven para detectar regresiones obvias y defectos de hardware.
Son malos predictores de latencia de cola, efectos NUMA, problemas de topología de E/S y comportamiento térmico sostenido.

6) ¿Qué importa más para hosts de virtualización: núcleos o frecuencia?

Ambos, pero no ignores la memoria. La consolidación necesita núcleos; inquilinos ruidosos y overhead de red/almacenamiento suelen castigar bajo rendimiento por núcleo.
Si ejecutas cargas mixtas, normalmente quieres una CPU balanceada más buena capacidad y ancho de banda de memoria.

7) Si usamos ZFS o Ceph, ¿debemos priorizar la CPU más de lo habitual?

Sí. Las features de almacenamiento modernas son features de CPU: checksums, compresión, cifrado, paridad y mantenimiento en segundo plano.
También prioriza memoria (ARC, metadata, caching) y topología PCIe para que tus unidades rápidas no se conviertan en cuello de botella aguas arriba.

8) ¿Cuándo es racional pagar por partes “top bin”?

Cuando estás limitado por latencia en unos pocos hilos calientes y puedes mantener la CPU lo bastante fría para sostener relojes altos.
Si tu chasis o datacenter no pueden sostenerlo, la prima se dona mayormente a la física.

9) ¿Cómo pensar en consumo de energía a cinco años?

La energía no es solo costo; también es estabilidad de rendimiento. Una plataforma siempre al borde de potencia/térmicas será ruidosa.
Elige una CPU que entregue el rendimiento necesario dentro de tu realidad de potencia y refrigeración en rack, no un folleto.

10) ¿Cuál es el mayor “indicio” de que estamos eligiendo CPUs por logo?

Cuando la evaluación termina en “este benchmark es más alto”, sin aclarar qué métrica estás optimizando (p99 vs throughput) y sin un plan canario.
Si no puedes describir tu cuello de botella con mediciones, estás comprando emocionalmente.

Próximos pasos que puedes hacer esta semana

Si quieres una decisión de CPU que no lamentes en cinco años, haz el trabajo poco glamuroso ahora:

  1. Perfila un host representativo usando los comandos arriba y anota qué te está limitando realmente.
  2. Decide tu métrica principal: latencia p99, throughput o costo por unidad. Elige una primaria y una secundaria.
  3. Construye una lista candidata de 2–3 CPUs e incluye restricciones de plataforma: canales de memoria, lanes PCIe y refrigeración.
  4. Ejecuta una prueba larga (horas, no minutos). Incluye mantenimiento en segundo plano (scrub, backups, compactación) en la ventana de prueba.
  5. Canary en producción con tráfico espejado y un switch de rollback. Aburrido, sí. Efectivo, absolutamente.
  6. Documenta la decisión con evidencia: qué mediste, qué elegiste y qué no optimizaste intencionalmente.

El objetivo no es elegir la “mejor” CPU. El objetivo es elegir la CPU que haga que tus cargas específicas sean aburridas de operar, durante mucho tiempo.

]]>
https://cr0x.net/es/elegir-cpu-por-carga-de-trabajo/feed/ 0
3D V-Cache / X3D: por qué la caché se convirtió en el truco definitivo para jugar https://cr0x.net/es/3d-v-cache-x3d-cache-rendimiento/ https://cr0x.net/es/3d-v-cache-x3d-cache-rendimiento/#respond Thu, 29 Jan 2026 12:18:41 +0000 https://cr0x.net/3d-v-cache-x3d-cache-rendimiento/ Compraste una GPU rápida, bajaste las sombras como un adulto responsable y tu contador de FPS sigue haciendo danza interpretativa.
No promedios bajos: picos. Tartamudeos. Esas muertes en shooters de “juro que hice clic” que se sienten como si tu teclado estuviera negociando condiciones laborales.

Esto normalmente no es un problema de “más núcleos”. Es un problema de “dejar de esperar la memoria”.
3D V-Cache (los CPUs X3D de AMD) no ganaron en juegos por fuerza bruta. Ganaron eliminando excusas—específicamente, la excusa más común del CPU:
“Me encantaría renderizar ese fotograma, pero mis datos están en la RAM y me siento un poco… latente.”

La caché es el juego: por qué los fotogramas mueren esperando

Un fotograma moderno de un juego es un motín sincronizado: simulación, animación, físicas, visibilidad, scripting, audio, envío de draw calls,
redes y una pila de controladores que cortésmente finge que no está haciendo trabajo.
La GPU recibe la mayor parte de la culpa porque es ruidosa y cara, pero muchos desastres en el tiempo de fotograma empiezan del lado de la CPU como
pipelines bloqueados, fallos de caché y latencia de memoria.

Aquí está la versión sobria: las CPU son rápidas haciendo operaciones sobre datos que ya están cerca. Son malas esperando datos que no lo están.
La RAM no es “lenta” en el sentido de 1998. Está simplemente lejos en términos de latencia, y la latencia es lo que mata la consistencia del tiempo de fotograma.
El FPS promedio puede verse bien mientras el 1% bajo se desploma porque un hilo sigue yendo fuera del chip por datos.

Si eres SRE, esto te sonará familiar. El rendimiento no es la única métrica. La latencia en la cola es donde la experiencia de usuario muere.
El equivalente en juegos son los tiempos de fotograma. El “fotograma en el percentil 99” es lo que sientes.

Un fallo de caché de CPU es como una llamada API síncrona a una dependencia que “usualmente responde rápido”. “Usualmente” no es un plan.
3D V-Cache es, básicamente, una estrategia para reducir la frecuencia de esas llamadas haciendo el conjunto de trabajo local más grande.

Por qué las cachés más grandes importan más de lo que crees

Las conversaciones sobre rendimiento de CPU adoran los relojes y el conteo de núcleos porque son fáciles de vender. La caché es más difícil de comercializar:
no es una unidad que puedas sentir… hasta que lo haces.
La cuestión es que muchos juegos tienen conjuntos de datos calientes que son demasiado grandes para una L3 tradicional pero lo bastante pequeños para caber en una mucho mayor:
estado de IA, estructuras de mundo/visibilidad, rejillas de fase amplia de físicas, rigs de animación, arrays de componentes de entidad y ese tipo de “contabilidad”
que nunca aparece en un tráiler.

Cuando ese conjunto de datos cabe en la caché, la CPU hace trabajo útil. Cuando no, la CPU espera.
3D V-Cache no hace la CPU más inteligente. Simplemente la mantiene menos aburrida.

Broma #1: La caché es como un buen administrador de sistemas: invisible hasta que falta, y entonces de repente todo el mundo tiene opiniones.

Qué es realmente 3D V-Cache (y qué no es)

El “3D V-Cache” de AMD es una técnica de empaquetado: apilar caché L3 adicional verticalmente sobre un dado de cómputo de CPU (CCD) usando
through-silicon vias (TSVs) y hybrid bonding. Las referencias de producto “X3D” son CPUs de consumo que se envían con esta caché apilada.

Lo clave: esto no es “más caché en algún lugar de la placa madre.” Está en el paquete, lo suficientemente cerca como para comportarse como L3,
con características de latencia mucho más cercanas a L3 que a la RAM.
Estás ampliando la caché de último nivel para que más del conjunto de trabajo del juego permanezca en chip, reduciendo accesos a memoria fuera del dado.

Qué no es

  • No es VRAM: no ayuda a la GPU a almacenar texturas. Ayuda a que la CPU alimente a la GPU de forma más consistente.
  • No es ancho de banda mágico: no hace la DRAM más rápida; hace que la DRAM sea menos necesaria para datos calientes.
  • No es un acelerador universal: algunas cargas requieren frecuencia, ancho vectorial o ancho de banda de memoria, y la caché no las solucionará.
  • No es gratis: apilar caché afecta las térmicas y normalmente limita las frecuencias y voltajes máximos.

Modelo mental práctico

Imagina el “bucle caliente” de un motor de juego que toca constantemente unos pocos cientos de megabytes de datos dispersos.
L1 y L2 de tu núcleo son demasiado pequeñas, L3 es la última oportunidad realista para evitar la RAM, y la latencia de RAM es tu enemiga.
3D V-Cache aumenta la probabilidad de que un acceso acierte en L3 en lugar de fallar y llegar a DRAM.
Eso se traduce en menos bloqueos, tiempos de fotograma más ajustados y menos momentos de “¿por qué justo ahí se ha congelado?”

Por qué a los juegos les encanta la L3: la historia real de la carga de trabajo

Los juegos no son como los renders de Blender o las codificaciones de vídeo. Ni siquiera son como la mayoría de cargas de trabajo “productivas” de escritorio.
Los juegos son una mezcla de:

  • Muchas tareas pequeñas con plazos estrictos (terminar el fotograma a tiempo).
  • Patrones de acceso a memoria irregulares (seguir punteros, grafos de escena, listas de entidades).
  • Puntos de sincronización (hilo principal espera a trabajadores, GPU espera a la sumisión de la CPU).
  • Transmisión de assets y descompresión en ráfagas.

En este entorno, la CPU a menudo está limitada por la latencia de memoria en la ruta crítica. Por eso verás que los chips X3D
ganan más en títulos con simulación pesada y muchas entidades, o en entornos competitivos a 1080p/1440p donde la GPU no es el factor limitante.

“Más caché” se convierte en “menos espera”

El tartamudeo suele ser una micro-historia de una cascada de fallos de caché:
una búsqueda por punteros falla en L2, falla en L3, va a DRAM; la línea traída contiene datos que necesitabas hace tres microsegundos;
ahora tu núcleo está listo para trabajar… en el siguiente fotograma.
Haz la L3 lo bastante grande y sorprendentemente gran parte de esa cadena nunca ocurre.

La estabilidad del tiempo de fotograma vence al FPS pico

La firma de X3D a menudo no es un FPS máximo más alto sino mejores 1% y 0.1% bajos—menos latencia en la cola.
Eso se nota como “se siente más suave” incluso cuando los promedios están cerca.
Y es por eso que quienes microbenchmarkean solo con FPS promedio a veces pierden lo que realmente ocurre.

Dónde X3D no ayuda (o ayuda menos)

Si estás limitado por la GPU (4K ultra con trazado de rayos, upscaling desactivado o simplemente una GPU de gama media), la caché de la CPU no es el cuello de botella.
Si haces cómputo de producción vectorizado que barre grandes arrays (algunos códigos científicos),
el ancho de banda y el rendimiento de instrucciones dominan.

Además: si tu motor de juego ya está bien estructurado con localización de datos ajustada, el valor marginal de una L3 más grande es menor.
Eso es raro, pero ocurre.

Los compromisos: frecuencia, térmicas y “depende”

Los CPUs X3D están diseñados con restricciones. Apilar caché cambia el flujo de calor y limita el margen de voltaje.
Normalmente verás relojes de boost más bajos que sus homólogos sin X3D, y el overclock suele estar restringido.
A cambio, obtienes un tipo diferente de rendimiento: menos sensibilidad a la latencia de memoria y mejores tasas de acierto en caché.

Realidad térmica

La capa de caché apilada no es solo lógica; es una estructura física que afecta la densidad térmica.
El calor tiene que atravesar más material antes de llegar al disipador.
Eso no significa que X3D sea “más caliente” de forma simplista, pero sí que el comportamiento de boost, los relojes sostenidos y la calidad de la refrigeración
interactúan de forma diferente.

Particularidades de plataforma y del planificador

Las piezas X3D multi-CCD pueden tener caché asimétrica: un CCD con caché apilada, otro sin ella (según generación/SKU).
Eso obliga a decisiones de planificación: idealmente, los hilos del juego deben aterrizar en el CCD rico en caché.
Windows ha mejorado en esto con controladores de chipset y heurísticas de Game Mode, pero aún puedes perder rendimiento
si el SO distribuye hilos “justamente” en lugar de “inteligentemente”.

Ajuste de memoria: menos importante, no irrelevante

Una L3 más grande reduce la dependencia de la DRAM para datos calientes, por lo que la velocidad de RAM suele ser menos crítica que en partes no-X3D.
Pero “menos crítico” no significa “irrelevante.” Temporizaciones pobres, EXPO/XMP inestables o relaciones de fabric subóptimas aún pueden arruinar tu día,
especialmente en escenarios competitivos vinculados a la CPU.

Hechos e historia: el contexto que la gente olvida

La caché no se volvió importante de repente en 2022. Ha estado manejando el espectáculo en silencio durante décadas.
Algunos puntos de contexto concretos que vale la pena recordar:

  1. Las CPUs tempranas corrían cerca de la velocidad de la RAM. A medida que los relojes de CPU aceleraron, “la pared de la memoria” se convirtió en una limitación definitoria.
  2. La caché L2 solía estar fuera del dado. En los 90, muchos sistemas tenían chips de caché externos; mover la caché on-die fue un gran salto de rendimiento.
  3. Los chips de servidor persiguieron caché mucho antes que los jugadores. Las caches grandes de último nivel eran una táctica estándar para bases de datos y cargas virtualizadas.
  4. Las consolas entrenaron a los desarrolladores para apuntar a presupuestos de CPU fijos. Eso empujó a los motores hacia un pacing predecible de fotogramas, pero la variabilidad en PC reintroduce el dolor de caché/memoria.
  5. La era de chiplets de AMD hizo visible la topología de caché. Los diseños divididos CCD/IO-die hicieron las diferencias de latencia más pronunciadas—y medibles.
  6. El apilado 3D no es nuevo; ahora es asequible a escala. TSVs y empaquetado avanzado existían desde hace años, pero la economía de consumo finalmente se alineó.
  7. Los juegos migraron hacia simulación más pesada. Más entidades, mundos más abiertos, más sistemas en segundo plano—más estado caliente que mantener cerca.
  8. El análisis de tiempos de fotograma maduró. La industria pasó del FPS promedio a los tiempos percentílicos de fotograma, exponiendo la latencia de cola relacionada con caché.

Si no te llevas nada más: X3D no “rompió” los benchmarks de juegos. Expuso lo que ya era cierto—la latencia de memoria ha sido el recaudador de impuestos
para el rendimiento moderno de CPU. X3D simplemente redujo tu ingreso imponible.

Guía de diagnóstico rápido: qué comprobar primero/segundo/tercero

Este es el flujo de trabajo de “dejar de adivinar”. Puedes hacerlo en un equipo gaming, una caja de benchmark o una flota de escritorios.
El objetivo es decidir: limitado por GPU, limitado por CPU (cómputo), limitado por CPU (memoria/latencia) o “algo roto”.

1) Primero: identifica el limitador (GPU vs CPU) en 2 minutos

  • Baja resolución o escala de renderizado. Si los FPS apenas cambian, estás limitado por la CPU. Si los FPS suben, eras GPU-limited.
  • Observa la utilización de la GPU. Un ~95–99% sostenido sugiere limitación por GPU. Una utilización oscilante con picos de fotogramas sugiere problemas de pacing del lado de la CPU.

2) Segundo: confirma si el límite de CPU tiene sabor a caché/latencia

  • Revisa los percentiles de tiempo de fotograma. Si los promedios están bien pero los 1% bajos son feos, sospecha latencia de memoria y planificación.
  • Busca alto cambio de contexto y migración. Hilos rebotando entre núcleos/CCDs pueden romper la localidad de caché.
  • Mide la latencia de DRAM y las relaciones de fabric. Memoria mal configurada puede hacer que una CPU “se sienta” más lenta que su hoja de especificaciones.

3) Tercero: verifica las suposiciones de la plataforma

  • Ajustes de BIOS: estabilidad EXPO/XMP, CPPC preferred cores, ajustes PBO, límites térmicos.
  • SO: controlador de chipset correcto, comportamiento del planificador actualizado, Game Mode, plan de energía no atascado en “ahorro de energía”.
  • Ruido de fondo: ganchos de overlay, herramientas de captura, software de control RGB con bucles de sondeo (sí, siguen existiendo).

4) Decide: comprar/ajustar/retroceder

Si estás limitado por CPU y el perfil grita “esperando memoria”, X3D suele ser la solución más limpia: cambia la forma del cuello de botella.
Si estás limitado por GPU, no compres un X3D para solucionarlo. Gasta en GPU, ajusta configuraciones gráficas o acepta las físicas.

Tareas prácticas: comandos que zanjan discusiones

Estos son comandos reales y ejecutables. Cada uno incluye qué significa la salida y qué decisión tomar a partir de ella.
La mayoría están orientados a Linux porque Linux es honesto sobre lo que hace, pero mucho aplica conceptualmente a Windows.
Úsalos para benchmarking, resolución de problemas y demostrar si la caché es la historia.

Tarea 1: Confirma modelo de CPU y tamaños de caché

cr0x@server:~$ lscpu | egrep 'Model name|CPU\(s\)|Thread|Core|Socket|L1d|L1i|L2|L3'
Model name:                           AMD Ryzen 7 7800X3D 8-Core Processor
CPU(s):                               16
Thread(s) per core:                   2
Core(s) per socket:                   8
Socket(s):                            1
L1d cache:                            256 KiB (8 instances)
L1i cache:                            256 KiB (8 instances)
L2 cache:                             8 MiB (8 instances)
L3 cache:                             96 MiB (1 instance)

Significado de la salida: El tamaño de L3 es el titular. Las piezas X3D típicamente muestran L3 inusualmente grande (p. ej., 96 MiB).

Decisión: Si L3 es “normal” (p. ej., 32 MiB) y tu carga es sensible a latencia, no esperes comportamiento estilo X3D.

Tarea 2: Verifica que la velocidad y timings de la memoria sean los esperados

cr0x@server:~$ sudo dmidecode -t memory | egrep 'Speed:|Configured Memory Speed:'
Speed: 4800 MT/s
Configured Memory Speed: 6000 MT/s
Speed: 4800 MT/s
Configured Memory Speed: 6000 MT/s

Significado de la salida: “Speed” es la clasificación del módulo; “Configured” es con qué estás realmente funcionando.

Decisión: Si la velocidad configurada está atascada en el valor JEDEC, habilita EXPO/XMP (luego valida estabilidad).
X3D es tolerante, no inmune.

Tarea 3: Comprueba el comportamiento actual de frecuencia de la CPU bajo carga

cr0x@server:~$ lscpu | grep 'MHz'
CPU MHz:                               4875.123

Significado de la salida: Solo una instantánea—úsala para detectar situaciones obvias de “atado a relojes bajos”.

Decisión: Si los relojes están inesperadamente bajos durante el juego, revisa el plan de energía, throttling térmico o límites de BIOS.

Tarea 4: Detectar señales de thermal throttling (vista del kernel)

cr0x@server:~$ dmesg -T | egrep -i 'thermal|thrott'
[Sat Jan 10 10:12:41 2026] thermal thermal_zone0: critical temperature reached, shutting down

Significado de la salida: Ejemplo extremo mostrado. En sistemas más suaves puedes ver throttling o advertencias de zonas térmicas.

Decisión: Si ves eventos térmicos, arregla la refrigeración o ajusta límites antes de culpar a la caché o la GPU.

Tarea 5: Inspeccionar planificación de CPU y migraciones (asesino de localidad de caché)

cr0x@server:~$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 921344  81240 612340    0    0     0     1  412  980 12  4 83  0  0
 3  0      0 920112  81240 612900    0    0     0     0  460 1760 18  5 77  0  0
 2  0      0 919880  81240 613020    0    0     0     0  455 2105 21  6 73  0  0
 4  0      0 919600  81240 613200    0    0     0     0  470 3500 28  7 65  0  0
 2  0      0 919300  81240 613500    0    0     0     0  465 1400 16  5 79  0  0

Significado de la salida: Presta atención a los picos en cs (cambios de contexto). Un switching alto puede indicar churn de hilos y mala localidad.

Decisión: Si los cambios de contexto son enormes durante los momentos de stutter, investiga software en segundo plano, overlays y estrategias de pinning/planificador.

Tarea 6: Averigua qué hilos consumen tiempo CPU (y si es un muro de un solo hilo)

cr0x@server:~$ top -H -p $(pgrep -n game.bin)
top - 10:21:13 up  2:14,  1 user,  load average: 6.20, 5.80, 5.10
Threads:  64 total,   2 running,  62 sleeping,   0 stopped,   0 zombie
%Cpu(s): 38.0 us,  4.0 sy,  0.0 ni, 58.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
42210 cr0x      20   0 5412280 1.2g 21400 R  98.7   7.6   2:01.22 MainThread
42233 cr0x      20   0 5412280 1.2g 21400 S  22.1   7.6   0:24.10 RenderWorker

Significado de la salida: Un “MainThread” pegado cerca del 100% sugiere un cuello de botella de un solo hilo—a menudo sensible a caché y latencia.

Decisión: Si un hilo es el muro, persigue pacing de fotogramas, comportamiento de caché de CPU y planificación; más GPU no ayudará.

Tarea 7: Muestrea hotspots de CPU y si estás bloqueando (perf)

cr0x@server:~$ sudo perf top -p $(pgrep -n game.bin)
Samples: 12K of event 'cycles', Event count (approx.): 8512390123
  9.80%  game.bin        [.] UpdateVisibility
  7.45%  game.bin        [.] PhysicsBroadphase
  6.12%  game.bin        [.] AI_Tick
  4.22%  libc.so.6       [.] memcpy
  3.70%  game.bin        [.] SubmitDrawCalls

Significado de la salida: Esto te dice dónde van los ciclos. Si ves mucho memcpy y funciones de recorrido, el comportamiento de caché importa.

Decisión: Si los hotspots son traversal/visibility/AI y no matemáticas puras, una caché estilo X3D puede ayudar más que la frecuencia bruta.

Tarea 8: Revisa contadores de hardware para fallos de caché (vista de alto nivel)

cr0x@server:~$ sudo perf stat -e cycles,instructions,cache-references,cache-misses -p $(pgrep -n game.bin) -- sleep 10
 Performance counter stats for process id '42210':

   21,503,112,044      cycles
   28,774,550,112      instructions              #    1.34  insn per cycle
    1,903,112,881      cache-references
      214,332,910      cache-misses              #   11.26% of all cache refs

      10.002131833 seconds time elapsed

Significado de la salida: Altas tasas de fallos de caché y bajo IPC (instrucciones por ciclo) suelen indicar espera por memoria.

Decisión: Si la tasa de fallos es alta durante escenas de juego que tartamudean, una L3 más grande (o mejor localidad) es una solución racional.

Tarea 9: Detecta efectos NUMA/CCD (a dónde van los accesos de memoria)

cr0x@server:~$ numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
node 0 size: 31944 MB
node 0 free: 21012 MB

Significado de la salida: En muchos escritorios verás un solo nodo NUMA, pero en algunas plataformas verás múltiples.

Decisión: Si existen múltiples nodos, el acceso cruzado incrementa la latencia. Considera fijar o asegurar que el juego permanezca local.

Tarea 10: Fija un proceso a un subconjunto de CPUs para probar hipótesis de planificación

cr0x@server:~$ taskset -cp 0-7 $(pgrep -n game.bin)
pid 42210's current affinity list: 0-15
pid 42210's new affinity list: 0-7

Significado de la salida: Estás limitando hilos a los núcleos 0–7. En sistemas multi-CCD esto puede mantenerte en un CCD (según el mapeo).

Decisión: Si el pacing mejora al fijar, probablemente tenías problemas de migración/localidad de caché. Arregla ajustes del planificador o la pila BIOS/controlador.

Tarea 11: Valida latencia de almacenamiento durante búsquedas de stutter (streaming de assets)

cr0x@server:~$ iostat -xz 1 5
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          18.20    0.00    3.40    6.80    0.00   71.60

Device            r/s     w/s   rKB/s   wKB/s  avgrq-sz avgqu-sz   await  %util
nvme0n1         120.0    35.0  8200.0  2400.0      80.0     2.10   12.40  92.00

Significado de la salida: Alto await y %util durante stutters sugiere que la unidad está saturada o la latencia está subiendo.

Decisión: Si el almacenamiento es el culpable, X3D no te salvó. Ajusta settings de streaming, mueve el juego a almacenamiento más rápido o reduce I/O en segundo plano.

Tarea 12: Revisa presión de memoria y swap (generador instantáneo de stutter)

cr0x@server:~$ free -h
               total        used        free      shared  buff/cache   available
Mem:            31Gi       25Gi       1.2Gi       1.1Gi       4.8Gi       4.2Gi
Swap:          8.0Gi      2.5Gi       5.5Gi

Significado de la salida: El uso de swap no siempre es fatal, pero el swapping activo durante el juego suele ser catastrófico para los tiempos de fotograma.

Decisión: Si hay swap en juego, cierra apps que consumen memoria, añade RAM o arregla fugas. La caché no vence al disco.

Tarea 13: Observa fallos de página mayores (muestra streaming/descompresión o problemas de memoria)

cr0x@server:~$ pidstat -r -p $(pgrep -n game.bin) 1 5
Linux 6.5.0 (server)  01/10/2026  _x86_64_  (16 CPU)

10:27:01 AM   UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command
10:27:02 AM  1000     42210    120.00      0.00 5412280 1254300   3.92  game.bin
10:27:03 AM  1000     42210    180.00      4.00 5412280 1259800   3.94  game.bin
10:27:04 AM  1000     42210    160.00      0.00 5412280 1259900   3.94  game.bin

Significado de la salida: Los fallos mayores (majflt/s) indican que el proceso está esperando páginas respaldadas en disco—malo para el pacing en tiempo real.

Decisión: Si los fallos mayores se correlacionan con los tirones, reduce la presión de memoria, asegura que los archivos del juego estén en almacenamiento rápido y evita escaneos en segundo plano agresivos.

Tarea 14: Mide la latencia de memoria rápidamente (heurística simple vía lmbench si está presente)

cr0x@server:~$ /usr/bin/lat_mem_rd 128 4
"stride=128 bytes
128.000000 3.2
256.000000 3.4
512.000000 3.5
1024.000000 3.7
2048.000000 4.1
4096.000000 5.0
8192.000000 7.2
16384.000000 10.8
32768.000000 14.5
65536.000000 62.0
131072.000000 66.0

Significado de la salida: La latencia salta cuando el conjunto de trabajo supera niveles de caché; el gran salto cerca de 64 MiB+ suele indicar salir de la LLC y golpear DRAM.

Decisión: Si el conjunto caliente de tu carga cruza el límite de LLC en no-X3D pero se mantiene dentro en X3D, has encontrado el “truco”.

Tarea 15: Verifica la velocidad del enlace PCIe (porque a veces está roto)

cr0x@server:~$ sudo lspci -vv | sed -n '/VGA compatible controller/,/Capabilities/p' | egrep 'LnkCap|LnkSta'
LnkCap: Port #0, Speed 16GT/s, Width x16
LnkSta: Speed 16GT/s, Width x16

Significado de la salida: Si la GPU está funcionando accidentalmente a x4 o a baja velocidad, obtendrás rendimiento raro y stutter.

Decisión: Arregla la elección de ranura física, ajustes de BIOS o cables riser antes de empezar a adorar la caché.

Tres micro-historias corporativas desde el frente

Micro-historia 1: El incidente causado por una suposición equivocada (“Es bound por cómputo”)

Un estudio de juegos mediano montó un laboratorio CI de máquinas de build-y-benchmark para detectar regresiones de rendimiento temprano.
El laboratorio tenía una mezcla de CPUs de alto reloj y algunas variantes con mucha caché. Los resultados iniciales parecían ruidosos, y el equipo decidió que el ruido era “varianza del driver de GPU.”
Así que normalizaron todo alrededor del FPS promedio y listo.

Semanas después, se lanzó un parche y los jugadores se quejaron de “tartamudeos aleatorios” en áreas concurridas.
El FPS promedio en sus dashboards internos parecía aceptable. La gerencia obtuvo lo que quería: un gráfico que no parecía aterrador.
El equipo de soporte obtuvo lo que no quería: mil tickets que sonaban a superstición.

Cuando SRE finalmente sacó un rastro, el tartamudeo coincidía con un bloqueo del hilo principal desencadenado por actualizaciones de visibilidad de entidades.
El bloqueo no era lo bastante grande para aplastar el FPS promedio, pero sí lo bastante grande para arruinar los 1% bajos.
En CPUs con mucha caché, el conjunto caliente se mantenía en LLC y el bloqueo casi desaparecía. En CPUs de alto reloj y caché menor, se derramaba a DRAM y se disparaba.

La suposición equivocada fue simple: “Si la CPU está al 60% de utilización, no puede estar limitada por CPU.”
Pero la utilización miente en sistemas en tiempo real. Un hilo saturado en la ruta crítica es un paro completo, incluso si quince hilos más están tomando café.

La solución no fue “comprar X3D para todos.” Cambiaron la puerta del benchmark para incluir percentiles de tiempo de fotograma y agregaron una prueba de regresión específicamente para el escenario concurrido.
También refactorizaron la estructura de visibilidad para mejorar la localidad. El rendimiento dejó de ser misterioso una vez que midieron lo correcto.

Micro-historia 2: La optimización que salió mal (“Hagámoslo más denso”)

Una compañía de servicios financieros tenía una herramienta interna de visualización 3D usada en salas de incidentes: topología en vivo, métricas en streaming y una línea de tiempo sofisticada.
Debía ser responsiva mientras se compartía pantalla.
Alguien la perfiló y encontró mucho tiempo paseando grafos de objetos—territorio clásico de fallos de caché—así que intentaron una “reescritura orientada a datos.”

Empaquetaron estructuras agresivamente, cambiaron a bitfields y comprimen IDs.
En papel, redujo significativamente la huella de memoria. En microbenchmarks, la iteración fue más rápida.
En producción, el pacing de fotogramas empeoró. No siempre. Lo suficiente como para ser exasperante.

El fracaso vino por un detalle que nadie respetó: la reescritura aumentó la ramificación y añadió más indireccionamiento por punteros en el camino caliente.
Las estructuras más pequeñas mejoraron la densidad de caché, pero los pasos de decodificación extra crearon cadenas de dependencia y más ramas impredecibles.
La CPU gastó menos ciclos esperando DRAM pero más ciclos bloqueada por mispredicciones y operaciones serializadas.

En CPUs clase X3D, el cambio parecía “aceptable” porque la L3 ampliada enmascaró parte del daño.
En CPUs normales, pareció una regresión. El equipo había optimizado accidentalmente para el perfil hardware mejor.

La solución eventual fue aburrida: revertir el empaquetado inteligente en el camino caliente, mantenerlo en almacenamiento “frío” y reestructurar bucles para reducir la indirección.
Aprendieron la lección adulta: una optimización que gana un microbenchmark puede perder el producto.

Micro-historia 3: La práctica aburrida pero correcta que salvó el día (pinning e invariantes)

Una compañía que ofrecía visualización remota para CAD tenía una flota de estaciones de trabajo con SKUs de CPU mixtos,
incluyendo algunas piezas con caché apilada para sesiones sensibles a la latencia. Los usuarios se quejaban de que “algunas máquinas se sienten suaves, otras pegajosas.”
El servicio era el mismo. Las GPUs eran las mismas. El soporte culpó a la red porque siempre es la red.

Un SRE escribió tres invariantes: (1) el proceso de sesión debe permanecer en un dominio NUMA, (2) el hilo de render debe preferir cores ricos en caché cuando estén presentes,
(3) no hay trabajos de mantenimiento en segundo plano durante sesiones activas.
Luego hicieron cumplir esas invariantes con un pequeño wrapper que estableció afinidad de CPU y prioridades de cgroup.

La varianza de rendimiento cayó inmediatamente. No porque “optimizaran” algo—porque eliminaron la aleatoriedad.
La migración de hilos había estado destrozando la localidad de caché y cruzando ocasionalmente rutas de interconexión más lentas.
En CPUs con caché apilada, las migraciones eran menos dañinas; en máquinas con caché menor, eran brutales.

La solución no fue glamorosa. Tampoco requirió comprar hardware nuevo.
Requirió admitir que la planificación es parte del diseño del sistema, no un detalle de implementación.

Errores comunes: síntoma → causa raíz → solución

1) Síntoma: FPS promedio alto, terribles 1% bajos

Causa raíz: Bloqueos del hilo principal por fallos de caché, streaming de assets o migración de hilos; los promedios ocultan la latencia en la cola.

Solución: Benchmarkea percentiles de tiempo de fotograma; reduce migraciones (actualiza drivers, prueba Game Mode, tests de afinidad); asegura RAM estable; considera X3D para títulos limitados por latencia.

2) Síntoma: El chip X3D “no supera” al no-X3D en tu juego

Causa raíz: Estás limitado por GPU, o el conjunto caliente del juego ya cabe en la caché normal, o el escenario de benchmark no está limitado por CPU.

Solución: Baja resolución/escala de render para probar el límite de CPU; elige escenas pesadas de CPU; compara 1% bajos, no solo promedios.

3) Síntoma: Rendimiento regresó tras habilitar EXPO/XMP

Causa raíz: Inestabilidad de memoria causando corrección de errores, reintentos, eventos tipo WHEA o problemas sutiles de temporización que aparecen como tartamudeos.

Solución: Reduce velocidad/timings de la memoria; actualiza BIOS; valida con tests de estrés; mantén relaciones de fabric sensatas para la plataforma.

4) Síntoma: Tartamudeos aleatorios que no se correlacionan con utilización CPU o GPU

Causa raíz: Picos de latencia de almacenamiento, fallos de página, escaneos en segundo plano o ganchos de captura/overlay que causan stalls periódicos.

Solución: Revisa iostat, fallos mayores y servicios en segundo plano; mueve el juego a un SSD rápido; desactiva tareas en segundo plano agresivas durante la sesión.

5) Síntoma: X3D multi-CCD rinde peor de lo esperado

Causa raíz: El planificador coloca hilos críticos en el CCD sin V-Cache; el hopping de hilos destruye la localidad.

Solución: Asegura controladores de chipset y actualizaciones del SO; usa Game Mode; prueba con afinidad; evita “optimizadores” de cores manuales que peleen con el planificador.

6) Síntoma: Resultados de benchmark varían muchísimo entre ejecuciones

Causa raíz: Varianza en boost térmico, tareas en segundo plano, escena de juego inconsistente, compilación de shaders o límites de potencia.

Solución: Ejecuta runs de calentamiento; fija plan de energía; registra temperaturas/relojes; limpia caché de shaders o precompila; mantiene la ruta de prueba idéntica.

7) Síntoma: “Sientes” input lag incluso con FPS alto

Causa raíz: Jitter en el pacing de fotogramas, no FPS crudos; bloqueos de CPU pueden retrasar la sumisión; settings de buffering pueden amplificarlo.

Solución: Sigue tiempos de fotograma; reduce bloqueos de CPU (caché/localidad); ajusta opciones de latencia en el juego; asegura VRR y estrategia de cap adecuadas.

Broma #2: Optimizar para FPS promedio es como alardear que tu servicio tiene “cinco nueves” de disponibilidad porque estuvo arriba durante tu hora de almuerzo.

Listas de verificación / plan paso a paso

A. Lista de decisión de compra (X3D o no)

  1. Define tu objetivo: 1080p/1440p competitivo alta tasa de refresco (probablemente limitado por CPU) vs 4K para efectos visuales (probablemente GPU-limited).
  2. Identifica tus peores juegos: los que tartamudean, no los que hacen buenos benchmarks.
  3. Prueba el límite de CPU: baja resolución/escala; si los FPS apenas cambian, la CPU es el limitador.
  4. Mira percentiles de tiempo de fotograma: si los 1% bajos son malos, la caché es sospechosa.
  5. Revisa restricciones de plataforma: calidad de refrigeración, madurez del BIOS y si estás dispuesto a cambiar picos de reloj por consistencia.
  6. Elige X3D cuando: estés limitado por CPU en escenas reales, especialmente con simulación pesada o muchos conteos de entidades.
  7. Evita X3D cuando: siempre estás limitado por GPU, o tu carga principal es productividad dependiente de frecuencia donde la caché no ayuda.

B. Metodología de benchmark (deja de engañarte)

  1. Usa el mismo archivo guardado / ruta / replay.
  2. Haz una ejecución de calentamiento para evitar sesgo de compilación de shaders.
  3. Registra tiempos de fotograma y percentiles, no solo FPS promedio.
  4. Registro de relojes y temperaturas para poder explicar la varianza.
  5. Realiza al menos 3 iteraciones; toma la mediana, no la mejor.
  6. Cambia una variable a la vez (CPU, RAM, ajuste BIOS).

C. Lista de ajuste para sistemas X3D (seguro, aburrido, efectivo)

  1. Actualiza el BIOS a una versión estable para tu plataforma.
  2. Instala el controlador de chipset; asegura que las características del planificador del SO estén activadas.
  3. Activa EXPO/XMP, luego valida la estabilidad; si es inestable, reduce velocidad/timings.
  4. Usa un plan de energía sensato; evita límites de “estado mínimo del procesador” demasiado agresivos.
  5. Mantén una refrigeración competente; evita acantilados térmicos que causen oscilación de boost.
  6. No apiles utilidades “optimizadoras” que fijen hilos al azar.
  7. Valida con juegos reales y percentiles de tiempo de fotograma.

Una cita sobre fiabilidad que vale la pena tener cerca

Idea parafraseada — Werner Vogels: debes planear la falla como una condición normal, no como una excepción.

Esa mentalidad aplica claramente al trabajo de rendimiento en juegos. Planea fallos de caché, rarezas de planificación y stalls de streaming como condiciones normales.
X3D es efectivo porque hace que el caso normal sea menos castigador, no porque haga la falla imposible.

Preguntas frecuentes

¿3D V-Cache aumenta el FPS promedio o solo los 1% bajos?

Ambos pueden mejorar, pero la ganancia más fiable está en los 1% y 0.1% bajos—la estabilidad del tiempo de fotograma.
Si tu juego ya está limitado por GPU, ninguno se moverá mucho.

¿Es X3D “mejor que Intel” para jugar?

En muchos títulos limitados por CPU, las piezas X3D rinden extremadamente bien porque la tasa de aciertos en caché domina.
Pero la plataforma, el SKU y el juego importan. Compara dentro de tu rango de precio y prueba escenarios limitados por CPU, no capturas 4K ultra.

¿Por qué la L3 extra ayuda más a los juegos que a las apps productivas a veces?

Muchas cargas productivas son de streaming y predecibles—ideales para prefetching y ancho de banda.
Muchas cargas de juegos son irregulares y pointer-heavy—propensas a fallos de caché y bloqueos por latencia.

¿Sigo necesitando RAM rápida con X3D?

Necesitas RAM estable primero. Después de eso, X3D tiende a ser menos sensible a la velocidad de RAM que CPUs no-X3D,
pero el ajuste de memoria aún puede importar en escenarios competitivos de alta tasa de refresco.

¿Puedo hacer overclock a chips X3D como de costumbre?

Típicamente no en la clásica forma de “subir multiplicador y voltaje”; el stack tiene restricciones de voltaje/térmicas.
Aún puedes tener opciones como ajustes relacionados con PBO según plataforma y generación, pero la estrategia segura es ajustar para estabilidad y térmicas.

¿Por qué algunos benchmarks muestran ganancias pequeñas para X3D?

Porque el benchmark está limitado por GPU, usa una escena que cabe en caché normal o se centra en FPS promedio.
X3D brilla cuando el conjunto de trabajo es grande e irregular y cuando el pacing de fotogramas importa.

¿La planificación de hilos realmente importa tanto?

Sí. La localidad de caché es física. Si un hilo crítico migra, puede pagar una penalización de caché fría.
En sistemas multi-CCD, también puede pagar una penalización topológica. Si ves varianza, la planificación es un sospechoso principal.

¿X3D ayudará con el tartamudeo por compilación de shaders?

No mucho. La compilación de shaders suele ser pesada en CPU y en I/O de formas que no se resuelven con más L3.
Lo reduces con cachés de shaders, precompilación, actualizaciones de driver/juego y mejor almacenamiento/throughput de CPU—no principalmente con tamaño de caché.

¿Cuál es la forma más simple de saber si estoy limitado por CPU?

Baja la resolución o la escala de render y vuelve a probar la misma escena.
Si los FPS apenas cambian, la GPU no era el límite. Luego mira percentiles de tiempo de fotograma para ver si es latencia/pacing.

¿Debería comprar X3D para jugar a 4K?

Si principalmente estás limitado por GPU a 4K, X3D rara vez es la mejor inversión por FPS puro. Aún puede ayudar con consistencia en algunos títulos,
pero tu dinero generalmente pertenece a la GPU primero.

Próximos pasos prácticos

Si quieres el efecto “truco” de X3D, gánatelo con medición:
elige una escena que tartamudee, captura tiempos de fotograma y decide si tratas con latencia de CPU, saturación de GPU, stalls de almacenamiento o caos de planificación.
Luego actúa con decisión.

  • Si estás GPU-bound: ajusta gráficos, actualiza GPU, limita FPS para consistencia y deja de culpar a la CPU.
  • Si estás limitado por CPU con latencia fea en la cola: prioriza CPUs con mucha caché, reduce migración de hilos y mantiene la memoria estable.
  • Si estás limitado por “tartamudeos aleatorios”: revisa swapping, latencia de almacenamiento, ganchos en segundo plano y comportamiento térmico antes de comprar nada.
  • Si gestionas una flota: aplica invariantes (drivers, BIOS, planes de energía), registra percentiles de tiempo de fotograma y no dejes que los promedios dirijan tu organización.

3D V-Cache no es magia. Es una ventaja injusta muy específica: convierte una carga desordenada y sensible a latencia en una que se comporta como si tuviera todo bajo control.
Para los juegos, eso es lo suficientemente cercano a la magia como para que la gente siga llamándola así.

]]>
https://cr0x.net/es/3d-v-cache-x3d-cache-rendimiento/feed/ 0
¿Veremos híbridos x86+ARM en PCs de consumo? https://cr0x.net/es/veremos-hibridos-x86-arm-pcs/ https://cr0x.net/es/veremos-hibridos-x86-arm-pcs/#respond Wed, 28 Jan 2026 23:21:50 +0000 https://cr0x.net/veremos-hibridos-x86-arm-pcs/ El punto crítico no es «si puede arrancar». El punto crítico es que tu cliente VPN deje de funcionar el martes, tu agente EDR asigne los núcleos equivocados el miércoles y el servicio de asistencia tenga que aprender un vocabulario nuevo para «va lento» el jueves.

Los PCs híbridos x86+ARM parecen inevitables porque riman con lo que ya funcionó en teléfonos y servidores: mezclar tipos de cómputo, obtener mejor rendimiento por vatio y ganar en autonomía. Pero los PCs son donde la compatibilidad va a pelear. El mercado general aceptará CPUs híbridas solo cuando los casos operativos difíciles se vuelvan aburridos. Ese es el verdadero umbral.

Qué significa realmente «híbrido x86+ARM» (y qué no)

La gente dice «híbrido x86+ARM» y se imagina un portátil con dos CPUs que de alguna forma cooperan como en una película de policías en pareja. Eso no está mal, pero es incompleto. La cuestión de ingeniería es: qué se comparte y qué queda aislado.

Las tres cosas que definen un híbrido real

  • Una imagen del SO, dos conjuntos de instrucciones. O bien el kernel se ejecuta en una ISA y delega trabajo, o se ejecuta en ambas (más difícil), o se ejecutan instancias de SO separadas (más fácil pero menos “PC mainstream”).
  • Una experiencia de usuario. Las aplicaciones no te preguntan en qué CPU debe ejecutarse. El sistema decide, como un planificador que realmente prestó atención en clase.
  • Una historia de seguridad única. Claves, anclas de confianza, mediciones de arranque y aplicación de políticas no deben dividirse en «la CPU rápida» y «la CPU de batería» esperando que RR.HH. no lo note.

Qué no es

No es el «híbrido» existente que la mayoría de compradores de PC ya tienen: núcleos grandes x86 más núcleos pequeños x86. Eso es misma ISA. Tampoco es un microcontrolador ARM en la placa que gestione la energía: eso existe desde siempre y es mayormente invisible para el SO.

Y definitivamente no es «ejecutar apps x86 en ARM y listo». Existen capas de compatibilidad, pero no sustituyen a los controladores en modo kernel, anti-trampas, EDR, dongles USB y el resto del carnaval.

Opinión: El primer «PC híbrido x86+ARM» mainstream no se venderá como híbrido. Se venderá como «gran autonomía» e «inicio instantáneo», y la parte híbrida estará en la letra pequeña —exactamente donde vienen los tickets de soporte.

Por qué esta pregunta es de pronto seria

Los PCs híbridos x86+ARM han sido «posibles» durante mucho tiempo. Pero el mercado de PCs no quería «posible». Quería «todo sigue funcionando, incluido mi controlador del escáner de 2014 y esa macro financiera».

Lo que cambió es un conjunto de presiones que ahora se alinean:

  • Rendimiento por vatio es el nuevo criterio que importa. Los ventiladores molestan, el calor es costoso y las afirmaciones sobre batería venden dispositivos.
  • Expectativas de siempre conectado. La gente quiere suspensión tipo teléfono y conectividad, y la quiere sin que el portátil se convierta en un calentador espacial.
  • Los aceleradores de IA normalizaron la heterogeneidad. Los NPUs hicieron que los compradores aceptaran que «cómputo» no es solo CPU. Una vez aceptado eso, mezclar ISAs de CPU parece menos extravagante.
  • Pragmatismo en la cadena de suministro. Los fabricantes quieren flexibilidad: distintos núcleos, distintas fábricas, distintos modelos de licencia.
  • Los vendedores de SO ya invirtieron en planificación compleja. Si puedes planificar big-little, ya compraste parte del dolor.

Además, una verdad poco glamorosa: TI empresarial ahora está más dispuesta a estandarizar en «lo que podemos gestionar y asegurar» que en «lo que ejecuta literalmente todo de 2008». Eso abre la puerta a cambios arquitectónicos—si la historia de gestión y seguridad aguanta.

Broma #1: Una CPU híbrida es como una rotación de equipo—genial hasta que alguien olvida actualizar el calendario de guardias.

Datos interesantes y contexto histórico

El híbrido x86+ARM no es ciencia ficción. Es una repetición con distinto vestuario.

  1. ARM comenzó como una apuesta de bajo consumo para ordenadores personales. Los primeros diseños de ARM apuntaban a ambiciones de clase escritorio, mucho antes de que los teléfonos la hicieran famosa.
  2. Windows ya vivió transiciones de ISA. Se ejecutó en x86, luego x86-64, y antes en otras arquitecturas; la fricción del ecosistema siempre fueron los controladores y las asunciones en modo kernel.
  3. Apple demostró que los usuarios mainstream aceptarán un cambio de ISA. El movimiento crítico no fue solo el silicio: fue una plataforma controlada con controladores curados y una capa agresiva de traducción.
  4. El cómputo heterogéneo precede a “big.LITTLE”. Los PCs han usado durante mucho tiempo procesadores separados: GPUs, DSPs de audio, controladores embebidos, controladores de almacenamiento. La novedad es mezclar ISAs de propósito general bajo una identidad «PC» única.
  5. x86 ya tiene «procesadores de gestión» que se comportan como ordenadores separados. Muchas plataformas incluyen controladores fuera de banda que ejecutan su propio firmware y tienen acceso a memoria y red.
  6. Linux empresarial ha hecho builds multi-arquitectura durante años. Empaquetado multi-arch y pipelines CI son reales, pero las apps de escritorio y los controladores propietarios suelen ser el eslabón débil.
  7. La virtualización expuso brutalmente las fronteras de ISA. La virtualización misma ISA es fácil; cross-ISA tiende a significar emulación, y la emulación es un impuesto que pagas para siempre.
  8. Los experimentos ARM/x86 en Android mostraron la parte difícil: bibliotecas nativas. Las apps «solo Java» se movieron bien; las apps con código nativo fallaron de maneras fascinantes.
  9. La gestión de energía siempre ha sido política. Los usuarios de portátiles culpan a «Windows», TI culpa a «controladores», los OEMs culpan a «las cargas de trabajo del usuario», y la física culpa a todos por igual.

Una cita que vale la pena tener pegada en el monitor: «La esperanza no es una estrategia.»Vince Lombardi. La ingeniería está llena de pósters motivacionales; las operaciones están llenas de postmortems. Elige lo segundo.

Cómo podrían construirse los híbridos: tres arquitecturas plausibles

Si quieres predecir qué llegará a los PCs mainstream, deja de discutir filosofía y mira el coste de integración. Hay varias maneras realistas en que los fabricantes pueden enviar algo que el marketing llamará «seamless».

Arquitectura A: CPU host x86 + «sidecar» ARM para baja potencia y servicios

Este es el camino conservador. El sistema arranca normalmente en x86. Un subsistema ARM gestiona tareas en segundo plano: connected standby, procesamiento de sensores, quizá voz siempre activa, quizá descarga de red. Piensa en un «EC inteligente» pero con suficiente potencia para ejecutar un SO real o un RTOS y ofrecer servicios al SO principal.

Pros: La compatibilidad se mantiene mayormente en x86. ARM puede aislarse. Los OEMs pueden iterar sin romper el modelo PC central.
Contras: El sidecar se convierte en una responsabilidad de seguridad y manejabilidad si tiene acceso a la red y a la memoria. Además, los usuarios exigirán eventualmente que ARM ejecute apps reales, no solo el equivalente de una lista de tareas muy sofisticada.

Arquitectura B: ARM primario + acelerador x86 para cargas legado

Esta es la idea de «Windows en ARM, pero con muleta». El SO es nativo ARM. La mayoría de las apps son ARM-nativas o traducidas. Cuando aparece una carga x86 heredada que debe ser nativa (p. ej.: controladores de dispositivo, ciertas herramientas de desarrollo o software especializado), el sistema la delega a una isla de cómputo x86.

Pros: Puedes optimizar la plataforma para batería y térmica. ARM se convierte en la ruta por defecto. Dejas de pagar el impuesto de traducción para todo.
Contras: La frontera entre ARM y x86 se convierte en una superficie API de alta fricción: compartición de memoria, IPC, planificación, depuración. Además, la realidad de los controladores en modo kernel sigue esperando fuera con un bate de béisbol.

Arquitectura C: SoC de ISA dual con memoria compartida y planificador unificado

Este es el diseño ambicioso: «hacer que parezca una CPU». Ambas ISAs pueden acceder a memoria y dispositivos con baja latencia. El planificador del SO conoce ambas. La plataforma podría soportar ejecutar espacio de usuario en cualquiera de las ISAs con migración transparente.

Pros: Si funciona, es lo más cercano a la magia. Las apps pueden ejecutarse donde tenga sentido. Las tareas de fondo permanecen en ARM; los picos van a x86; o viceversa.
Contras: Es endiabladamente difícil. Coherencia de caché, ordenación de memoria, enrutamiento de interrupciones, contadores de rendimiento y depuración se complican. Además, los ecosistemas PC mainstream no recompensan lo «picante». Recompensan lo «aburrido».

Mi apuesta: El mercado mainstream empezará con la Arquitectura A, coqueteará con la B, y solo ecosistemas de alto nivel o controlados intentarán la C en el corto plazo.

El planificador es el producto

En un PC híbrido, el planificador se convierte en la experiencia de usuario. Decide la autonomía, el ruido de los ventiladores y si tu videollamada se entrecorta. Y como es invisible, será culpado de todo lo que no hizo.

Lo que el planificador debe acertar

  • Trabajo sensible a la latencia vs trabajo de rendimiento. Hilos de UI, audio y manejo de entrada no pueden quedarse atascados en núcleos “eficientes” que son eficientes siendo lentos.
  • Térmicas y carga sostenida. Un sistema híbrido puede lucir bien en benchmarks cortos y luego reducirse a la mediocridad tras 10 minutos de trabajo real.
  • Afinidad y localidad. Si el SO rebota un proceso entre ISAs, pagas con faltas de caché, churn de TLB y a veces incompatibilidad (p. ej., JITs con suposiciones).
  • Integración de política de energía. Políticas corporativas de energía, keepalives de VPN, escaneos EDR y sincronización en segundo plano son muerte por mil despertares. Los híbridos pueden arreglar eso—o empeorarlo si las herramientas de políticas no entienden la topología.

Por qué tu app puede ir más lenta en hardware «más avanzado»

Porque el SO toma una decisión que no anticipaste. Quizá fija tu sistema de compilación en núcleos ARM para «ahorrar energía». Quizá detecta «en segundo plano» erróneamente. Quizá un agente de seguridad inyecta hooks que cambian la clasificación de un proceso. El resultado es un portátil que rinde bien en benchmarks y se siente lento cuando intentas entregar trabajo.

Consejo para operaciones: Si gestionas flotas, exige herramientas que muestren dónde se ejecutó un proceso (qué ISA, qué clase de núcleo), no solo porcentaje de CPU. El %CPU sin topología es como latencia de disco sin profundidad de cola: técnicamente cierto, operacionalmente inútil.

Firmware, arranque y actualizaciones: donde los sueños van a ser auditados

Las plataformas híbridas viven o mueren por la madurez del firmware. No porque a los entusiastas les importe, sino porque a las empresas les importa. Secure Boot medido, attestation de dispositivo, cadencia de parches y recuperabilidad tocan el firmware.

Preguntas de firmware que deberías hacer antes de comprar

  • ¿Qué procesador controla el arranque? ¿x86 inicia ARM, ARM inicia x86 o hay un tercer controlador que orquesta ambos?
  • ¿Quién controla la inicialización de memoria? Si el entrenamiento de RAM está ligado a un complejo, el otro queda dependiente. Las cadenas de dependencia crean modos de fallo que parecen «colgamientos aleatorios».
  • ¿Cómo funcionan las actualizaciones? ¿Un paquete? ¿Múltiples? ¿Rollback atómico? ¿Qué ocurre si la actualización falla a mitad?
  • ¿Cuál es la historia de recuperación? ¿Puedes recuperar una CPU sidecar brickeada sin RMA? Si no, no estás operando un PC; estás operando un aparato frágil.

Los híbridos también complican el registro de eventos. Si el sidecar ARM se encarga de la red en suspensión o de la telemetría, necesitas sus registros durante la respuesta a incidentes. Si no, te quedarás mirando un Registro de Eventos de Windows perfectamente normal mientras el verdadero culpable se reinicia en silencio.

Verdad seca: el firmware es software, y el software tiene bugs. La única pregunta es si el proveedor lo trata como un producto o como un secreto embarazoso.

Controladores y extensiones de kernel: el guardián del mainstream

Los PCs mainstream se basan en una promesa poco elegante: tu hardware raro probablemente funcionará. Esa promesa está hecha de controladores. Y los controladores son específicos de arquitectura en las formas que más importan.

El problema de los controladores en una frase

El modo usuario puede traducirse; el modo kernel normalmente no.

Las capas de traducción pueden hacer que aplicaciones de usuario x86 corran en ARM con un rendimiento aceptable en muchos casos. Pero los controladores en modo kernel—filtros de red, minifiltros de sistema de archivos, agentes de endpoint, componentes VPN, anti-trampas—operan donde la traducción es o imposible o una pesadilla de seguridad.

Qué hace el «híbrido» a la estrategia de controladores

  • Si el SO primario es x86, mantienes los controladores existentes pero podrías necesitar nuevos controladores para el subsistema ARM y sus dispositivos.
  • Si el SO primario es ARM, necesitas controladores ARM-nativos para casi todo, y la cola larga dolerá.
  • Si ambos son de primera clase, necesitas un modelo coherente de dispositivos: ¿qué ISA maneja interrupciones, DMA y transiciones de energía?

Qué hacer: En la adquisición, trata la «disponibilidad de controladores» como un requisito estricto, no una esperanza. Pregunta específicamente por VPN, EDR, cifrado de disco, tarjeta inteligente, docking y cualquier USB o PCIe especializado que use tu organización. Si el proveedor divaga, asume que serás el equipo de integración.

Virtualización y contenedores: realidad frente a expectativas

Desarrolladores y TI aman la virtualización porque es la cinta adhesiva de la compatibilidad. Pero los límites de ISA son donde la cinta adhesiva empieza a despegarse.

Virtualización misma ISA vs emulación cross-ISA

Si tu host e invitado comparten ISA, la virtualización puede usar aceleración hardware y correr casi nativa. Si no la comparten, estás en tierra de emulación. La emulación puede ser sorprendentemente buena para algunas cargas, y profundamente dolorosa para otras—especialmente todo lo que tenga JITs, cargas con muchas llamadas al sistema o I/O intensivo.

Los contenedores no te salvan aquí

Los contenedores comparten el kernel del host. Así que si necesitas un contenedor Linux x86 en un host ARM, vuelves a emulación o trucos multi-arch. Las imágenes multi-arch ayudan cuando la aplicación es portable, pero muchas cargas corporativas están pegadas a bibliotecas nativas y cadenas de construcción antiguas.

Regla práctica: Si tu empresa depende de VMs locales para el desarrollo (Hyper-V, VMware Workstation, VirtualBox, WSL2), los híbridos deben venir con una historia clara de «esto es rápido y soportado». Si no, crearás una economía subterránea de gente comprando su propio hardware.

Seguridad y límites de confianza en máquinas con ISA mixto

La seguridad es donde los diseños híbridos pueden ser brillantes o catastróficos. Brillantes, porque puedes aislar funciones sensibles. Catastróficos, porque has introducido otro entorno privilegiado que podría tener acceso a memoria y redes.

Dos modelos, dos perfiles de riesgo

  • Modelo de enclave ARM aislado: ARM ejecuta servicios de seguridad (attestation, almacenamiento de claves, quizá filtrado de red) con límites estrictos. Puede ser fuerte si está bien diseñado, pero requiere interfaces limpias y mecanismos de actualización robustos.
  • Modelo sidecar privilegiado: El subsistema ARM tiene acceso amplio «por conveniencia» (DMA, red, memoria compartida). Aquí aparecen comportamientos inquietantes y pesadillas de auditoría.

Qué debe exigir operaciones

  • Cadena de arranque medible en todos los elementos de cómputo. No solo «Secure Boot habilitado» en x86 mientras el sidecar ejecuta firmware sin firmar como si fuera 2003.
  • Control centralizado de políticas. Si el subsistema ARM hace red en suspensión, tu política de firewall y certificados debe aplicarse allí también.
  • Ganchos forenses. Registros, identificadores de versión y una forma de consultar el estado de forma remota. Si no puedes verlo, no puedes confiar en ello.

Broma #2: Nada dice «arquitectura segura» como descubrir un segundo sistema operativo que no sabías que estabas parcheando.

Almacenamiento e I/O: donde la rareza híbrida aparece primero

El I/O es donde los híbridos quedan en evidencia. Las CPUs pueden ser rápidas en las diapositivas de marketing, pero un portátil que no puede reanudar de forma fiable, enumerar dispositivos de forma consistente y mantener el almacenamiento con buen rendimiento durante transiciones de energía se sentirá roto.

Modos de fallo que verás realmente

  • Tormentas de reanudación. Políticas híbridas que despiertan el sistema «un poco» para tareas en segundo plano pueden crear una estampida de despertares. El disco nunca llega a idle; la batería desaparece.
  • Confusión de estados de energía NVMe. Estados de baja potencia agresivos pueden aumentar latencia y causar timeouts con ciertas combinaciones de controladores/firmware.
  • Overhead de controladores filtro. Cifrado, DLP, EDR y agentes de copia de seguridad se apilan en la ruta de almacenamiento. Si algunos componentes corren en distintos elementos de cómputo o tienen supuestos temporales diferentes, obtienes picos de latencia final.
  • Dock USB-C como multiplicador del caos. Los híbridos añaden más piezas móviles a un subsistema ya famoso por «depende».

Consejo de ingeniero de almacenamiento: Al evaluar híbridos, prueba con tu pila de seguridad real y tu configuración real de docking. Los benchmarks sintéticos son educados. Tu flota no lo es.

Tres micro-historias del mundo corporativo (anonimizadas, plausibles y dolorosamente familiares)

Micro-historia 1: Un incidente causado por una suposición errónea

Una empresa mediana desplegó un grupo piloto de «nuevos portátiles de eficiencia». La característica destacada era mayor autonomía y mejor suspensión. Los dispositivos no eran técnicamente híbridos x86+ARM en el sentido de marketing, pero incluían un subsistema siempre activo que manejaba connected standby y algunas tareas de red.

El equipo de seguridad asumió que los controles de endpoint existentes lo cubrían todo porque el agente de Windows estaba instalado y reportando. El piloto fue bien—hasta que una auditoría de cumplimiento preguntó: «¿Están parcheados y monitorizados todos los componentes con capacidad de red?» De repente el equipo descubrió que el subsistema de suspensión tenía sus propias actualizaciones de firmware y su propio comportamiento de red.

Entonces ocurrió un incidente real: el dispositivo de un usuario se mantuvo conectado al Wi‑Fi durante el sueño y realizó sincronizaciones en segundo plano a horas extrañas. Eso no era el problema; el problema fue que el despliegue del certificado del proxy había fallado en un subconjunto de dispositivos, y el subsistema seguía reintentando conexiones de forma que activó límites de tasa. El SOC lo vio como «beaconing sospechoso». El helpdesk lo vio como «Wi‑Fi malo». Todos tenían razón y estaban equivocados a la vez.

La suposición errónea no fue incompetencia técnica. Fue organizativa: trataron «el PC» como un SO y un agente. La solución fue aburrida: inventariar el componente de firmware adicional, rastrear su versión, incluirlo en los SLAs de parcheo y ampliar la monitorización para incluir su comportamiento. Una vez hicieron eso, los dispositivos se convirtieron en ciudadanos estables.

Micro-historia 2: Una optimización que se volvió en contra

Un gran equipo de desarrollo empresarial estaba obsesionado con métricas de batería. Impusieron políticas de energía agresivas: estados de sueño profundo, throttling estricto en segundo plano y límites de CPU cuando estaban con batería. La intención era buena—reducir ruido en reuniones y evitar que la gente busque enchufes.

Luego comenzaron los tickets de soporte: «las compilaciones van lentas al azar», «Docker se siente pegajoso», «VS Code se congela a veces». El perfil no mostró una causa obvia. Uso de CPU bajo, uso de disco moderado, memoria bien. Clásico «todo parece normal y el usuario está enfadado».

El culpable fue la interacción de políticas. La clasificación en segundo plano para ciertas herramientas de desarrollo hacía que tareas de compilación aterrizaran en núcleos de eficiencia con más frecuencia, mientras que los hilos de finalización de I/O rebotaban entre núcleos. Mientras tanto, el agente de seguridad escaneaba archivos añadiendo latencia en cada apertura. Cada componente por separado era razonable; juntos crearon latencia final miserable.

«Lo arreglaron» aumentando el límite de CPU, lo que ayudó pero provocó quejas por calor. La solución real fue más quirúrgica: excluir directorios de compilación de ciertos escaneos (con controles compensatorios), poner excepciones de throttling para procesos específicos y medir el impacto con trazas de carga reproducibles. La lección: optimizar energía sin perfilar cargas es adivinanza con mejor marca.

Micro-historia 3: Una práctica aburrida pero correcta que salvó el día

Una organización regulada evaluó una nueva clase de dispositivos con elementos de cómputo heterogéneos. Antes de desplegar, construyeron una lista de aceptación de hardware que parecía algo que solo un auditor amaría: mediciones de arranque, reporte de versiones de firmware, procedimientos de recuperación y pruebas de rendimiento reproducibles bajo la pila completa de agentes corporativos.

Durante el piloto, una actualización de firmware provocó fallos esporádicos de reanudación en un pequeño subconjunto de máquinas. Los usuarios reportaron «a veces no despierta». El proveedor inicialmente culpó a un modelo de docking. El equipo de TI no discutió; recopilaron datos.

Porque habían insistido en registro estructurado e inventario de versiones desde el día uno, correlacionaron fallos con una revisión de firmware específica y un modelo particular de NVMe. Revirtieron esa actualización vía su plataforma de gestión de dispositivos, bloquearon su re-aplicación y abrieron un caso con el proveedor con evidencia concreta.

No pasó nada heroico. No hubo all-nighter. No hubo donuts en la sala de guerra. Solo establecimiento disciplinado de líneas base y despliegue controlado. El resultado: el incidente se quedó en un tropiezo de piloto en lugar de un fallo de flota. Así es como debe sentirse lo «aburrido».

Tareas prácticas: comandos, salidas, qué significan y qué decides

Los sistemas híbridos te obligarán a mejorar en medición. A continuación hay tareas prácticas que puedes ejecutar hoy en flotas Linux y Windows (o bancos de prueba) para aprender los hábitos que necesitarás. No son comandos «benchmark por diversión»; cada uno termina con una decisión.

Tarea 1: Identificar la(s) arquitectura(s) CPU visibles para el SO (Linux)

cr0x@server:~$ uname -m
x86_64

Qué significa la salida: El kernel se ejecuta como x86_64. Si esto fuera un SO nativo ARM, verías aarch64.
Decisión: Si tu concepto híbrido requiere un SO primario ARM, esta máquina no sirve. Si es x86 primario con sidecar ARM, necesitas herramientas adicionales para ver el sidecar.

Tarea 2: Inspeccionar topología de CPU y pistas de tipos de núcleo (Linux)

cr0x@server:~$ lscpu | egrep -i 'model name|architecture|cpu\(s\)|thread|core|socket|flags'
Architecture:                         x86_64
CPU(s):                               16
Thread(s) per core:                   2
Core(s) per socket:                   8
Socket(s):                            1
Model name:                           Intel(R) Core(TM) Ultra Sample
Flags:                                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr ...

Qué significa la salida: Ves la topología pero no «este núcleo es ARM». Linux hoy normalmente expone una ISA por instancia de kernel en ejecución.
Decisión: Si un proveedor afirma «núcleos x86+ARM unificados», exige cómo se expone. Si no es visible, probablemente no sea un modelo de planificador unificado.

Tarea 3: Comprobar la visión del planificador sobre núcleos heterogéneos (pistas en sysfs de Linux)

cr0x@server:~$ grep -H . /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver 2>/dev/null | head
/sys/devices/system/cpu/cpu0/cpufreq/scaling_driver:intel_pstate
/sys/devices/system/cpu/cpu1/cpufreq/scaling_driver:intel_pstate

Qué significa la salida: El mismo driver de frecuencia en CPUs sugiere misma clase. En big-little x86 aún podrías ver el mismo driver, pero mirarías la frecuencia máxima por CPU a continuación.
Decisión: Si no puedes observar clases de núcleo distintas, no puedes verificar políticas de planificación. No despliegues políticas de energía a ciegas.

Tarea 4: Confirmar diferencias de frecuencia máxima por núcleo (útil para heterogeneidad)

cr0x@server:~$ for c in 0 1 2 3; do echo -n "cpu$c "; cat /sys/devices/system/cpu/cpu$c/cpufreq/cpuinfo_max_freq; done
cpu0 4800000
cpu1 4800000
cpu2 4800000
cpu3 4800000

Qué significa la salida: Estos núcleos parecen similares. En diseños heterogéneos a menudo ves techos distintos en subconjuntos.
Decisión: Si validas una historia de planificación «híbrida», elige una plataforma donde la heterogeneidad sea medible. Si no, estás probando marketing.

Tarea 5: Observar ubicación por proceso y migraciones (Linux)

cr0x@server:~$ pid=$(pgrep -n bash); taskset -cp $pid
pid 2147's current affinity list: 0-15

Qué significa la salida: El proceso puede ejecutarse en todas las CPUs. Los sistemas híbridos probablemente necesiten políticas o pistas para «ejecutar en sidecar ARM» vs «ejecutar en lado x86».
Decisión: Si tu plataforma necesita fijación explícita para comportarse, no está lista para el mainstream a menos que las herramientas la automaticen.

Tarea 6: Medir presión de planificación de CPU (Linux)

cr0x@server:~$ cat /proc/pressure/cpu
some avg10=0.25 avg60=0.10 avg300=0.05 total=1234567
full avg10=0.00 avg60=0.00 avg300=0.00 total=0

Qué significa la salida: «some» indica tareas esperando CPU. «full» sería contención severa.
Decisión: Si los usuarios reportan lentitud pero la presión es baja, el cuello de botella está en otro sitio (I/O, stalls de memoria, throttling de energía). No culpes al planificador primero.

Tarea 7: Medir presión de I/O (Linux) para detectar problemas en la ruta de almacenamiento

cr0x@server:~$ cat /proc/pressure/io
some avg10=1.20 avg60=0.80 avg300=0.40 total=987654
full avg10=0.30 avg60=0.10 avg300=0.05 total=12345

Qué significa la salida: «full» en I/O significa tareas bloqueadas esperando finalización de I/O—síntoma clásico de picos de latencia de almacenamiento o overhead de filtros.
Decisión: Si «full» sube cuando «el sistema se siente lento», céntrate en estados de energía NVMe, cifrado, escaneo de endpoint y la pila de controladores antes de discutir arquitectura de CPU.

Tarea 8: Comprobar salud y firmware NVMe (Linux)

cr0x@server:~$ sudo nvme id-ctrl /dev/nvme0 | egrep 'mn|fr|sn'
mn      : ACME NVMe 1TB
fr      : 3B2QGXA7
sn      : S7XNA0R123456

Qué significa la salida: Modelo y revisión de firmware. Errores de reanudación y estados de energía suelen correlacionar con firmware específico.
Decisión: Si ves inestabilidad, compara revisiones de firmware entre máquinas «buenas» y «malas» y estandariza. Esto es aburrido y extremadamente efectivo.

Tarea 9: Inspeccionar estados de energía NVMe (Linux)

cr0x@server:~$ sudo nvme id-ctrl /dev/nvme0 | sed -n '/ps  0/,+8p'
ps  0 : mp:8.00W operational enlat:0 exlat:0 rrt:0 rrl:0
ps  1 : mp:4.50W operational enlat:50 exlat:50 rrt:1 rrl:1
ps  2 : mp:1.20W operational enlat:200 exlat:200 rrt:2 rrl:2

Qué significa la salida: Los estados de menor potencia tienen mayor latencia de entrada/salida. Políticas agresivas pueden perjudicar el rendimiento interactivo o provocar timeouts con pilas frágiles.
Decisión: Si las apps sensibles a latencia tartamudean con batería, prueba ajustes menos agresivos de NVMe/APST antes de culpar a la CPU.

Tarea 10: Verificar el gobernador/política de frecuencia actual (Linux)

cr0x@server:~$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
powersave

Qué significa la salida: «powersave» puede estar bien en drivers modernos, pero a veces se correlaciona con comportamientos conservadores de boosting según la plataforma.
Decisión: Si las quejas de rendimiento se correlacionan con la fuente de energía, prueba políticas «balanced»/«performance» y mide el impacto en consumo. No adivines.

Tarea 11: Detectar señales de thermal throttling (Linux)

cr0x@server:~$ sudo dmesg | egrep -i 'thrott|thermal|temp' | tail -n 5
[ 9123.4412] thermal thermal_zone0: critical temperature reached
[ 9123.4413] cpu: Package temperature above threshold, cpu clock throttled
[ 9126.9910] cpu: Package temperature/speed normal

Qué significa la salida: La CPU alcanzó un umbral térmico y se throttled. Los híbridos a menudo enmascaran esto con «núcleos eficientes», pero la física sigue cobrando renta.
Decisión: Si el throttling ocurre en cargas normales, arregla térmicas (BIOS, curvas de ventilador, pasta, chasis) o ajusta límites de potencia sostenida. Híbrido o no, es la misma pelea de siempre.

Tarea 12: Encontrar los peores ofensores de latencia de disco (Linux)

cr0x@server:~$ iostat -x 1 3
Linux 6.5.0 (server) 	01/12/2026 	_x86_64_	(16 CPU)

Device            r/s     w/s   rkB/s   wkB/s  await  svctm  %util
nvme0n1          35.0    22.0  4096.0  2048.0   8.20   0.35   2.0

Qué significa la salida: «await» es latencia media de I/O; «%util» muestra tiempo ocupado del dispositivo. Await alto con util baja a menudo indica cola en otro sitio (filtros, estados de energía).
Decisión: Si await se dispara mientras util se mantiene baja, investiga la pila de controladores y la gestión de energía antes de reemplazar hardware.

Tarea 13: Confirmar qué binarios estás ejecutando (útil con traducción)

cr0x@server:~$ file /bin/ls
/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., stripped

Qué significa la salida: Muestra la ISA del binario. En una historia híbrida con traducción/descarga, necesitas saber qué es nativo vs traducido/emulado.
Decisión: Si cargas críticas no son nativas en la CPU donde se ejecutan, espera variaciones de rendimiento y complejidad de soporte. Decide si eso es aceptable para ese grupo de usuarios.

Tarea 14: Comprobar módulos de kernel cargados que puedan afectar latencia de almacenamiento (Linux)

cr0x@server:~$ lsmod | egrep 'nvme|crypt|zfs|btrfs' | head
nvme                  61440  3
nvme_core            212992  5 nvme
dm_crypt              65536  0

Qué significa la salida: dm_crypt indica cifrado de disco completo a nivel de bloque, lo que puede cambiar comportamiento de CPU y latencia, especialmente bajo throttling de energía.
Decisión: Si comparas dispositivos, compáralos bajo la misma encriptación y pila EDR. Si no, estás benchmarkeando políticas, no silicio.

Tarea 15: Inspeccionar básicos de CPU y firmware en Windows (PowerShell)

cr0x@server:~$ powershell.exe -NoProfile -Command "Get-CimInstance Win32_Processor | Select-Object Name,Architecture,NumberOfLogicalProcessors"
Name                                   Architecture NumberOfLogicalProcessors
----                                   ------------ -----------------------
Intel(R) Core(TM) Ultra Sample         9            16

Qué significa la salida: Windows reporta la arquitectura CPU. (El código Architecture 9 suele mapear a x64.) Aún no verás un sidecar ARM oculto aquí.
Decisión: Para inventario de flota, esto es necesario pero insuficiente. Si la plataforma tiene un subsistema ARM, exige hooks de inventario separados del proveedor/herramientas de gestión.

Tarea 16: Comprobar hints de throttling de energía en Windows para un proceso (PowerShell)

cr0x@server:~$ powershell.exe -NoProfile -Command "Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name,Id,CPU"
Name        Id   CPU
----        --   ---
MsMpEng   4120  128.5
Teams     9804   92.2
Code      7720   55.1
chrome    6600   41.7
explorer  1408   12.4

Qué significa la salida: Consumidores de CPU principales. En híbridos, te importará en qué clase de núcleo/ISA se ejecutan, pero empieza aquí para localizar ofensores.
Decisión: Si los principales consumidores son agentes de seguridad o sincronización en segundo plano, tus ganancias de «eficiencia híbrida» pueden evaporarse. Ajusta calendarios, exclusiones o políticas antes de culpar al hardware.

Guía de diagnóstico rápido: encuentra el cuello de botella antes de iniciar una guerra religiosa

Esta es la secuencia de triaje que uso cuando alguien dice «este portátil nuevo y elegante va lento» y la sala empieza a debatir arquitecturas como si fuera una liga deportiva.

Primero: prueba si es CPU, I/O, memoria o throttling

  • Presión de CPU: comprueba /proc/pressure/cpu. «some/full» alta significa contención real de planificación.
  • Presión de I/O: comprueba /proc/pressure/io e iostat -x. «full» alto o await alto es tu arma humeante.
  • Presión de memoria: comprueba /proc/pressure/memory y uso de swap. Los stalls de memoria se sienten como problemas de CPU para los usuarios.
  • Thermal throttling: revisa dmesg por eventos de throttling o logs térmicos de plataforma.

Segundo: aísla política de hardware

  • Compara comportamiento enchufado vs con batería con la misma traza de carga.
  • Revisa gobernador de CPU/plan de energía y política de estados NVMe.
  • Prueba temporalmente con la pila de seguridad corporativa en «modo auditoría» (si la política lo permite) para ver si el overhead de filtros domina.

Tercero: solo entonces discute sobre planificación híbrida

  • Si la presión de CPU es baja y el I/O es alto, la CPU híbrida no es tu problema.
  • Si la presión de CPU es alta pero las térmicas muestran throttling, los «núcleos rápidos» están atrapados en una caja térmica.
  • Si el rendimiento varía mucho por app, sospecha de clasificación de procesos, afinidad o rutas de traducción/emulación.

Postura operativa: Trata «híbrido» como un multiplicador, no como causa raíz. Magnifica controladores débiles, política de energía mala y agentes de seguridad frágiles.

Errores comunes: síntomas → causa raíz → solución

1) Síntoma: excelentes benchmarks, terrible capacidad de respuesta en uso real

Causa raíz: Latencia final por filtros de I/O (EDR/DLP/cifrado), latencia de estados de baja potencia NVMe o clasificación errónea por parte del planificador de hilos interactivos.
Solución: Mide presión de I/O y await de disco; ajusta configuraciones NVMe; añade excepciones de proceso para cargas interactivas conocidas; valida con la pila completa de agentes.

2) Síntoma: la batería se descarga en suspensión/standby

Causa raíz: Subsistema de connected standby o políticas del SO que causan despertares frecuentes, keepalives de red o escaneos en segundo plano; bugs de firmware.
Solución: Audita fuentes de wake, desactiva tareas en segundo plano innecesarias, actualiza firmware y aplica políticas consistentes para red en suspensión y horarios de agentes.

3) Síntoma: la VPN funciona despierto, falla tras reanudación

Causa raíz: Reseteos de la pila de red, entrega de certificados/proxy no aplicada al networking en suspensión o problemas de temporización de controladores en la reanudación.
Solución: Actualiza controladores NIC/VPN, valida la entrega de certificados, prueba bucles de reanudación y asegura que el tráfico del subsistema de suspensión sigue las mismas restricciones de política.

4) Síntoma: la estación de acoplamiento causa problemas aleatorios de pantalla o USB

Causa raíz: Transiciones de energía y diferencias en temporización de enumeración de dispositivos, además de desajustes de firmware/controladores amplificados por complejidad añadida de cómputo.
Solución: Estandariza modelos de dock y firmware, valida una matriz conocida buena y bloquea revisiones de firmware problemáticas a nivel de flota.

5) Síntoma: VMs de desarrollador son inutilizables

Causa raíz: Emulación cross-ISA, falta de aceleración hardware o restricciones de virtualización anidada en el diseño de la plataforma.
Solución: Requiere virtualización misma ISA para perfiles de desarrollo, mueve cargas pesadas a compilación remota/VDI o mantiene dispositivos x86-nativos para esos grupos.

6) Síntoma: la herramienta de seguridad “soporta el dispositivo” pero se pierden comportamientos

Causa raíz: Componentes adicionales de firmware/SO no cubiertos por agentes o inventario; red del sidecar no monitorizada.
Solución: Amplía el inventario de activos para incluir todos los elementos de cómputo, exige attestation e informe de versiones e integra registros en el SIEM.

7) Síntoma: fallos intermitentes al reanudar que parecen defectos de hardware

Causa raíz: Interacción de firmware con modelos NVMe específicos o estados de energía agresivos; carreras de temporización en la reanudación.
Solución: Correlaciona por revisión de firmware y modelo de SSD, revierte o actualiza y bloquea configuraciones vía gestión de dispositivos.

Listas de verificación / plan paso a paso

Plan paso a paso para evaluar híbridos x86+ARM (o PCs “algo híbridos”) en una empresa

  1. Define personas. Los desarrolladores con VMs locales no son lo mismo que usuarios de ventas con Teams todo el día. No compres una clase de dispositivo y esperes felicidad universal.
  2. Inventaria bloqueadores críticos. VPN, EDR, cifrado de disco, tarjeta inteligente, docking, impresión y cualquier periférico especializado. Si alguno es frágil en modo kernel, trata los diseños ARM-primario como alto riesgo.
  3. Construye una traza de carga conocida. Arranque, inicio de sesión, llamada en Teams, pestañas de navegador, uso de Office, bucle de compilación/pruebas (si aplica), ciclos suspensión/reanudación, docking/undocking.
  4. Ejecuta la traza en dispositivos x86 de referencia. Captura presión de CPU, presión de I/O, eventos térmicos y drenaje de batería.
  5. Ejecuta la misma traza en el candidato híbrido. Misma pila de agentes, mismas políticas, mismo entorno de red.
  6. Valida inventario de firmware y controles de actualización. Asegura que puedes consultar versiones remotamente y revertir si es necesario.
  7. Prueba recuperabilidad. ¿Qué ocurre si una actualización brickea el sidecar? ¿Puedes recuperar sin enviar hardware?
  8. Valida límites de seguridad. Confirma que el arranque medido/attestation cubre todos los elementos de cómputo que pueden acceder a memoria o redes.
  9. Comprueba requisitos de virtualización. Si las VMs locales son obligatorias, pruébalas primero. No lo dejes para el piloto; dominará la narrativa.
  10. Establece valores predeterminados de política de forma conservadora. Prefiere estabilidad y rendimiento predecible sobre titular autopromocionado de batería. Ajusta tras tener datos.
  11. Despliega por anillos. Piloto pequeño, luego piloto más amplio, luego general. Bloquea actualizaciones de firmware que correlacionen con problemas.
  12. Escribe el playbook de soporte. Los guiones de helpdesk deben incluir comprobaciones de estado de energía, versiones de firmware y matrices conocidas de dock/controlador. Reduce el misterio.

Checklist de adquisición: preguntas que separan «plataforma real» de «unidad demo»

  • ¿Podemos inventariar todos los componentes de firmware y sus versiones remotamente?
  • ¿Se soporta y prueba el rollback?
  • ¿Qué componentes tienen acceso de red durante la suspensión y cómo se aplica la política allí?
  • ¿Cuál es el compromiso de soporte del proveedor para controladores en las versiones del SO que ejecutamos?
  • ¿Cómo se comporta la plataforma con filtros empresariales comunes (VPN/EDR/cifrado) habilitados?
  • ¿Cuál es la postura oficial de soporte sobre virtualización, WSL2 y herramientas de desarrollo?

Preguntas frecuentes

1) ¿Los consumidores mainstream comprarán realmente híbridos x86+ARM?

Comprarán autonomía, ventiladores silenciosos e inicio instantáneo. Si los híbridos ofrecen eso sin romper apps ni accesorios, a los consumidores no les importará qué ISA ejecuta qué.

2) ¿Es esto otra vez «big.LITTLE»?

No. big.LITTLE en PCs hoy suele ser la misma ISA entre tipos de núcleo. Los híbridos x86+ARM añaden una frontera de conjunto de instrucciones, y ahí es donde la compatibilidad y las herramientas se complican.

3) ¿Cuál es el mayor obstáculo técnico?

Controladores y software en modo kernel. El modo usuario tiene soluciones (portado, traducción). El modo kernel es donde «soportado» se vuelve un estado binario.

4) ¿Podría un SO unificado planificar tareas entre x86 y ARM sin problemas?

En teoría, sí. En la práctica requiere cambios profundos en el SO, un modelo coherente de memoria e interrupciones y herramientas de desarrollo que puedan ver lo que ocurre. Es un listón alto para PCs mainstream.

5) ¿Linux manejará mejor los híbridos que Windows?

Linux puede adaptarse rápido, pero «mejor» depende de controladores, firmware y cooperación OEM. El éxito en escritorios mainstream depende tanto del soporte del proveedor como de la elegancia del kernel.

6) ¿Cómo afecta esto a la virtualización para desarrolladores?

La virtualización misma ISA sigue siendo la vía feliz. Cross-ISA tiende a ser emulación, que es más lenta y menos predecible. Si la productividad depende de VMs locales x86, no asumas que los híbridos funcionarán.

7) ¿Los subsistemas ARM son un riesgo de seguridad?

Pueden serlo. Cualquier componente con capacidad de red y acceso privilegiado debe ser parcheable, medible y monitorizado. Si es «invisible», es un problema de gobernanza esperando ocurrir.

8) ¿Qué deben hacer las empresas ahora mismo?

Prepara tu pila de software para la heterogeneidad: inventaria dependencias en modo kernel, limpia la proliferación de controladores y construye trazas de rendimiento reproducibles. Luego pilota con cautela y control de versiones estricto.

9) Si los híbridos son tan complicados, ¿por qué molestarse?

Porque eficiencia energética y térmica son ahora requisitos de producto de primera clase, y el ecosistema PC está bajo presión competitiva. Los híbridos son una forma de comprar eficiencia sin abandonar el legado de inmediato.

10) ¿Cuál es el resultado «mainstream» más probable en los próximos años?

PCs x86 con subsistemas no-x86 cada vez más capaces haciendo más trabajo en segundo plano, además de PCs ARM con mejor compatibilidad. La verdadera planificación unificada x86+ARM aparecerá más tarde, si aparece.

Conclusión: qué hacer a continuación

¿Veremos híbridos x86+ARM en PCs de consumo? Sí—pero no porque sea elegante. Porque la autonomía vende y el cómputo heterogéneo es ahora normal. La verdadera pregunta es si la industria puede hacer que la experiencia operativa sea lo bastante aburrida para desplegarse a escala.

Siguientes pasos prácticos:

  • Si compras: exige inventario de firmware, rollback y una matriz probada de controladores/seguridad. Si el proveedor no puede responder con claridad, vete.
  • Si gestionas flotas: construye un piloto con despliegue por anillos, fijado estricto de versiones y trazas de carga reales. Mide presión de CPU/I/O y throttling térmico, no sensaciones.
  • Si desarrollas software: reduce dependencias en modo kernel, publica builds ARM-nativos donde sea posible y trata «bibliotecas nativas en todas partes» como requisito de producto, no como algo opcional.
  • Si trabajas en seguridad: expande tu modelo de amenazas para incluir cada elemento de cómputo con acceso a red o memoria. La parcheabilidad y la observabilidad son no negociables.

Los híbridos llegarán como la mayoría de cambios en infraestructura: silenciosamente, luego de repente, y entonces estarás de guardia por ellos. Asegúrate de poder medirlos antes de tener que explicarlos.

]]>
https://cr0x.net/es/veremos-hibridos-x86-arm-pcs/feed/ 0
Big.LITTLE llega a x86: cómo las ideas de ARM pasaron a los PCs https://cr0x.net/es/big-little-x86-ideas-arm-en/ https://cr0x.net/es/big-little-x86-ideas-arm-en/#respond Mon, 26 Jan 2026 06:51:20 +0000 https://cr0x.net/big-little-x86-ideas-arm-en/ Compras un PC “más rápido”. Tu compilación termina más despacio, tu juego se entrecorta o tu presupuesto de latencia de repente parece una ficción.
Los gráficos dicen que la CPU está “solo al 40%”, pero el servicio se está derritiendo de todos modos. Bienvenido al x86 híbrido: donde no todos los núcleos son iguales,
y tu planificador ahora forma parte de tu contrato de rendimiento.

La filosofía Big.LITTLE de ARM —mezclar núcleos rápidos con núcleos eficientes— escapó de los teléfonos y aterrizó en portátiles, escritorios y cada vez más en
máquinas de clase workstation. La buena noticia: mejor rendimiento por vatio y mayor rendimiento bajo límites de potencia. La mala noticia: si asumes
que “un núcleo es un núcleo”, entregarás sorpresas.

Qué cambió realmente cuando x86 se volvió híbrido

La planificación clásica de capacidad x86 asumía multiprocesamiento simétrico: los núcleos se diferenciaban principalmente por la frecuencia en un momento dado, no por microarquitectura.
Si tenías 16 núcleos, planificabas como si tuvieras 16 motores aproximadamente comparables. Los diseños híbridos rompen deliberadamente esa suposición.

En x86 híbrido moderno (más visible en Alder Lake de Intel y sucesores), obtienes:

  • P-cores (núcleos de rendimiento): núcleos grandes fuera de orden, mayor rendimiento por hilo, a menudo con SMT/Hyper-Threading.
  • E-cores (núcleos de eficiencia): núcleos más pequeños, mayor rendimiento por vatio, típicamente sin SMT, a menudo agrupados en clústeres.

Esa mezcla es una estrategia de gestión de energía disfrazada de CPU. Bajo límites de potencia estrictos, los E-cores pueden encargarse de trabajo en segundo plano de forma barata
mientras los P-cores aceleran. Bajo carga intensiva de rendimiento, los E-cores añaden “más carriles”, pero no carriles del mismo ancho.
Si los tratas como idénticos, colocarás mal hilos críticos de latencia y luego culparás a “la sobrecarga de Linux” como si fuera 2007.

El SO debe responder una nueva pregunta: dónde debe ejecutarse este hilo dado su comportamiento y las capacidades del núcleo?
Eso es planificación más indicios más telemetría. También es una pelea de políticas: ¿maximizas rendimiento, minimizas latencia de cola,
reduces energía o mantienes la interfaz responsiva? La respuesta cambia según la carga de trabajo, y cambia durante el día.

Una CPU híbrida es como un centro de datos con dos tipos de instancias: unas son rápidas y caras, otras son más lentas pero abundantes.
Si tu escalador automático no entiende eso, felicidades —has inventado un nuevo tipo de “vecino ruidoso de CPU”.

Una verdad seca: la observabilidad importa más ahora. Cuando ves “CPU 40%”, debes preguntar qué CPU, a qué frecuencia,
con qué tasa de migración, bajo qué límites de potencia.

Contexto histórico: la versión breve y concreta

Lo híbrido no apareció de la nada. Es una cadena de restricciones de potencia, lecciones móviles y compromisos de escritorio.
Aquí hay hechos concretos que vale la pena recordar porque explican el comportamiento actual.

  1. 2011–2013: ARM popularizó Big.LITTLE como forma de equilibrar rendimiento y duración de batería, usando inicialmente clústeres “big” y “little”.
  2. 2015–2017: Los planificadores maduraron desde “cambio de clúster” hacia una colocación de tareas más fina; lo móvil convirtió esto en un problema de SO de primera clase.
  3. Intel intentó heterogeneidad antes: ejemplos incluyen reflexiones de la era Atom + Core, y más tarde “Lakefield” (un chip x86 híbrido) como precursor.
  4. Alder Lake (Core 12ª gen): llevó lo híbrido a la corriente principal en escritorios/portátiles, forzando a Windows y Linux a adaptarse a escala de consumidor.
  5. Intel Thread Director: telemetría de hardware que aconseja al planificador del SO cómo se comporta un hilo (computacional, ligado a memoria, etc.).
  6. Windows 11: se lanzó con mejoras explícitas de planificación híbrida; Windows 10 a menudo se comportaba “aceptable” hasta que dejó de hacerlo.
  7. Linaje de Linux EAS: Energy Aware Scheduling creció en ARM; esa experiencia alimentó la capacidad de Linux para razonar sobre compensaciones energía/rendimiento.
  8. Los límites de potencia se volvieron centrales: PL1/PL2 (y políticas de firmware del proveedor) pueden dominar el rendimiento real más que los relojes turbo anunciados.
  9. La asimetría SMT importa: los P-cores pueden presentar dos CPUs lógicas; los E-cores usualmente no—así que el “conteo de vCPU” puede engañarte.

Realidad de la planificación: P-cores, E-cores y el pacto del SO

Híbrido significa que el planificador ahora es parte de tu arquitectura

En CPUs simétricas, el trabajo del planificador era mayormente justicia, balance de carga y localidad de caché. En híbridas, también es clasificación y
colocación. Eso es más difícil porque el “núcleo correcto” depende de lo que el hilo está haciendo en este momento.

Si eres un SRE, deberías pensar en Thread Director (o cualquier mecanismo similar) como “perfilado en tiempo de ejecución para la planificación”.
Ayuda. No es magia. También crea una dependencia: la mejor colocación a menudo requiere soporte del SO, microcódigo y firmware
que funcionen en conjunto.

Qué intenta optimizar el SO

  • Capacidad de respuesta: mantener hilos interactivos en P-cores, evitar reducciones de frecuencia que causen tartamudeo en la UI.
  • Rendimiento agregado: repartir trabajo de fondo o paralelo en E-cores, reservar P-cores para los consumidores pesados.
  • Energía: ejecutar trabajo “barato” en E-cores a menor voltaje/frecuencia, mantener la potencia del paquete dentro de límites.
  • Térmica: evitar turbo sostenido en P-cores si desencadena throttling que perjudique todo después.
  • Localidad de caché: las migraciones no son gratuitas; lo híbrido aumenta la tentación de migrar, lo que puede salir mal.

Qué puede salir mal: tres verdades centrales

Primero, una carga puede ser “computacionalmente pesada” pero sensible a latencia. Si el SO “amablemente” la mueve a E-cores porque parece trabajo de fondo,
tu p99 se dispara.

Segundo, la potencia se comparte a nivel de paquete. Si los E-cores se despiertan y consumen potencia, los P-cores pueden perder margen de turbo. Puedes aumentar el rendimiento agregado
y reducir el rendimiento por hilo al mismo tiempo. Eso parece ilegal, pero es física.

Tercero, la topología es desordenada. Los E-cores pueden estar agrupados; los P-cores tienen hermanos SMT; algunos núcleos comparten L2/L3 de maneras distintas. “Fijar” (pinning)
ya no es una historia simple “núcleo 0–N” a menos que inspecciones tu mapeo real.

Parafraseando una idea de Werner Vogels: Todo falla, todo el tiempo; construye sistemas que lo supongan y sigan funcionando.
La planificación híbrida es una versión pequeña de eso. Asume que habrá mal colocación e instrumenta para ello.

Broma corta #1: Las CPUs híbridas son los primeros chips que pueden ejecutar tu compilación en “modo eco” sin preguntar —porque el planificador está siendo atento hoy.

Dónde falla en producción: modos de fallo reconocibles

1) Picos de latencia en cola con “CPU” promedio normal

El gráfico clásico: la CPU media está bien, la carga promedio está bien, pero el p99 se desploma. En híbrido, esto puede suceder cuando los hilos más calientes
de petición aterrizan en E-cores o rebotan entre tipos de núcleo. La media se mantiene educada; la cola quema tu SLO.

Busca conmutaciones de contexto elevadas, migraciones y oscilaciones de frecuencia. También verifica límites de potencia: el throttling del paquete puede crear
ralentizaciones periódicas que se correlacionan con temperatura o carga sostenida.

2) Los benchmarks mienten porque el SO y la política de energía son parte del benchmark

Si ejecutas un benchmark una vez y declaras victoria, estás midiendo la suerte. Lo híbrido añade variabilidad: demonios en segundo plano pueden robar P-cores;
el governor puede limitar frecuencias; el firmware puede aplicar límites silenciosos.

3) Sorpresas en virtualización: las vCPU no son iguales

Una VM fijada a “8 vCPU” puede estar realmente fijada a “el desempeño equivalente a 8 E-cores”, mientras otra VM obtiene P-cores.
Sin fijado explícito y conciencia de NUMA/topología, puedes crear clases de rendimiento accidentalmente.

4) Las cargas de almacenamiento y red se vuelven raras

Las pilas de almacenamiento tienen hilos sensibles a latencia (manejo de interrupciones, finalización de IO, journaling). Si pones esos en E-cores bajo carga
obtendrás jitter. Mientras tanto, los hilos de rendimiento pueden ocupar felizmente E-cores y parecer “eficientes”, hasta que la ruta de finalización de IO
se convierte en el cuello de botella.

5) Thrash por límites de potencia

Los picos PL2 se sienten bien para tareas cortas. Bajo carga sostenida, el firmware te reduce a PL1, a veces agresivamente.
Si tu carga alterna entre fases explosivas y sostenidas (compilaciones, compactaciones, ETL), puedes ver rendimiento dependiente de la fase que
parece una regresión, pero es política de potencia.

Tareas prácticas: comandos, salidas y decisiones (12+)

Estos son los chequeos que realmente ejecuto cuando alguien dice “esta máquina híbrida es más lenta que la antigua”.
Cada tarea incluye: comando, qué significa la salida y la decisión que tomas.
Los comandos asumen Linux; donde Windows es relevante, lo indico.

Task 1: Confirma que estás en una CPU híbrida y ve la topología

cr0x@server:~$ lscpu
Architecture:                         x86_64
CPU(s):                               24
Thread(s) per core:                   2
Core(s) per socket:                   16
Socket(s):                            1
Model name:                           12th Gen Intel(R) Core(TM) i7-12700K
Flags:                                ... hwp ...

Qué significa: “CPU(s): 24” con “Core(s) per socket: 16” y SMT=2 indica una mezcla (8 P-cores con SMT = 16 hilos, más 4 E-cores = 4 hilos → 20; ajustar según modelo).
En algunos modelos verás totales que solo tienen sentido con híbrido.

Decisión: Si las cuentas no concilian limpiamente, trata el sistema como heterogéneo y deja de usar “CPU%” como un escalar único en las discusiones.

Task 2: Identifica qué CPUs lógicas son P-core vs E-core

cr0x@server:~$ lscpu -e=CPU,CORE,SOCKET,NODE,ONLINE,MAXMHZ,MINMHZ
CPU CORE SOCKET NODE ONLINE MAXMHZ MINMHZ
0   0    0      0    yes    4900.0 800.0
1   0    0      0    yes    4900.0 800.0
...
16  12   0      0    yes    3600.0 800.0
17  13   0      0    yes    3600.0 800.0

Qué significa: Si algunas CPUs tienen MAXMHZ más bajo, esas suelen ser E-cores (no infalible, pero una pista fuerte).
CPUs lógicas apareadas (mismo CORE) sugieren SMT en P-cores.

Decisión: Crea una lista “conjunto P” y “conjunto E” para fijado y benchmarking. No adivines.

Task 3: Comprueba la vista del kernel sobre tipos de núcleo (si está disponible)

cr0x@server:~$ grep . /sys/devices/system/cpu/cpu*/topology/core_type 2>/dev/null | head
/sys/devices/system/cpu/cpu0/topology/core_type:1
/sys/devices/system/cpu/cpu8/topology/core_type:0

Qué significa: Algunos kernels exponen core_type (los valores varían por plataforma). Su presencia indica que el kernel es consciente del híbrido.

Decisión: Si esto no existe, sé más conservador: confía en caracterización de rendimiento y fijado en lugar de asumir que el planificador siempre acierta.

Task 4: Ver comportamiento actual de frecuencias por CPU

cr0x@server:~$ sudo turbostat --quiet --show CPU,Core,Avg_MHz,Bzy_MHz,Busy%,PkgWatt --interval 1 --num_iterations 3
CPU Core  Avg_MHz Bzy_MHz Busy% PkgWatt
-   -     820     3100    12.3  18.4
-   -     790     2800    11.8  18.1
-   -     910     3400    14.6  21.2

Qué significa: Avg_MHz muestra la frecuencia efectiva incluyendo tiempo idle; Bzy_MHz muestra la frecuencia en estado ocupado. Si Bzy_MHz es bajo bajo carga, puedes estar limitado por potencia o fijado a E-cores.

Decisión: Si Bzy_MHz cae cuando los E-cores se despiertan, estás viendo contención de potencia de paquete. Considera aislar P-cores para trabajo de latencia o ajustar límites de potencia/governor.

Task 5: Verifica el governor y el driver de CPU (la política importa)

cr0x@server:~$ cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0 1 2 3 4 5 6 7
  available cpufreq governors: performance powersave
  current policy: frequency should be within 800 MHz and 4900 MHz.
                  The governor "powersave" may decide which speed to use

Qué significa: intel_pstate con powersave es común y no es inherentemente malo. Pero la política interactúa con la planificación híbrida y los topes de potencia.

Decisión: Para servidores sensibles a latencia, prueba performance o ajusta la frecuencia mínima; para portátiles, mantén powersave pero valida la latencia de cola bajo carga realista.

Task 6: Detectar throttling (térmico o de potencia) en logs del kernel

cr0x@server:~$ sudo dmesg -T | egrep -i 'throttl|thermal|powercap|pstate' | tail -n 8
[Mon Jan 10 10:21:33 2026] intel_pstate: Turbo disabled by BIOS or power limits
[Mon Jan 10 10:21:37 2026] thermal thermal_zone0: throttling, current temp: 96 C

Qué significa: No estás benchmarkeando arquitectura de CPU; estás benchmarkeando refrigeración y política de firmware.

Decisión: Arregla la refrigeración, ajusta PL1/PL2 o deja de esperar turbo sostenido. Si es un servidor, trata esto como un problema de configuración de hardware/firmware a nivel de incidente.

Task 7: Verifica restricciones de powercap (RAPL)

cr0x@server:~$ sudo powercap-info -p intel-rapl
Zone: intel-rapl:0 (package-0)
  enabled: 1
  power limit 0: 125.00 W (enabled)
  power limit 1: 190.00 W (enabled)

Qué significa: Esos límites pueden dominar si los P-cores alcanzan el boost esperado bajo carga mixta de E-cores.

Decisión: Si ejecutas servicios sensibles a latencia, considera reducir la carga de fondo o reservar margen en lugar de subir límites de potencia y rezar a que los ventiladores ganen.

Task 8: Observa migraciones y conmutaciones de contexto (thrash del planificador)

cr0x@server:~$ pidstat -w -p 1234 1 3
Linux 6.6.0 (server)  01/10/2026  _x86_64_  (24 CPU)

11:02:01 PM   UID       PID   cswch/s nvcswch/s  Command
11:02:02 PM  1000      1234   1200.00    540.00  myservice
11:02:03 PM  1000      1234   1188.00    601.00  myservice

Qué significa: Altas conmutaciones de contexto voluntarias/involuntarias pueden indicar contención de locks, esperas de IO o preempción/migraciones frecuentes.
En sistemas híbridos, también puede ser señal de hilos rebotando para “balancear” la carga.

Decisión: Si las tasas de cswitch son altas durante picos de latencia, investiga afinidad de CPU, conjuntos cgroup Cpuset y ajustes del planificador; no te limites a “añadir núcleos”.

Task 9: Confirma dónde se está ejecutando realmente un proceso

cr0x@server:~$ ps -o pid,psr,comm -p 1234
  PID PSR COMMAND
 1234  17  myservice

Qué significa: PSR es la última CPU donde se ejecutó el proceso. Si mapeas 17 a tu conjunto de E-cores, ese es tu cigarro humeante.

Decisión: Para procesos críticos de latencia, fíjalos a P-cores (con cuidado) o usa cpusets para que el planificador aún pueda balancear dentro de los “buenos” núcleos.

Task 10: Fija una carga para pruebas controladas (taskset)

cr0x@server:~$ taskset -cp 0-7 1234
pid 1234's current affinity list: 0-23
pid 1234's new affinity list: 0-7

Qué significa: Restringiste el proceso a CPUs 0–7. Si esos son P-cores (verifica!), lo has protegido de colocación en E-cores.

Decisión: Si la latencia de cola mejora inmediatamente, tienes un problema de planificación/colocación, no un “la aplicación se volvió más lenta” repentinamente.

Task 11: Usa cgroups cpuset para política en lugar de fijado puntual

cr0x@server:~$ sudo mkdir -p /sys/fs/cgroup/cpuset/latency
cr0x@server:~$ echo 0-7 | sudo tee /sys/fs/cgroup/cpuset/latency/cpuset.cpus
0-7
cr0x@server:~$ echo 0 | sudo tee /sys/fs/cgroup/cpuset/latency/cpuset.mems
0
cr0x@server:~$ echo 1234 | sudo tee /sys/fs/cgroup/cpuset/latency/cgroup.procs
1234

Qué significa: Creaste un cgroup cpuset y moviste el proceso dentro. Esto es menos frágil que taskset por proceso en automatización.

Decisión: Estandariza: ejecuta tiers de latencia en cpusets P-core; ejecuta lotes en cpusets E-core. Luego valida que la contención de potencia no anule tus ganancias.

Task 12: Verifica la colocación de IRQs (el asesino silencioso de latencia de almacenamiento/red)

cr0x@server:~$ cat /proc/interrupts | head -n 6
           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5
  16:     10234          0          0          0          0          0   IO-APIC   16-fasteoi   i8042
  33:    882301     120333     110221      99881      93211      88110   PCI-MSI 524288-edge      nvme0q0

Qué significa: Si las interrupciones de dispositivos clave se manejan mayormente en E-cores (o en una CPU sobrecargada), la latencia de finalización de IO puede fluctuar.

Decisión: Considera fijar IRQs críticos a P-cores (o a un conjunto dedicado) para rutas de almacenamiento/red de baja latencia—especialmente en sistemas con alta PPS o IOPS.

Task 13: Confirma utilización por núcleo y tiempo steal (virtualización)

cr0x@server:~$ mpstat -P ALL 1 1 | egrep 'Average|all| 0 | 8 | 16 '
Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %idle
Average:     all   35.12    0.00    9.44    0.80    0.00    0.70    3.10  50.84
Average:       0   62.00    0.00   12.00    0.00    0.00    0.00    0.00  26.00
Average:       8   18.00    0.00    5.00    0.00    0.00    0.00    7.00  70.00
Average:      16   10.00    0.00    2.00    0.00    0.00    0.00    0.00  88.00

Qué significa: Algunas CPUs están mucho más ocupadas; %steal indica que el hypervisor está quitando tiempo. Lo híbrido empeora esto cuando las vCPU se mapean mal a tipos de núcleo.

Decisión: Si el steal es alto o las CPUs ocupadas corresponden a E-cores, revisa el fijado de VM y los conjuntos de CPU del host. No “arregles” primero dentro del guest.

Task 14: Perfilar hotspots rápidamente (perf top)

cr0x@server:~$ sudo perf top -p 1234
Samples: 14K of event 'cycles', 4000 Hz, Event count (approx.): 2987654321
  22.11%  myservice  libc.so.6          [.] memcpy_avx_unaligned_erms
  11.03%  myservice  myservice          [.] parse_request
   6.40%  kernel     [kernel]           [.] finish_task_switch

Qué significa: Si finish_task_switch aparece mucho, la sobrecarga de planificación/migraciones puede ser parte del problema. Si son hotspots puros de aplicación, la colocación híbrida puede ser secundaria.

Decisión: Símbolos del kernel altos de planificación más picos de latencia → inspecciona afinidad/cgroups y tasas de migración. Símbolos mayormente de la app → optimiza código o reduce contención primero.

Broma corta #2: Nada enseña humildad como una máquina “de 24 núcleos” donde la mitad de los núcleos son realmente una sugerencia.

Guía de diagnóstico rápido

El objetivo es encontrar el cuello de botella en minutos, no horas, y evitar la trampa de “benchmarkear tus sentimientos”.
Este es el orden que usualmente da señal más rápido en x86 híbrido.

Primero: confirma que tienes un problema de colocación, no un problema puro de capacidad

  • Revisa latencia de cola vs CPU promedio: si p99 está mal mientras la CPU promedio es moderada, sospecha colocación o throttling.
  • Revisa ocupado y frecuencia por CPU: usa mpstat + turbostat. Busca algunas CPUs saturadas mientras otras están idle, y bajo Bzy_MHz.
  • Revisa migraciones/conmutaciones: pidstat -w, perf top buscando finish_task_switch.

Segundo: descarta topes de potencia/térmicos (el limitador silencioso)

  • dmesg por throttling: logs thermal/powercap.
  • Límites RAPL: verifica si los límites de paquete son bajos para esa clase de carga.
  • Realidad de refrigeración: si esto es una torre con un cooler barato, no estás ejecutando “una CPU”, estás ejecutando “un calefactor con opiniones”.

Tercero: aísla por política — P-cores para latencia, E-cores para batch

  • Fija una réplica: mueve una instancia a un cpuset de P-cores y compara p99.
  • Mueve trabajos de fondo: fija compactaciones, backups, indexación, builds de CI a E-cores.
  • Valida servicios del sistema: asegúrate de que IRQs y ksoftirqd no estén atascados en tu clúster de E-cores.

Cuarto: si sigue mal, trátalo como un incidente clásico de rendimiento

  • Contención de locks, comportamiento del asignador, esperas de IO, churn del page cache, pausas de GC.
  • Lo híbrido puede amplificar estos problemas, pero rara vez los inventa desde cero.

Errores comunes: síntoma → causa raíz → solución

1) Síntoma: la latencia p99 se duplicó tras “actualizar la CPU”, pero los promedios parecen bien

Causa raíz: hilos críticos de latencia programados en E-cores o migrando entre tipos de núcleo; o P-cores perdiendo turbo por contención de potencia de paquete.

Solución: crea cpusets P-core para la capa de latencia; mueve lotes/fondo al conjunto E-core; verifica con ps -o psr y turbostat.

2) Síntoma: pipeline de build/test más lento en una máquina con más “hilos”

Causa raíz: hilos SMT en P-cores inflan el conteo lógico de CPU; la paralelización configurada a CPUs lógicas sobrecarga recursos compartidos; los E-cores no igualan IPC de P-cores.

Solución: limita trabajos paralelos a P-cores físicos para pasos sensibles a latencia; ejecuta pasos embarrassingly parallel en E-cores; afina make -j o la concurrencia de CI.

3) Síntoma: tartamudeo esporádico bajo carga mixta; desaparece al parar trabajos de fondo

Causa raíz: la carga de fondo en E-cores consume potencia de paquete y provoca caídas de frecuencia o throttling que afectan a P-cores.

Solución: programa trabajo por lotes durante horas valle; limita CPU de lotes con cgroups; mantén margen térmico; evita perseguir PL2 sostenido.

4) Síntoma: VM A consistentemente más lenta que VM B con configuraciones idénticas

Causa raíz: las vCPU del host están fijadas de manera distinta (pesadas en E-cores vs P-cores), o el planificador del host empaquetó una VM en E-cores.

Solución: fija vCPUs de VM a clases de núcleo consistentes; documenta la política; valida con mpstat y la topología a nivel host.

5) Síntoma: jitter en latencia NVMe después de habilitar “todos los núcleos” y modo de máximo rendimiento

Causa raíz: IRQs/softirqs aterrizando en E-cores o CPUs sobrecargadas; hilos de finalización de IO hambrientos.

Solución: reequilibra afinidad de IRQ; reserva algunos P-cores para IO y redes; confirma distribución de interrupciones en /proc/interrupts.

6) Síntoma: regresiones de rendimiento difieren entre Windows 10 y Windows 11

Causa raíz: distinto soporte de planificación híbrida; Thread Director usa indicios diferente; planes de energía distintos.

Solución: estandariza versiones de SO para flotas sensibles al rendimiento; alinea planes de energía; valida con pruebas repetibles basadas en fijado.

7) Síntoma: “Uso de CPU bajo” pero la cola de ejecución es alta

Causa raíz: hilos ejecutables esperando P-cores mientras E-cores están idle (o viceversa) debido a restricciones de cpuset o decisiones del planificador; también posible tope de frecuencia.

Solución: inspecciona cpusets y afinidades; prueba expandir el conjunto P-core; revisa governor y límites de potencia; evita aislamientos accidentales que dejen capacidad sin usar.

Tres mini-historias corporativas de la era híbrida

Mini-historia 1: El incidente causado por una suposición equivocada

Un equipo movió una capa API sensible a latencia desde servidores antiguos y simétricos a cajas nuevas de clase estación de trabajo de desarrollador que estaban “disponibles ahora”.
La hoja de especificaciones se veía genial: más núcleos, relojes boost más altos, todo moderno. La migración fue tratada como un resize rutinario.

El primer síntoma no fue un crash. Fue el peor tipo de fallo: una hemorragia lenta. p95 subió gradualmente, luego p99 activó alertas en pico.
La CPU promedio rondaba 50%. La carga promedio no era destacable. On-call hizo el ritual normal: escalar, reiniciar, culpar al último deploy.
Nada movió la aguja por mucho tiempo.

La suposición equivocada estaba incrustada en su modelo mental: “16 núcleos son 16 núcleos”. El runtime tenía un pool de hilos dimensionado por CPUs lógicas.
Bajo carga explosiva, un conjunto de hilos de petición aterrizó en E-cores mientras GC y algún mantenimiento de fondo también se activaron. El paquete alcanzó un límite de potencia,
los P-cores perdieron margen de turbo y el planificador empezó a migrar como si intentara resolver un sudoku en tiempo real.

La solución fue aburrida pero decisiva. Construyeron una política de cpuset: manejo de peticiones y bucles de eventos se quedaron en P-cores; tareas de fondo se fijaron a E-cores.
También redujeron el tamaño del pool de hilos a algo más cercano a la “capacidad de P-cores” en lugar del “conteo de CPU lógico”. La latencia de cola volvió a la normalidad sin añadir máquinas.

La acción del postmortem que importó: actualizar los documentos de planificación de capacidad para tratar lo híbrido como cómputo heterogéneo. No más dimensionamiento “solo por número de núcleos”.
No es un cambio filosófico; es evitar la fatiga de pager.

Mini-historia 2: La optimización que salió mal

Otra organización ejecutaba un pipeline de ingestión de alto rendimiento. Era mayormente parsing ligado a CPU con picos ocasionales de IO.
Notaron que los E-cores estaban infrautilizados y decidieron “desbloquear rendimiento gratis” incrementando la concurrencia de workers hasta que todos los CPUs lógicos estuvieron ocupados.
El benchmark mostró un bonito aumento de rendimiento el primer día. Champán.

Luego vino producción. El pipeline de ingestión convivía con un servicio de consultas orientado a usuarios en la misma clase de host.
Bajo tráfico real, la ingestión subió, los E-cores se llenaron, la potencia de paquete aumentó y los P-cores de la consulta dejaron de sostener su boost.
La latencia de consultas se volvió irregular. No consistentemente mala—suficientemente mala para erosionar confianza y disparar reintentos. Los reintentos aumentaron carga. El bucle clásico,
ahora potenciado por la heterogeneidad del silicio.

El equipo inicialmente persiguió “problemas de red” porque los picos se correlacionaban con aumentos de throughput. Ajustaron buffers TCP, colas de NIC,
tunearon todo menos la restricción compartida real: potencia de paquete y colocación de planificación.

La solución eventual fue reducir la concurrencia de ingestión y confinarla explícitamente a E-cores con una cuota de CPU, dejando margen de potencia para los P-cores.
El throughput bajó ligeramente respecto al benchmark de laboratorio, pero el rendimiento visible para el usuario mejoró. En producción, la estabilidad es una característica,
no un extra.

La lección fue desagradable pero útil: “usar todos los núcleos” no es una optimización universal en CPUs híbridas. A veces el sistema más rápido es el que
deja capacidad sin usar para evitar activar el límite equivocado.

Mini-historia 3: La práctica aburrida pero correcta que salvó el día

Un equipo de plataforma tenía una regla que molestaba a los desarrolladores: cada nueva clase de hardware debía pasar una pequeña “suite de aceptación de confiabilidad”.
No un zoológico masivo de benchmarks—solo un conjunto repetible: frecuencia de CPU bajo carga sostenida, latencia de cola bajo carga mixta, detección de throttling,
comprobaciones de distribución de IRQs y validación de fijado.

Cuando llegaron las cajas x86 híbridas, la suite inmediatamente destacó dos problemas. Primero, la configuración de firmware por defecto imponía límites de potencia conservadores,
haciendo que el rendimiento sostenido cayera por debajo de expectativas. Segundo, su imagen base tenía un escáner de seguridad en segundo plano programado durante horas de oficina,
y éste consumía felizmente E-cores—reduciendo el boost de P-cores en pico.

Porque esto se encontró antes de producción, las correcciones fueron mundanas: ajustar la política de firmware para coincidir con la clase de carga, reprogramar el escaneo de seguridad,
y enviar una plantilla de servicio basada en cpuset para tiers de latencia. Sin heroísmos, sin war room, sin “¿por qué el dashboard del CEO está lento?”.

Esa suite no hizo famoso a nadie. Evitó un despliegue desordenado y ahorró a la organización aprender planificación híbrida por las malas.
Aburrido es un cumplido en operaciones.

Listas de verificación / plan paso a paso

Paso a paso: introducir x86 híbrido en una flota sin drama

  1. Inventario de topología: registra mapeo P/E de núcleos, presencia de SMT y frecuencias máximas por clase de núcleo.
  2. Estandariza firmware: alinea límites de potencia y política térmica por clase de carga (latencia vs rendimiento).
  3. Elige una estrategia de SO: no mezcles “cualquier kernel de la imagen” entre nodos híbridos; la madurez del planificador importa.
  4. Define tiers: decide qué servicios son críticos de latencia vs batch/rendimiento. Escríbelo.
  5. Implementa cpusets: cpuset P-core para tier de latencia; cpuset E-core para batch; deja un pequeño conjunto compartido para SO/tareas de housekeeping si hace falta.
  6. Higiene de IRQ: asegura que IRQs de almacenamiento/red caigan en núcleos que no estarán hambrientos; verifica distribución en /proc/interrupts.
  7. Baseline con carga mixta: ejecuta el tier de latencia mientras el tier de batch está activo; las fallas híbridas suelen necesitar contención para aparecer.
  8. Observa frecuencia y throttling: captura turbostat bajo carga sostenida; grep logs por eventos thermal/powercap.
  9. Define guardrails: limita CPU de batch con cuotas; evita los defaults “usar todos los CPUs” en CI y trabajos de fondo.
  10. Despliega canaries: compara p50/p95/p99 y tasas de error entre nodos simétricos e híbridos bajo tráfico real.
  11. Documenta la política: qué CPUs son “carril rápido”, qué se fija y quién puede cambiarlo.
  12. Re-test tras actualizaciones: microcódigo, kernel y actualizaciones del SO pueden cambiar comportamiento de planificación. Trátalos como cambios relevantes para rendimiento.

Lista de verificación: cuando alguien dice “lo híbrido es más lento”

  • ¿Sabemos qué CPUs son P vs E en este host?
  • ¿Los hilos críticos de latencia están ejecutándose en E-cores?
  • ¿Estamos haciendo throttling por potencia/térmica?
  • ¿Aumentó la concurrencia porque “aparecieron más hilos”?
  • ¿Los IRQs caen en los núcleos equivocados?
  • ¿Cambió la versión del SO o el plan de energía?
  • ¿Fijar una instancia a P-cores reproduce/mejora el problema?

Preguntas frecuentes

1) ¿Big.LITTLE en x86 es lo mismo que ARM Big.LITTLE?

Conceptualmente similar (núcleos heterogéneos por rendimiento/por vatio), mecánicamente diferente. El ecosistema ARM maduró antes con heterogeneidad,
y el soporte de planificación se formó por restricciones móviles. En x86 el principio es el mismo, pero la topología, firmware y expectativas legacy difieren.

2) ¿Por qué la CPU promedio se ve bien mientras la latencia es mala?

Porque el promedio oculta la colocación. Unos pocos hilos calientes en E-cores pueden dominar p99 incluso si muchas otras CPUs están idle.
Además, límites de potencia pueden reducir la frecuencia de P-cores sin llevar la utilización al 100%.

3) ¿Debería simplemente desactivar los E-cores?

A veces para objetivos de latencia muy estrictos, desactivar E-cores (o no programar tu servicio en ellos) puede simplificar la vida.
Pero estás desperdiciando capacidad de rendimiento y posiblemente empeorando el comportamiento de potencia en otros aspectos. Prefiere cpusets y políticas primero;
desactívalos solo si has probado que la planificación híbrida no puede cumplir tus SLOs con un esfuerzo razonable.

4) ¿Windows 11 realmente importa para CPUs híbridas?

Para híbridos mainstream de Intel, Windows 11 incluye mejoras de planificación y mejor uso de indicios de hardware. Windows 10 puede funcionar,
pero es más probable que coloque hilos incorrectamente bajo ciertas mezclas de carga foreground/background. Si te importa comportamiento consistente, estandariza.

5) En Linux, ¿cuál es la palanca más grande que controlo?

La política de colocación de CPU. Usa cgroups cpuset para reservar P-cores para trabajo sensible a latencia y restringir batch a E-cores.
Luego valida frecuencia y throttling. El governor importa, pero la colocación normalmente mueve la aguja primero.

6) ¿Por qué aumentó mi throughput pero disminuyó mi rendimiento single-thread?

Porque la potencia del paquete es compartida. Activar E-cores puede reducir el presupuesto de potencia disponible para el boost de P-cores, así que el rendimiento “sprint”
por hilo cae mientras el rendimiento agregado sube. Los sistemas híbridos intercambian velocidad máxima por hilo por trabajo sostenido por vatio.

7) ¿Cómo complica SMT la planificación híbrida?

SMT duplica CPUs lógicas en P-cores, lo que infla conteos de hilos y tienta a frameworks a sobre-suscribir.
Mientras tanto los E-cores a menudo no tienen SMT, así que “una CPU lógica” puede significar diferente capacidad real según dónde caiga.

8) ¿Y los contenedores y Kubernetes?

Si fijas requests/limits de CPU sin conciencia de topología, los pods pueden aterrizar en cualquier CPU lógica, incluidos E-cores.
Para pods sensibles a latencia, usa labeling de nodos y políticas cpuset/CPU manager donde corresponda, y valida dónde corren tus pods.
De lo contrario terminarás con “clases de rendimiento aleatorias” dentro de un pool de nodos supuestamente uniforme.

9) ¿Los CPUs híbridos cambian cómo hago benchmarking?

Sí: debes reportar colocación, política de potencia y frecuencias sostenidas. Ejecuta pruebas de carga mixta, no solo microbenchmarks aislados.
Siempre haz al menos una ejecución fijada a P-cores y otra fijada a E-cores para conocer los límites del comportamiento.

10) ¿Cuál es la prueba más simple para comprobar un problema híbrido sospechado?

Fija una instancia del servicio a P-cores (cpuset o taskset), vuelve a ejecutar el mismo tráfico y compara p95/p99 y frecuencia de CPU.
Si mejora, deja de discutir sobre “regresiones de código” y arregla la colocación/política de potencia primero.

Siguientes pasos que puedes tomar esta semana

x86 híbrido no es un gimmick; es una respuesta al fin de la fácil escalada de frecuencia y a la realidad de límites de potencia. Puede ser excelente.
También puede ser una trampa de rendimiento si sigues pretendiendo que las CPUs son simétricas.

  1. Mapea tus núcleos: produce una ficha por host listando rangos de CPUs lógicas P-core y E-core. Ponla en tu CMDB o notas de inventario.
  2. Elige una política: decide qué cargas obtienen P-cores por defecto y cuáles se permiten en E-cores. Hazlo explícito.
  3. Implementa cpusets: inclúyelos como parte de las plantillas de unidad de servicio en lugar de arreglos ad-hoc en on-call.
  4. Instrumenta las señales correctas: utilización por núcleo, frecuencia, eventos de throttling, migraciones/conmutaciones y latencia de cola.
  5. Prueba escenarios de carga mixta: siempre mide con actividad de fondo realista, porque ahí es donde aparece el comportamiento híbrido.

Si haces esas cinco cosas, las CPUs híbridas dejan de ser misteriosas y empiezan a ser útiles. No necesitas convertirte en un ingeniero de planificadores.
Solo necesitas dejar de asumir que el chip miente cuando en realidad está haciendo exactamente lo que pediste—implícitamente.

]]>
https://cr0x.net/es/big-little-x86-ideas-arm-en/feed/ 0
AMD Adrenalin: cuando el software importa más que el silicio https://cr0x.net/es/amd-adrenalin-cuando-software-importa-mas/ https://cr0x.net/es/amd-adrenalin-cuando-software-importa-mas/#respond Sun, 25 Jan 2026 23:25:26 +0000 https://cr0x.net/amd-adrenalin-cuando-software-importa-mas/ La gente compra una GPU más rápida y espera una vida más rápida. Luego su “actualización” provoca pantallas en negro, picos en los tiempos de fotograma, chasquidos de audio o un consumo en reposo que podría calentar un estudio pequeño. El silicio está bien. El problema suele ser la capa que parece ser “solo controladores”, pero actúa como un entorno operativo: AMD Software: Adrenalin Edition.

Si administras sistemas de producción, reconoces el patrón. Se activa una bandera de característica, cambia un planificador, una política de energía se vuelve “inteligente” y de repente el sistema funciona técnicamente pero es prácticamente inútil. Adrenalin es ese tipo de sistema. Puede hacer que una tarjeta de gama media se sienta premium—o hacer que una tarjeta premium parezca poseída.

La tesis: el software es la GPU que realmente experimentas

Las reseñas de GPU se obsesionan con el silicio: conteo de shaders, ancho de banda de memoria, caché, nodo. En el campo—especialmente en cargas mixtas como juego + streaming, CAD + videoconferencia, o “portátil de trabajo en un dock con tres monitores y una sensación de pavor”—las mayores variaciones vienen del comportamiento del software:

  • Planificación y encolamiento: cómo se encolan los fotogramas, cuándo suben los relojes, cómo el controlador agrupa el trabajo y cómo coopera (o pelea) con Windows.
  • Gestión de energía: el estado “inactivo” de la GPU en configuraciones de varios monitores, la residencia del reloj de memoria y el comportamiento de boost bajo cargas intermitentes.
  • Capas de funciones: métricas, grabación, sharpen, escalado—útiles hasta que se convierten en un impuesto de latencia de entrada o un disparador de fallos.
  • Perfiles por juego: pequeños interruptores que cambian la canalización de renderizado lo suficiente como para desplazar la latencia y los patrones de tartamudeo.
  • Rutas de estabilidad del controlador: timeouts (TDR), reinicios de kernel, hooks de superposición y servicios de fondo “útiles”.

Adrenalin no es solo un paquete de controladores. Es un motor de políticas con opiniones. Decide si tu GPU reduce reloj durante una pantalla de carga y no vuelve a subir lo suficientemente rápido. Decide si un hook de grabación se inyecta en la ruta de presentación de un juego. Decide si una función de ahorro de energía merece un fotograma perdido en el peor momento posible.

Por eso “la tarjeta de mi amigo es el mismo modelo y funciona bien” no es una declaración tranquilizadora. El estado del software difiere. Los perfiles difieren. La captura de fondo difiere. La política de energía de Windows difiere. El EDID del monitor y los tiempos de refresco difieren. El mismo silicio puede comportarse como dos productos distintos.

Postura práctica: trata las funciones de Adrenalin como interruptores de producción. Actívalas con intención, pruébalas como probarías una actualización de kernel y conserva un plan de reversión. “Configúralo y olvídalo” es como terminas depurando un tartamudeo que solo ocurre durante la reunión trimestral cuando compartes pantalla.

Idea parafraseada (atribuida): Los sistemas fallan de maneras desordenadas e inesperadas; la fiabilidad viene de diseñar y operar para esa desorden.Richard Cook, investigador en seguridad/operaciones

Además, a la GPU no le importa que “solo cambiaste una cosa”. La GPU es como una base de datos: un índice “inofensivo” puede cambiar todo el perfil de rendimiento. Ese es el chiste uno. (También es verdad.)

Hechos e historia que explican las rarezas actuales

Entender la proliferación de funciones modernas de Adrenalin es más fácil con un poco de contexto. No nostalgia—diagnóstico. Aquí hay puntos concretos que importan:

  1. “Catalyst” se convirtió en “Radeon Software” y luego en “Adrenalin.” La suite de controladores de AMD pasó de “panel de control básico” a “plataforma de funciones”, añadiendo captura, superposiciones, afinamiento y optimizaciones específicas por juego.
  2. WDDM cambió las reglas. La evolución del Windows Display Driver Model (desde Vista en adelante, con saltos mayores después) cambió cómo los controladores programan el trabajo y se recuperan de cuelgues, haciendo del comportamiento TDR una preocupación de fiabilidad de primera clase.
  3. FreeSync hizo que los monitores sean parte del sistema. El refresco variable no es solo una casilla; es una negociación entre GPU, controlador y firmware del monitor, con casos límite alrededor del parpadeo y LFC (low framerate compensation).
  4. El stutter por compilación de shaders se hizo visible. A medida que las canalizaciones y los shaders crecieron en complejidad, la experiencia “la primera vez” empeoró. Las cachés de shaders del controlador ayudan, pero también pueden invalidarse, reconstruirse y crear misterios de “solo tartamudea después de actualizaciones”.
  5. La programación de hardware de GPU pasó al SO. Características como Hardware Accelerated GPU Scheduling (HAGS) cambiaron los trade-offs de latencia/estabilidad según la madurez del controlador y la carga de trabajo.
  6. El comportamiento de potencia de RDNA se volvió agresivo. Las GPUs modernas persiguen eficiencia con transiciones rápidas de reloj/potencia. Genial para portátiles y consumo en reposo—hasta que las transiciones en sí mismas se convierten en la fuente de microtartamudeos.
  7. Las superposiciones se volvieron actores de rendimiento. Las superposiciones de métricas y los hooks de captura no son gratis. Interceptan llamadas de present, añaden sincronización y pueden cambiar el pacing de fotogramas incluso cuando “los FPS parecen bien”.
  8. El undervolting se hizo común. Las tarjetas RDNA a menudo tienen margen para undervolts, pero la estabilidad depende de la carga de trabajo. Un undervolt “estable” en un juego puede hacer que otro shader mix provoque un fallo.
  9. La complejidad multi-monitor explotó. Alto refresco + refresco mixto + HDR + DSC + diferentes tiempos pueden mantener los relojes de memoria altos en reposo y crear calor/ruido de potencia que parece un “defecto” de hardware.

Esto no es difamación específica contra AMD. NVIDIA e Intel tienen realidades similares. La diferencia es que Adrenalin expone muchos controles directamente a los usuarios finales, lo que es tanto empoderador como un poco como dar sudo a todo el mundo.

Mapa de funciones de Adrenalin: qué importa, qué muerde

1) Anti-Lag / funciones de latencia: útiles, pero no apiles salsas misteriosas

Las funciones anti-latencia normalmente reducen la profundidad de la cola de renderizado. Eso puede mejorar la capacidad de respuesta, pero también puede exponer cuellos de botella de CPU o aumentar la sensibilidad a picos en los tiempos de fotograma. Si ya usas ajustes “baja latencia” dentro del juego o configuraciones a nivel de motor, apilar manipulaciones de cola del lado del controlador puede crear un pacing desigual.

Haz: prueba Anti-Lag por juego. Usa medidas objetivas (gráficos de tiempos de fotograma, sensación de entrada en escenarios repetidos).

Evita: habilitar cada ajuste de latencia en todas partes y luego culpar a “los controladores AMD” cuando un título reacciona mal.

2) Radeon Chill: genial para energía/calor, riesgoso para pacing competitivo

Chill limita dinámicamente los FPS según la entrada. Si intentas minimizar calor y ruido durante juego casual, es excelente. Si intentas mantener una entrega de fotogramas constante para consistencia de puntería, puede introducir micro-variaciones que se sienten como entrada “blanda”.

3) Enhanced Sync / VSync / FreeSync: tres políticas, un resultado—pacing

Estas funciones interactúan. FreeSync maneja el refresco variable dentro de un rango. VSync impone salida sin tearing, a veces esperando. Enhanced Sync intenta reducir la penalización de VSync permitiendo tearing por encima del refresco mientras evita tearing por debajo. No es “mejor”, es “modos de fallo diferentes”.

Cuando alguien dice “tengo stutter con FreeSync”, el 30% del tiempo es en realidad mal pacing de fotogramas (picos de CPU) que FreeSync solo hace más visible.

4) RSR, RIS y escalado: victorias baratas con bordes afilados

RSR (upscaling a nivel de controlador) puede ser útil cuando el juego carece de FSR. RIS (sharpening) puede hacer que imágenes upscaladas se vean nítidas. Pero el escalado a nivel de controlador puede interactuar con fullscreen exclusivo, modos sin bordes y software de captura.

Regla: para solucionar problemas, desactiva primero el escalado/afilado. Restaura después, una función a la vez.

5) Superposición de métricas y grabación: el impuesto silencioso

Las superposiciones enganchan la ruta de presentación. Los hooks de grabación hacen más. Esto está bien cuando es estable; es brutal cuando no lo es. Lo peor es que “el contador de FPS dice 144” mientras los tiempos de fotograma titilan y la entrada se siente retrasada.

6) Afinamiento (undervolt/overclock/límite de energía): estás probando un sistema de potencia, no “un número”

Undervolting puede reducir potencia y ruido sin perder rendimiento. Overclocking puede ganar unos pocos por ciento. Ambos pueden convertir una estabilidad límite en reinicios intermitentes del controlador que parecen errores de software.

Consejo para producción: si necesitas fiabilidad (workstation, rig de streaming, VR), undervolta con conservadurismo y valida en múltiples cargas de trabajo. No aceptes “pasó 10 minutos” como firma de aprobación.

7) Caché de shaders: es tu salvador o tu chivo expiatorio

Las cachés de shaders reducen el stutter de compilación después de la primera ejecución. Pero después de actualizaciones de controlador, parches de juego o alternar APIs gráficas, las cachés se reconstruyen. Los usuarios interpretan esto como “el nuevo controlador es peor”. A veces lo es. A veces es solo caché fría más nuevos shaders.

El trabajo de Adrenalin es hacer que un conjunto complicado de compensaciones parezca simple. Tu trabajo es tratarlo como un sistema de gestión de cambios.

Guía de diagnóstico rápido

Cuando el rendimiento o la estabilidad se tuercen, no busques funciones al azar. Ve en orden. Encuentra primero la clase de cuello de botella y luego afina.

Primero: clasifica el modo de fallo

  • Fallo duro: pantalla en negro, timeout del controlador, reinicio del sistema, errores WHEA, “El controlador de pantalla dejó de responder”.
  • Fallo blando: tartamudeo, picos, latencia de entrada, tiempos de fotograma inconsistentes, chasquidos de audio ligados a carga de GPU.
  • Fallo de potencia/termal: ventiladores acelerando en reposo, vatios altos en reposo, reloj de VRAM alto en el escritorio, saltos de temperatura en puntos calientes.

Segundo: establece una línea base conocida como buena

  • Desactiva superposiciones/funciones de grabación (superposición de métricas de Adrenalin, instant replay).
  • Restablece el afinamiento de la GPU a los valores predeterminados (sin undervolt/OC).
  • Usa un monitor a la frecuencia nativa como prueba, si sospechas rarezas multi-monitor.
  • Elige un escenario reproducible (la misma escena del juego, la misma pasada de benchmark).

Tercero: decide dónde vive el cuello de botella

  • Limitado por CPU: utilización de GPU baja, FPS varía con la carga de CPU, picos de tiempo de fotograma se alinean con picos de CPU.
  • Limitado por GPU: utilización de GPU alta, relojes estables; bajar resolución apenas cambia FPS si está limitado por CPU; bajar resolución aumenta FPS si está limitado por GPU.
  • Limitado por I/O o compilación de shaders: tartamudeos en áreas nuevas, stutters la primera vez, actividad de disco alta, saltos puntuales.
  • Limitado por controlador/superposición: latencia de entrada consistente, tartamudeo solo con superposición/grabación activada, picos de tiempo de present, correlación con software de captura.

Cuarto: prueba un cambio a la vez, registra todo

Adrenalin adora los ajustes “por juego”. Eso es genial—hasta que olvidas lo que cambiaste hace tres meses. Captura el estado actual, cambia un interruptor, vuelve a ejecutar el escenario y registra el resultado.

Quinto: consolida la solución con salvaguardas

Una vez estable y suave, exporta/registra tus elecciones de perfil de Adrenalin y configuraciones de Windows. La solución no es real hasta que sobrevive a una actualización de controlador y un reinicio.

Tareas prácticas: comandos, salidas y la decisión que tomas

Estas tareas asumen Windows, porque Adrenalin es principalmente un plano de control para Windows. Los comandos son herramientas estándar que puedes ejecutar desde PowerShell o CMD. Cuando sea relevante, te diré qué significa la salida y qué decisión tomar a continuación.

Task 1: Confirmar la GPU y la versión del controlador (no confíes en la memoria)

cr0x@server:~$ dxdiag /t %TEMP%\dxdiag.txt
...output...

Qué significa la salida: El archivo de texto generado contiene “Card name”, “Driver Version” y “Driver Date”. Esto es la verdad fundamental de “qué estoy ejecutando realmente”.

Decisión: Si estás depurando estabilidad, registra esta versión antes de cambiar nada. Si la fecha del controlador es sospechosamente antigua o no coincide con el paquete que pretendías, planifica una instalación limpia.

Task 2: Comprobar el modelo de controlador de GPU de Windows y el nivel WDDM

cr0x@server:~$ wmic path win32_videocontroller get name,driverversion
Name                                 DriverVersion
AMD Radeon RX 7900 XTX               31.0.24027.1012

Qué significa la salida: Obtienes el nombre del dispositivo y la cadena de versión del controlador instalada como la ve Windows.

Decisión: Si soporte pide “versión del controlador”, esta es la cadena que quieren. Úsala para correlacionar con las notas de la versión de Adrenalin y regresiones conocidas.

Task 3: Detectar rápidamente TDRs y reinicios del controlador en el Visor de eventos

cr0x@server:~$ wevtutil qe System /q:"*[System[(EventID=4101)]]" /c:5 /f:text
Event[0]:
  Log Name: System
  Source: Display
  Event ID: 4101
  Level: Warning
  Description: Display driver amdwddmg stopped responding and has successfully recovered.

Qué significa la salida: El Event ID 4101 es el clásico “reinicio del controlador”. No es prueba de un controlador malo; es prueba de que la GPU dejó de responder dentro de la ventana TDR.

Decisión: Si ves 4101 alrededor del momento de pantallas en negro o cierres de apps, prioriza: revierte undervolt/OC, comprueba la estabilidad de potencia, prueba sin superposiciones y considera ajustar TDR solo como último recurso.

Task 4: Comprobar errores de hardware WHEA (a menudo mal diagnosticados como “controladores”)

cr0x@server:~$ wevtutil qe System /q:"*[System[Provider[@Name='Microsoft-Windows-WHEA-Logger']]]" /c:5 /f:text
Event[0]:
  Source: Microsoft-Windows-WHEA-Logger
  Event ID: 17
  Level: Warning
  Description: A corrected hardware error has occurred.

Qué significa la salida: Los errores corregidos pueden apuntar a problemas de integridad de señal PCIe, PSU marginal o ajustes inestables de memoria/IF. Las GPUs se llevan la culpa porque son visibles.

Decisión: Si eventos WHEA coinciden con carga de GPU, detén el tuning y valida la estabilidad de la plataforma (BIOS, XMP/EXPO de RAM, risers PCIe, cableado de PSU).

Task 5: Comprobar el plan de energía y el esquema activo

cr0x@server:~$ powercfg /getactivescheme
Power Scheme GUID: 381b4222-f694-41f0-9685-ff5bb260df2e  (Balanced)

Qué significa la salida: Balanced está bien la mayor parte del tiempo, pero algunos sistemas se comportan de manera diferente bajo High performance, especialmente alrededor de la residencia de relojes y la latencia.

Decisión: Si ves comportamientos extraños en relojes/pacing durante cargas explosivas, prueba High performance como experimento controlado—no como superstición permanente.

Task 6: Inspeccionar utilización de GPU y memoria dedicada en vivo

cr0x@server:~$ typeperf "\GPU Engine(*)\Utilization Percentage" -sc 1
"(PDH-CSV 4.0)","\\HOST\GPU Engine(pid_1234_luid_0x00000000_0x0000_eng_0)\Utilization Percentage","\\HOST\GPU Engine(pid_1234_luid_0x00000000_0x0000_eng_1)\Utilization Percentage"
"01/21/2026 10:12:03.123","78.000000","2.000000"

Qué significa la salida: Puedes ver si el motor 3D está realmente ocupado. Utilización baja con FPS bajos suele implicar cuello de botella de CPU o de cola/controlador.

Decisión: Si la GPU no está ocupada, deja de “optimizar ajustes de GPU” y mira límites de CPU, tareas en segundo plano o ajustes de sincronización/cap.

Task 7: Confirmar si HAGS está habilitado (una variable común de estabilidad)

cr0x@server:~$ reg query "HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers" /v HwSchMode
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers
    HwSchMode    REG_DWORD    0x2

Qué significa la salida: Los valores varían por versión de Windows, pero no cero normalmente indica que la programación por hardware está habilitada.

Decisión: Si persigues tartamudeos intermitentes o glitches de captura, prueba con HAGS alternado (y reinicia). No cambies diez cosas a la vez—HAGS es una “palanca grande”.

Task 8: Comprobar el estado de Game Mode

cr0x@server:~$ reg query "HKCU\Software\Microsoft\GameBar" /v AllowAutoGameMode
HKEY_CURRENT_USER\Software\Microsoft\GameBar
    AllowAutoGameMode    REG_DWORD    0x1

Qué significa la salida: Game Mode puede cambiar el comportamiento del planificador y las prioridades de actividad en segundo plano.

Decisión: Si ves regresión después de una actualización de Windows, prueba con Game Mode desactivado como control. Si ayuda, encontraste una interacción de planificación, no una “GPU mala”.

Task 9: Verificar el estado VRR (refresh variable) desde el ángulo del SO

cr0x@server:~$ reg query "HKCU\Software\Microsoft\DirectX\UserGpuPreferences" /s
HKEY_CURRENT_USER\Software\Microsoft\DirectX\UserGpuPreferences
    DirectXUserGlobalSettings    REG_SZ    VRROptimizeEnable=1;

Qué significa la salida: Windows almacena algunas preferencias gráficas por aplicación/usuario. Esto no reemplaza los ajustes de Adrenalin; añade otra capa.

Decisión: Si el comportamiento de FreeSync/VRR es inconsistente entre juegos, comprueba tanto las configuraciones gráficas de Windows como los perfiles por juego de Adrenalin. La consistencia vence a la sofisticación.

Task 10: Identificar procesos pesados de overlay/captura (los sospechosos habituales)

cr0x@server:~$ tasklist | findstr /i "radeon xbox gamebar obs discord steam"
RadeonSoftware.exe              18320 Console                    1    412,000 K
GamingServices.exe              10244 Services                   0     46,120 K
obs64.exe                        9216 Console                    1    286,500 K
Discord.exe                     14172 Console                    1    318,200 K
steam.exe                        7332 Console                    1    198,400 K

Qué significa la salida: Las superposiciones se apilan. Cada una cree que es la protagonista.

Decisión: Si tienes tartamudeo o latencia de entrada, reduce a una superposición (o ninguna) para las pruebas. Si el problema desaparece, reintroduce una por una. Sí, es aburrido. No, no hay atajo.

Task 11: Buscar cambios de instalación del controlador y reinicios de dispositivo

cr0x@server:~$ pnputil /enum-drivers | findstr /i "advanced micro devices display"
Published Name: oem42.inf
Original Name: u0409150.inf
Provider Name: Advanced Micro Devices, Inc.
Class Name: Display adapters
Driver Version: 31.0.24027.1012

Qué significa la salida: Confirma qué paquete de controlador está instalado en el driver store.

Decisión: Si has instalado múltiples versiones de controladores con el tiempo y ves rarezas, considera un procedimiento de instalación limpia. El residuo en el driver-store puede causar comportamiento extraño del dispositivo, especialmente después de saltos de versión mayores.

Task 12: Comprobar salud y espacio del disco (caché de shaders y streaming de assets son I/O)

cr0x@server:~$ wmic logicaldisk get caption,freespace,size
Caption  FreeSpace     Size
C:       41234534400   511989841920
D:       98765432192   1023989841920

Qué significa la salida: Poco espacio libre puede arruinar el comportamiento de la caché de shaders y el streaming de assets.

Decisión: Si C: está justo de espacio, libera espacio antes de culpar a la GPU. El tartamudeo por presión de I/O se siente como “hitching de GPU” porque se manifiesta como parones de frame.

Task 13: Confirmar velocidad de enlace PCIe (captura problemas de riser/cable/slot)

cr0x@server:~$ wmic path Win32_VideoController get Name,PNPDeviceID
Name                                 PNPDeviceID
AMD Radeon RX 7900 XTX               PCI\VEN_1002&DEV_744C&SUBSYS_...

Qué significa la salida: WMIC no mostrará la velocidad de enlace PCIe negociada directamente, pero te da el PNP device ID que puedes correlacionar en herramientas del proveedor.

Decisión: Si sospechas un problema de negociación PCIe (enlace x1, retroceso a Gen1), valida en firmware/BIOS y con utilidades GPU apropiadas. No ignores los risers—los risers PCIe son imanes de caos.

Task 14: Capturar un trazo de rendimiento reproducible (porque las opiniones no son métricas)

cr0x@server:~$ wpr -start GPU -filemode
...output...
cr0x@server:~$ wpr -stop %TEMP%\gpu_trace.etl
...output...

Qué significa la salida: Obtienes un trazo ETL que puedes inspeccionar con Windows Performance Analyzer para ver colas de GPU, tiempos de present y programación de CPU.

Decisión: Si estás atascado en “parece que está peor”, trazar termina la discusión. Úsalo cuando necesites probar si el cuello de botella es la programación de CPU, la cola de GPU o la sobrecarga del controlador.

Eso ni siquiera cubre todas las herramientas que puedes usar, pero es suficiente para pasar del folklore al diagnóstico.

Tres mini-historias corporativas (anonimizadas, plausibles, técnicamente precisas)

Mini-historia 1: El incidente causado por una suposición errónea

Un equipo de medios operaba una pequeña granja de render con estaciones de trabajo Windows con GPUs AMD. La carga no era de juegos—era transcodificaciones aceleradas por GPU y algún procesamiento de efectos. Tenían una “imagen dorada” y creían que las actualizaciones de controladores eran puramente correcciones de seguridad y compatibilidad. Así que dejaron que Windows Update lo gestionara.

Un lunes, comenzaron a llegar tickets: pantallas en negro aleatorias durante exportaciones y la cola de render deteniéndose. Las máquinas no se caían por completo; “se recuperaban”. Los artistas lo describieron como “la GPU echándose una siesta”. En los logs, System mostraba advertencias Event ID 4101 y un puñado de cierres de app. Clásico.

La suposición errónea: “Si el controlador se reinicia y se recupera, es un bug transitorio y el trabajo continuará.” En realidad, su app de transcode manejaba mal la pérdida de dispositivo. Un TDR equivalía a un trabajo fallido, y el gestor de colas no siempre reintentaba correctamente.

La solución no fue exótica. Congelaron la versión del controlador, desactivaron las actualizaciones automáticas de controladores de pantalla e implementaron un anillo de validación: dos máquinas reciben primero el nuevo paquete Adrenalin, ejecutan una suite de exportación conocida y solo entonces lo promueven. Fue gestión de cambios, no depuración heroica.

Mini-historia 2: La optimización que salió mal

Un lounge corporativo de esports (sí, existe) quería PCs más silenciosos. El responsable de TI habilitó ahorro de energía agresivo: Radeon Chill por doquier, límites de potencia más bajos y un perfil de undervolt universal copiado de un post en un foro que “funcionó en la misma tarjeta”. También activaron la superposición de métricas para que el personal pudiera demostrar “todo está bien”.

¿Silencioso? Sí. ¿Estable? En absoluto. El problema fue sutil: picos intermitentes de latencia de entrada y tartamudeos ocasionales exactamente cuando los jugadores movían el ratón tras un breve letargo. Chill estaba haciendo su trabajo—bajando frames cuando la entrada estaba “inactiva”—pero el juego competitivo es básicamente una secuencia de micro-inactivos seguidos por movimientos violentos súbitos.

El undervolt añadió picante. No se bloqueaba en pruebas de estrés. Solo fallaba en un par de títulos que activaban una mezcla específica de shaders y estados de boost, provocando reinicios raros del controlador que los jugadores llamaban “el juego simplemente murió”. La superposición, además, aportaba su propia sobrecarga y a veces colisionaba con actualizaciones de anti-cheat. Fue la tormenta perfecta de “optimizaciones”.

La reversión fue directa: afinamiento por defecto, Chill apagado para perfiles competitivos, superposiciones deshabilitadas salvo cuando se diagnosticaba. Mantuvieron un perfil de ahorro para juegos casuales y uno de “rendimiento y consistencia” para competitivo. El ruido subió un poco. Las quejas bajaron mucho. Esa es la tasa de cambio correcta.

Mini-historia 3: La práctica aburrida pero correcta que salvó el día

Una firma de diseño con GPUs AMD operaba un entorno mixto: CAD, previsualizaciones 3D y muchas videoconferencias. Multi-monitor por todas partes. Habían recibido suficientes reportes de “a veces tartamudea” como para implementar una regla aburrida: cada máquina sale con un documento de configuración gráfica base.

El documento incluía: qué funciones de Adrenalin están permitidas (FreeSync activado si está soportado, sin trucos de escalado global), cuáles están apagadas por defecto (superposición de métricas, instant replay) y una prueba estándar: ejecutar una rotación de viewport corta en un modelo conocido con la grabación de pantalla apagada y luego encendida. Si activar la grabación cambia materialmente el comportamiento de los tiempos de fotograma, la máquina se marca para pruebas más profundas.

Un día, una actualización de Windows cambió algo sobre el comportamiento de captura. Los usuarios empezaron a reportar UI entrecortada al compartir pantalla. Debido a que la línea base estaba documentada, soporte pudo comparar rápidamente “lo esperado” vs “lo actual” y aislar que el problema se correlacionaba con una ruta de captura particular. Temporalmente desactivaron la función problemática en la flota y esperaron una actualización del controlador.

Sin pánico, sin búsquedas de brujas, sin “debe ser lote de hardware defectuoso”. Solo control de configuración, pruebas reproducibles y reversión. Las herramientas de fiabilidad más efectivas suelen ser papeleo y disciplina—poco atractivas, pero invictas.

Errores comunes: síntoma → causa raíz → arreglo

1) Síntoma: “Los FPS son altos pero se siente entrecortado”

  • Causa raíz: picos en tiempos de fotograma por compilación de shaders, hooks de superposición o programación de CPU; los promedios de FPS lo ocultan.
  • Arreglo: desactiva superposiciones/grabación primero; calienta la caché de shaders ejecutando la misma escena dos veces; confirma límite CPU vs GPU con comprobaciones de utilización.

2) Síntoma: “Pantalla negra, luego vuelve”

  • Causa raíz: reinicio TDR (Event ID 4101), a menudo provocado por undervolt/OC inestable, entrega de potencia o un bug del controlador en una ruta API específica.
  • Arreglo: revierte el afinamiento a stock; prueba con un monitor; revisa el Visor de eventos por 4101 y WHEA; si se reproduce en un título, cambia la API (DX11 vs DX12) o desactiva funciones a nivel de controlador para ese perfil.

3) Síntoma: “El consumo en reposo es enorme; los ventiladores no se calman”

  • Causa raíz: el timing multi-monitor fuerza relojes de VRAM altos; alto refresco + refresco mixto; interacciones HDR/DSC; grabación/superposición en segundo plano manteniendo la GPU activa.
  • Arreglo: prueba un solo monitor; alinea las frecuencias de refresco; desactiva la captura siempre activa; verifica las funciones de energía de Adrenalin y las apps de fondo de Windows.

4) Síntoma: “FreeSync parpadea en escenas oscuras”

  • Causa raíz: comportamiento en el borde del rango VRR o quirks del firmware del monitor, a menudo cerca del extremo inferior del rango FreeSync.
  • Arreglo: limita FPS para permanecer dentro del rango VRR; habilita/deshabilita LFC vía opciones del controlador donde esté disponible; prueba con diferente cable/puerto; prueba sin HDR.

5) Síntoma: “El tartamudeo sucede solo después de actualizar el controlador”

  • Causa raíz: invalidación y reconstrucción de la caché de shaders; actualizaciones de juego que cambian shaders; compilación ahora visible.
  • Arreglo: ejecuta la misma ruta/benchmark varias veces para repoblar cachés; evita juzgar un controlador por los primeros cinco minutos de un arranque en frío.

6) Síntoma: “El audio chasquea cuando la GPU está cargada”

  • Causa raíz: picos de latencia DPC por controladores, sensibilidad del audio USB o contención de la programación del sistema.
  • Arreglo: quita superposiciones/captura; actualiza controladores de chipset; mueve la interfaz de audio a otro controlador USB; prueba el plan de energía High performance; busca advertencias WHEA correlacionadas.

7) Síntoma: “Solo un juego se cierra, todo lo demás está bien”

  • Causa raíz: interacción de perfil por juego, diferencia de ruta API (DX11/DX12/Vulkan), conflictos con superposición de anti-cheat o afinamiento inestable solo expuesto por la mezcla de shaders de ese juego.
  • Arreglo: crea un perfil limpio por juego: desactiva Anti-Lag/RSR/RIS/Enhanced Sync; ajusta tuning a default; cambia la API si es posible; vuelve a probar.

Aquí el chiste dos: activar todas las funciones de Adrenalin a la vez es como habilitar todos los niveles de aislamiento de una base de datos simultáneamente—innovador, pero no recomendable para tu carrera.

Listas de verificación / plan paso a paso

Checklist A: Estabiliza primero, luego optimiza

  1. Registra la versión actual del controlador (Tarea 1/2).
  2. Exporta o captura pantalla de las configuraciones globales y por juego de Adrenalin.
  3. Desactiva temporalmente superposiciones y funciones de grabación de Adrenalin.
  4. Restablece el afinamiento a valores por defecto (sin undervolt/OC).
  5. Reinicia (sí, en serio).
  6. Reproduce el problema en un escenario controlado.
  7. Revisa Event ID 4101 y logs WHEA (Tarea 3/4).
  8. Si aparece TDR/WHEA: trátalo como estabilidad primero (potencia, plataforma, afinamiento), no como “ajustes gráficos”.

Checklist B: Afinamiento del pacing sin superstición

  1. Decide tu objetivo: latencia más baja, pacing más suave o menor consumo/ruido.
  2. Elige una estrategia de sincronización: FreeSync + tope de FPS, o VSync, o Enhanced Sync. No las tres a la vez.
  3. Limita FPS un poco por debajo del máximo de refresco al usar FreeSync (la herramienta la eliges tú; sé consistente).
  4. Prueba por stutter con superposiciones apagadas primero; agrega la superposición después si es imprescindible.
  5. Cambia una función a la vez: Anti-Lag, RIS, RSR, Chill.
  6. Valida con al menos dos títulos y una carga no-gaming si la máquina hace tareas mixtas.

Checklist C: Undervolt seguro (mentalidad de producción)

  1. Parte de la configuración stock y anota temperaturas, potencia y rendimiento de referencia.
  2. Undervolta en pasos pequeños; no persigas el número más bajo.
  3. Valida en cargas diversas: un juego raster pesado, un título con ray-tracing (si aplica) y una carga tipo compute.
  4. Vigila eventos de “driver recovered” incluso si la app no se cae.
  5. Si aparece inestabilidad, retrocede. Un undervolt estable es aquel en el que dejas de pensar.

Checklist D: Salud del consumo en reposo con multi-monitor

  1. Prueba un solo monitor a su refresco nativo; mide el comportamiento en reposo.
  2. Añade monitores uno a la vez; observa cuándo los relojes de VRAM dejan de entrar en reposo.
  3. Alinea frecuencias de refresco cuando sea posible (por ejemplo, todos a 60/120/144).
  4. Desactiva captura/superposición siempre activa para asegurar que la GPU pueda dormir.
  5. Si debes ejecutar refrescos mixtos, prioriza estabilidad sobre eficiencia perfecta. Los ventiladores cuestan menos que tu tiempo.

Preguntas frecuentes (FAQ)

1) ¿Es Adrenalin “bloat”, o realmente mejora el rendimiento?

Ambas cosas. Las funciones extra pueden mejorar la experiencia (controles de latencia, escalado, afinamiento por juego), pero también añaden hooks y comportamiento de fondo. Para fiabilidad, empieza mínimo y añade funciones con intención.

2) ¿Debo usar ajustes globales de Adrenalin o perfiles por juego?

Usa ajustes globales para valores predeterminados aburridos (por ejemplo, mantener superposiciones apagadas, mantener el afinamiento sensato). Usa perfiles por juego para cualquier cosa que cambie la ruta de render (Anti-Lag, Enhanced Sync, escalado). La contención por juego evita que “un título raro” envenene todo el sistema.

3) ¿Por qué a veces una actualización de controlador se siente peor aunque los benchmarks estén bien?

Caché de shaders fría, comportamiento de compilación cambiado o una nueva interacción con la programación de Windows. Ejecuta el mismo escenario varias veces, comprueba si el stutter mejora a medida que las cachés se calientan y valida con trazas si necesitas pruebas.

4) ¿Es más seguro undervolting que overclocking?

Suele ser más indulgente, pero “más seguro” depende de la carga. Un undervolt marginal puede ser estable en un juego y provocar fallos en otro. Si necesitas fiabilidad en producción, undervolta con conservadurismo y valida ampliamente.

5) ¿Las superposiciones realmente causan latencia de entrada?

Pueden. Cualquier cosa que intercepte la presentación de frames puede añadir sobrecarga o sincronización. Si diagnosticas latencia o microstutter, las superposiciones son culpables hasta que se demuestre lo contrario.

6) ¿Cuándo debo cambiar los ajustes TDR en el registro?

Casi nunca como primera respuesta. TDR es un mecanismo de seguridad. Extenderlo puede enmascarar cuelgues y hacer que el sistema parezca congelado por más tiempo. Arregla la causa subyacente (inestabilidad de tuning, problemas de potencia, regresión de controlador) antes de tocar TDR.

7) Parpadeo FreeSync: ¿es mi GPU o mi monitor?

Normalmente la interacción. El parpadeo VRR suele aparecer cerca del extremo inferior del rango VRR o con ciertos comportamientos de panel en escenas oscuras. Prueba límites de FPS, diferentes modos de refresco y valida cableado/puertos antes de declarar defectuoso el hardware.

8) ¿Debo habilitar HAGS en GPUs AMD?

Pruébalo. HAGS puede ayudar en algunas configuraciones y perjudicar en otras. Si estás estable y suave, no vayas buscando mejoras. Si tienes tartamudeo o rarezas de captura, HAGS vale la pena alternarlo como experimento controlado.

9) ¿Cuál es la forma más rápida de saber si estoy limitado por CPU o GPU?

Comprueba la utilización del motor de GPU (Tarea 6) y haz una prueba de escalado de resolución: baja la resolución significativamente. Si los FPS apenas cambian, probablemente estés limitado por CPU/controlador; si suben, estabas limitado por GPU.

10) ¿Necesito instalar controladores limpios cada vez?

No. Pero si experimentas regresiones extrañas entre versiones, o has saltado entre lanzamientos mayores repetidamente, una instalación limpia puede eliminar estado acumulado y basura del driver-store. Úsala como herramienta de diagnóstico, no como rito.

Siguientes pasos que puedes hacer hoy

  1. Línea base: registra la versión del controlador y las configuraciones actuales antes de tocar nada.
  2. Estabilidad primero: vuelve el afinamiento a stock, desactiva superposiciones/grabación, reinicia, reproduce.
  3. Interroga los logs: busca eventos 4101 y WHEA. Si existen, deja de discutir ajustes gráficos y arregla la estabilidad.
  4. Encuentra la clase de cuello de botella: CPU vs GPU vs I/O vs superposición. No afines a ciegas.
  5. Vuelve a añadir funciones con intención: una a la vez, por juego cuando sea posible, con una prueba repetible.
  6. Escríbelo: guarda una pequeña lista de “conocido bueno” para tu máquina. Tu yo futuro es un desconocido que romperá cosas.

Adrenalin no es solo un bufé de casillas. Es un plano de control. Trátalo como tal y obtendrás la mejor versión de tu GPU—a menudo sin comprar nuevo silicio. Trátalo como magia y pasarás tus fines de semana respondiendo incidentes para tu propio equipo de entretenimiento.

]]>
https://cr0x.net/es/amd-adrenalin-cuando-software-importa-mas/feed/ 0
Spectre/Meltdown: cuando las CPUs se convirtieron en la noticia de seguridad del año https://cr0x.net/es/spectre-meltdown-cpus-noticia-seguridad/ https://cr0x.net/es/spectre-meltdown-cpus-noticia-seguridad/#respond Thu, 22 Jan 2026 21:12:40 +0000 https://cr0x.net/spectre-meltdown-cpus-noticia-seguridad/ Una mañana tus gráficas parecen un desastre educado: tiempo de sistema de CPU sube, los cambios de contexto se disparan, la latencia p95 se duplica y tus nodos de almacenamiento de repente se sienten “misteriosamente” más lentos.
Nada cambió, todos lo juran. Entonces notas la versión del kernel. O el microcódigo. O ambos.

Spectre y Meltdown no solo trajeron una nueva clase de vulnerabilidades; convirtieron la CPU en un evento de gestión de cambios. Si operas sistemas en producción, ya no puedes tratar “parchear el kernel” como una tarea rutinaria. Tampoco puedes ignorarlo.

Qué se rompió realmente: especulación, cachés y límites de confianza

Spectre y Meltdown suelen explicarse con una frase vaga: “la ejecución especulativa filtra secretos”. Es cierto, pero incompleto.
La conclusión práctica para operadores es más precisa: la CPU puede hacer trabajo que luego finge que nunca ocurrió, y los efectos secundarios aún pueden medirse.
Esos efectos secundarios viven en el estado microarquitectónico: cachés, predictores de saltos y otros pequeños aceleradores de rendimiento que nunca fueron diseñados como límites de seguridad.

Las CPU modernas intentan ayudar. Adivinan hacia dónde irá el flujo de tu código, prefetch de memoria que creen que necesitarás, ejecutan instrucciones antes de que sea seguro hacerlo y reordenan operaciones para mantener las tuberías llenas.
Esto no es un bug; es la razón por la que tus servidores no funcionan como si fuera 1998.

El problema: el “mundo ficticio” interno de la CPU puede tocar datos que el mundo arquitectónico (el que promete tu modelo de programación) no debería acceder.
Cuando la CPU más tarde se da cuenta de que ese acceso no estaba permitido, descarta el resultado arquitectónico (ningún registro obtiene el secreto, no hay una falla visible en la vía normal).
Pero el acceso puede haber calentado una línea de caché, entrenado un predictor o dejado trazas temporales medibles.
Un atacante no necesita una lectura limpia; necesita una brecha de tiempo repetible y paciencia.

Por qué esto se convirtió en un problema de operaciones, no solo en una fiesta de investigación

Las mitigaciones funcionan mayoritariamente reduciendo la capacidad de la especulación para cruzar límites de privilegio o haciendo las transiciones entre niveles de privilegio más costosas.
Eso significa que las cargas reales cambian de forma. Aplicaciones con muchas llamadas al sistema, hipervisores, demonios de almacenamiento que hacen muchos cruces al kernel y cualquier cosa que sacuda la TLB lo sienten.
No puedes discutir con la física. Lo que puedes hacer es medir y adaptarte.

Una cita que aún debería estar en todo runbook de on-call:
La esperanza no es una estrategia. — Gene Kranz

(Sí, es una cita de la exploración espacial. Operaciones es exploración espacial con peores snacks y más YAML.)

Broma #1: Si alguna vez quisiste una razón para culpar a la CPU por tu outage, felicidades—2018 te la dio, y vino con microcódigo.

Dos nombres, muchos bugs: la taxonomía desordenada

“Spectre y Meltdown” suena como una pareja ordenada. En realidad es una discusión familiar con primos, subvariantes y banderas de mitigación que parecen un examen de backend de compilador.
Para trabajo en producción, lo clave es agruparlas por qué límite se cruza y cómo la mitigación cambia el rendimiento.

Meltdown: romper el aislamiento kernel/usuario (y por qué KPTI dolió)

Meltdown (el clásico) trata de la ejecución transitoria que permite lecturas de memoria privilegiada desde modo usuario en ciertas CPUs.
La comprobación de permiso arquitectónica ocurre, pero demasiado tarde para evitar los efectos microarquitectónicos. La famosa solución en Linux es KPTI (Kernel Page Table Isolation), también llamada PTI.

KPTI divide de forma más agresiva las tablas de páginas del kernel y del usuario, de modo que el espacio de usuario no puede mapear la mayor parte de la memoria del kernel ni siquiera como “solo supervisor”.
Eso reduce lo que la especulación puede tocar. El coste es mayor presión en la TLB y sobrecarga en las transiciones—syscalls, interrupciones y cambios de contexto.

Spectre: engañar a la especulación para leer memoria “permitida” de forma prohibida

Spectre es más amplio: coerciona a la CPU para ejecutar especulativamente rutas de código que acceden a datos de formas que el programador suponía imposibles.
Puede cruzar fronteras de proceso o de sandbox según la variante y la configuración.

Las mitigaciones incluyen:
retpolines, IBRS/IBPB, STIBP, barreras de especulación, cambios en el compilador y (en algunos casos) desactivar características como SMT según el modelo de amenaza.
Algunas mitigaciones viven en el kernel. Otras requieren microcódigo. Otras requieren recompilar userland o navegadores.

Qué deben recordar los operadores sobre la taxonomía

  • Mitigaciones clase Meltdown suelen aparecer como sobrecarga en syscalls/interrupciones y churn de TLB (piensa: appliances de red, rutas de IO de almacenamiento, bases de datos).
  • Mitigaciones clase Spectre suelen aparecer como sobrecarga en saltos/llamadas indirectas y limpieza de estado del predictor entre dominios (piensa: hipervisores, JITs, runtimes de lenguajes, navegadores).
  • El estado de mitigación es una matriz: versión del kernel, versión de microcódigo, parámetros de arranque, modelo de CPU, ajustes del hipervisor y firmware. Si “parchaste”, probablemente cambiaste tres cosas a la vez.

Hechos e historia que importan en las reuniones de operaciones

Algunos puntos concretos que puedes dejar caer en una revisión de cambios para cortar la mitología. No son trivia; explican por qué el despliegue se sintió caótico y por qué algunos equipos aún desconfían de los números de rendimiento de esa época.

  1. La divulgación ocurrió a principios de 2018, y fue una de las raras veces en que equipos de kernel, navegador, compilador y firmware tuvieron que enviar cambios urgentes juntos.
  2. Meltdown impactó principalmente ciertas CPUs Intel por cómo interactuaron las comprobaciones de permiso y la ejecución fuera de orden; muchos diseños AMD no eran vulnerables al mismo comportamiento de Meltdown.
  3. KPTI existía como idea antes de la divulgación pública (bajo nombres distintos) y se convirtió en la mitigación emblemática de Linux porque era práctica de desplegar ampliamente.
  4. Retpoline fue una mitigación importante basada en compilador para Spectre variante 2 (inyección de objetivo de rama indirecta), reescribiendo efectivamente ramas indirectas para reducir el abuso del predictor.
  5. Las actualizaciones de microcódigo se volvieron una dependencia de producción de primera clase; “firmware” dejó de ser una molestia anual y empezó a aparecer en las líneas de tiempo de incidentes.
  6. Algunas actualizaciones tempranas de microcódigo fueron revertidas por los vendedores debido a problemas de estabilidad en ciertos sistemas, lo que hizo que parchear se sintiera como elegir entre dos tipos de mal.
  7. Los navegadores también enviaron mitigaciones porque los temporizadores de JavaScript y las primitivas de memoria compartida hacían prácticas las mediciones por canal lateral; reducir la resolución de temporizadores y cambiar funciones importó.
  8. Los proveedores cloud tuvieron que parchear hosts y guests, y el orden importaba: si el host no estaba mitigado, un “guest parcheado” seguía en un vecindario riesgoso.
  9. El impacto en rendimiento no fue uniforme; fue desde “apenas medible” hasta “este trabajo acaba de volverse caro”, dependiendo de la tasa de syscalls, perfil de IO y virtualización.

Mitigaciones: qué hacen, qué cuestan y dónde golpean

Seamos directos: las mitigaciones son compromisos. Reducen la superficie de ataque eliminando o restringiendo optimizaciones.
Pagas en ciclos, complejidad o ambos. El trabajo es pagar deliberadamente, medir continuamente y evitar heridas autoinfligidas.

KPTI / PTI: aislar mappings del kernel

KPTI divide las tablas de páginas para que el modo usuario no mantenga las páginas del kernel mapeadas.
La sobrecarga aparece mayormente en las transiciones (syscalls, interrupciones) y en el comportamiento de la TLB.
Si ejecutas sistemas con alta tasa de paquetes, gateways de almacenamiento, boxes ocupados de NGINX, hosts de bases de datos con muchos fsync, o nodos hipervisores, lo notarás.

En kernels modernos con PCID y otras optimizaciones, la sobrecarga puede reducirse, pero la forma del coste permanece: más trabajo en el límite.

Retpoline, IBRS, IBPB, STIBP: higiene del predictor de ramas

Spectre variante 2 impulsó muchas mitigaciones alrededor de ramas indirectas y el estado del predictor:

  • Retpoline: técnica de compilador que evita ramas indirectas vulnerables redirigiendo la especulación hacia un “bucle trampa” inofensivo. A menudo una buena base cuando está disponible.
  • IBRS/IBPB: controles asistidos por microcódigo para restringir o vaciar la predicción de ramas a través de límites de privilegio. Más contundente, a veces más costoso.
  • STIBP: ayuda a aislar el estado del predictor entre hilos hermanos en el mismo núcleo (SMT). Puede costar rendimiento en cargas pesadas de SMT.

SMT/Hyper-Threading: la palanca incómoda

Algunos modelos de amenaza tratan a SMT como riesgoso porque los hermanos comparten recursos del núcleo.
Desactivar SMT puede reducir el riesgo de fuga entre hilos, pero es una palanca de rendimiento dramática: menos CPUs lógicas, menor throughput y comportamiento de scheduler diferente.
Hazlo solo con un modelo de amenaza claro y reservas de capacidad validadas.

Virtualización: donde las mitigaciones se suman

Los hipervisores son máquinas de límites de privilegio. Viven en salidas de VM, trucos de tablas de páginas, interrupciones y cambios de contexto.
Cuando añades KPTI, retpolines, controles de microcódigo y consideraciones de IOMMU, apilas sobrecargas en el camino más caliente que hizo barata la virtualización.

Almacenamiento e IO: por qué lo notaste allí primero

El almacenamiento es una fábrica de syscalls: lecturas/escrituras, polling, interrupciones, metadatos del sistema de archivos, pila de red, capa de bloque.
Incluso cuando el IO real está offload, la orquestación es intensiva en kernel.
Si tus nodos de almacenamiento se volvieron más lentos tras las mitigaciones, no es sorprendente; es un recordatorio de que “ligado a IO” a menudo significa “ligado a transiciones al kernel.”

Tareas prácticas: 12+ comandos que puedes ejecutar hoy

Esta es la parte que se gana su keep. Cada tarea incluye un comando, un ejemplo de salida, qué significa y qué decisión tomar.
Ejecútalas en un canario primero. Siempre.

Task 1: Obtén una vista de una página del estado de mitigaciones Spectre/Meltdown

cr0x@server:~$ sudo spectre-meltdown-checker --batch
CVE-2017-5754 [Meltdown]                    : MITIGATED (PTI)
CVE-2017-5715 [Spectre v2]                  : MITIGATED (Retpoline, IBPB)
CVE-2017-5753 [Spectre v1]                  : MITIGATED (usercopy/swapgs barriers)
CVE-2018-3639 [Speculative Store Bypass]    : VULNERABLE (mitigation disabled)

Qué significa: tienes un estado mixto. Algunas mitigaciones están activas; Speculative Store Bypass (SSB) no lo está.
Decisión: confirma tu modelo de amenaza. Si ejecutas código no confiable (multi-tenant, hosts de build compartidos, cargas tipo navegador), activa la mitigación SSB; de lo contrario documenta por qué está desactivada y monitoriza los valores por defecto del kernel.

Task 2: Comprueba qué piensa el kernel sobre el estado de vulnerabilidad de la CPU

cr0x@server:~$ grep . /sys/devices/system/cpu/vulnerabilities/*
/sys/devices/system/cpu/vulnerabilities/meltdown:Mitigation: PTI
/sys/devices/system/cpu/vulnerabilities/spectre_v1:Mitigation: usercopy/swapgs barriers and __user pointer sanitization
/sys/devices/system/cpu/vulnerabilities/spectre_v2:Mitigation: Retpoline; IBPB: conditional; IBRS_FW; STIBP: disabled
/sys/devices/system/cpu/vulnerabilities/spec_store_bypass:Vulnerable

Qué significa: verdad expuesta por el kernel, no lo que alguien recuerda del ticket de cambio.
Decisión: usa esta salida en las notas del incidente. Si aparece “Vulnerable” donde no puedes aceptarlo, corrige flags de arranque/microcódigo/kernel y vuelve a comprobar después del reboot.

Task 3: Confirma la revisión de microcódigo y si te falta una actualización del proveedor

cr0x@server:~$ dmesg | grep -i microcode | tail -n 5
[    0.312345] microcode: microcode updated early to revision 0x000000ea, date = 2023-08-14
[    0.312678] microcode: CPU0 updated to revision 0xea, date = 2023-08-14

Qué significa: microcódigo cargado temprano (bien) y puedes correlacionar la revisión con tu baseline.
Decisión: si la revisión cambió durante una ventana de regresión de rendimiento, trátalo como un sospechoso principal; haz A/B en hardware idéntico si es posible.

Task 4: Comprueba los parámetros de arranque del kernel para toggles de mitigación

cr0x@server:~$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-6.1.0 root=/dev/mapper/vg0-root ro quiet mitigations=auto,nosmt spectre_v2=on pti=on

Qué significa: las mitigaciones están mayormente activas, SMT desactivado.
Decisión: si desactivaste SMT, verifica capacidad y balance NUMA; si persigues latencia y no ejecutas código no confiable, puede que prefieras mitigations=auto y mantener SMT, pero documenta la aceptación de riesgo.

Task 5: Verifica si KPTI está realmente habilitado en runtime

cr0x@server:~$ dmesg | grep -i 'Kernel/User page tables isolation\|PTI' | tail -n 3
[    0.545678] Kernel/User page tables isolation: enabled

Qué significa: PTI está activado, por lo que cargas intensivas en syscalls pueden tener mayor sobrecarga.
Decisión: si ves sys% elevado y cambios de contexto, perfila la tasa de syscalls (Tareas 9–11) antes de culpar “a la red” o “al almacenamiento.”

Task 6: Valida exposición de virtualización (host) vía flags de lscpu

cr0x@server:~$ lscpu | egrep -i 'Model name|Hypervisor|Flags' | head -n 20
Model name:                           Intel(R) Xeon(R) CPU
Hypervisor vendor:                    KVM
Flags:                                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr ... pti ibpb ibrs stibp

Qué significa: estás en un entorno virtualizado (o host corriendo KVM) y existen flags relacionadas con mitigaciones.
Decisión: si eres un guest, coordina con tu proveedor/equipo de infra. La mitigación solo en guest no es una fuerza protectora completa.

Task 7: Comprueba la configuración del kernel para soporte retpoline

cr0x@server:~$ zgrep -E 'RETPOLINE|MITIGATION' /proc/config.gz | head
CONFIG_RETPOLINE=y
CONFIG_CPU_MITIGATIONS=y

Qué significa: el kernel fue compilado con retpoline y el framework de mitigaciones.
Decisión: si CONFIG_RETPOLINE falta en distros antiguas, actualiza el kernel en lugar de intentar “tunear alrededor” de ello.

Task 8: Confirma que retpoline está activo (no solo compilado)

cr0x@server:~$ dmesg | grep -i retpoline | tail -n 3
[    0.432100] Spectre V2 : Mitigation: Retpoline

Qué significa: la mitigación en runtime está en efecto.
Decisión: si ves IBRS forzado en su lugar (más costoso en algunas plataformas), investiga defaults de microcódigo/kernel; puede haber una ganancia de rendimiento al preferir retpoline cuando es seguro y soportado.

Task 9: Mide la tasa de syscalls y cambios de contexto (smoke test barato)

cr0x@server:~$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 824512  10240 987654    0    0     1     5 1200 4500 12 18 68  2  0
 3  0      0 824100  10240 987900    0    0     0     0 1350 5200 10 22 66  2  0

Qué significa: interrupciones (in) y cambios de contexto (cs) son visibles. “sy” es relativamente alto.
Decisión: si sy y cs saltaron tras habilitar PTI, indaga en procesos con muchas syscalls (Tarea 10) y en la distribución de interrupciones de red/IO (Tarea 12).

Task 10: Identifica qué procesos están impulsando syscalls y cambios de contexto

cr0x@server:~$ pidstat -w -u 1 5
Linux 6.1.0 (server)  01/21/2026  _x86_64_  (32 CPU)

12:00:01     UID       PID    %usr %system  nvcswch/s  nivcswch/s  Command
12:00:02       0      1423    5.00   18.00     800.00      20.00  nginx
12:00:02       0      2210    2.00   12.00     500.00      15.00  ceph-osd

Qué significa: nginx y ceph-osd están gastando tiempo significativo en espacio kernel y haciendo muchos switches.
Decisión: si la latencia empeoró, perfila los patrones de syscall de estos servicios; considera batch, io_uring, menos lecturas/escrituras pequeñas o ajustar conteo de hilos. No lo “arregles” desactivando mitigaciones a menos que asumas el riesgo de seguridad.

Task 11: Cuantifica fallos de página y dolor relacionado con TLB bajo carga

cr0x@server:~$ perf stat -e context-switches,cpu-migrations,page-faults,cycles,instructions -a -- sleep 10
 Performance counter stats for 'system wide':

       1,250,000      context-switches
          12,000      cpu-migrations
         980,000      page-faults
  35,000,000,000      cycles
  52,000,000,000      instructions

       10.001234567 seconds time elapsed

Qué significa: cambios de contexto y fallos de página altos correlacionan con mitigaciones sensibles a la sobrecarga (PTI) y presión general del sistema.
Decisión: si los fallos de página subieron después de un parche, comprueba presión de memoria, cambios en THP y si el nuevo kernel cambió defaults. No asumas que es “solo Spectre.”

Task 12: Comprueba la distribución de interrupciones (una regresión oculta clásica)

cr0x@server:~$ cat /proc/interrupts | head -n 15
           CPU0       CPU1       CPU2       CPU3
  24:   1200000          0          0          0  IR-PCI-MSI  eth0-TxRx-0
  25:         0     950000          0          0  IR-PCI-MSI  eth0-TxRx-1
  26:         0          0     910000          0  IR-PCI-MSI  eth0-TxRx-2
  27:         0          0          0     880000  IR-PCI-MSI  eth0-TxRx-3

Qué significa: las interrupciones están bien repartidas. Si ves todo anclado en CPU0, eso mata la latencia.
Decisión: después de parchear/reiniciar, verifica que las afinidades IRQ no se reiniciaron. Arregla la distribución antes de culpar a las mitigaciones por pérdida de throughput.

Task 13: Valida que no hayas desactivado mitigaciones globalmente por accidente

cr0x@server:~$ grep -R "mitigations=" -n /etc/default/grub /boot/grub/grub.cfg 2>/dev/null | head
/etc/default/grub:6:GRUB_CMDLINE_LINUX="quiet mitigations=auto"

Qué significa: mitigaciones en auto (usualmente sensato).
Decisión: si encuentras mitigations=off en producción, trátalo como un incidente a menos que tengas una aceptación de riesgo firmada y controles compensatorios.

Task 14: Comprueba la decisión en vivo del kernel: qué mitigaciones se seleccionaron

cr0x@server:~$ dmesg | egrep -i 'Spectre|Meltdown|MDS|L1TF|SSB|IBRS|IBPB|STIBP|PTI' | tail -n 30
[    0.420000] Spectre V1 : Mitigation: usercopy/swapgs barriers
[    0.430000] Spectre V2 : Mitigation: Retpoline; IBPB: conditional; STIBP: disabled
[    0.440000] Speculative Store Bypass: Vulnerable
[    0.545678] Kernel/User page tables isolation: enabled

Qué significa: el kernel te está diciendo exactamente lo que eligió.
Decisión: usa esto como registro autoritativo al conciliar “parchamos” con “seguimos vulnerables.”

Task 15: Para nodos intensivos en almacenamiento, vigila latencia de IO y espera de CPU

cr0x@server:~$ iostat -xz 1 3
Linux 6.1.0 (server)  01/21/2026  _x86_64_  (32 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          10.00    0.00   22.00    3.00    0.00   65.00

Device            r/s     w/s   rkB/s   wkB/s  await  svctm  %util
nvme0n1         800.0   600.0 64000.0 48000.0   2.10   0.25  35.0

Qué significa: la latencia de IO (await) es moderada; tiempo de CPU en system es alto. Esto insinúa sobrecarga en la ruta de IO (syscalls, pila de red, sistema de archivos), no un dispositivo saturado.
Decisión: optimiza la tasa de cruces al kernel y batching; si acabas de habilitar PTI, espera más CPU por IO. Planifica capacidad en consecuencia.

Guía rápida de diagnóstico: encuentra el cuello de botella antes de adivinar

Los peores incidentes post-mitigación no son “nos volvimos más lentos.” Son “nos volvimos más lentos y perseguimos lo equivocado durante 12 horas.”
Este playbook está diseñado para ese momento en que el pager está caliente y tu cerebro intenta negociar.

Primero: verifica el estado de mitigación y qué cambió

  1. Comprueba /sys/devices/system/cpu/vulnerabilities/* (Tarea 2). Si difiere entre nodos del mismo pool, tienes un problema de consistencia de flota, no un misterio de rendimiento.
  2. Revisa dmesg por líneas de PTI/retpoline/IBRS (Tareas 5, 8, 14). Captúralo en el documento del incidente. Lo necesitarás cuando alguien pregunte, “¿estamos seguros?”
  3. Comprueba la revisión de microcódigo (Tarea 3). Si el microcódigo cambió, trátalo como un nuevo stepping de CPU para propósitos de depuración.

Segundo: clasifica la forma de la regresión en 5 minutos

  • CPU de sistema sube, cambios de contexto suben (vmstat/pidstat): sospecha sobrecarga PTI + carga con muchas syscalls + distribución de IRQ.
  • Latencia sube, throughput estable: sospecha amplificación de cola por mayor overhead en kernel y jitter de scheduling; verifica balance de IRQ y saturación de CPU.
  • Hosts de virtualización degradados más que metal desnudo: sospecha mitigaciones compuestas en VM exits; verifica ajustes del hipervisor y controles de microcódigo.
  • Sólo ciertos tipos de instancia/nodos regresaron: sospecha modelos de CPU heterogéneos o diferentes bases de microcódigo/firmware.

Tercero: aisla el camino caliente con una herramienta, no con diez

  1. Ejecuta pidstat -u -w (Tarea 10) para encontrar el proceso que impulsa sys% y switches.
  2. Si es intensivo en kernel, ejecuta perf stat (Tarea 11) a nivel sistema para cuantificar switches y fallos.
  3. Si mira a red/almacenamiento, comprueba /proc/interrupts (Tarea 12) y iostat -xz (Tarea 15) para distinguir saturación de dispositivo de sobrecarga de CPU.

La disciplina aquí es simple: no cambies flags de mitigación a “probar” mientras estás a ciegas.
Mide primero. Si debes probar toggles, hazlo en un canario controlado con una carga representativa reproducida.

Tres mini-historias corporativas desde las trincheras de mitigación

Mini-historia 1: El incidente causado por una suposición errónea

Una compañía SaaS mediana corría una flota mixta: algo de metal desnudo para almacenamiento y bases de datos, y algunas VMs para capas de aplicación sin estado.
Cuando aterrizaron los parches Spectre/Meltdown, el equipo de plataforma programó una ventana normal de actualización de kernel y desplegó microcódigo vía su tooling habitual fuera de banda.
El despliegue parecía limpio. Los reboots tuvieron éxito. El ticket de cambio quedó marcado como “bajo riesgo”.

Dos días después, empezaron a acumularse quejas de latencia de clientes. No outages, solo una hemorragia lenta: p95 subió, luego p99 subió, luego las tormentas de reintentos.
El on-call vio tiempo de CPU en system elevado en los nodos gateway de almacenamiento y asumió que el nuevo kernel era “más pesado”.
Empezaron a ajustar pools de hilos de la aplicación. Luego ajustaron TCP. Luego ajustaron todo lo que se puede ajustar cuando no sabes lo que haces.

La suposición errónea: “todos los nodos son idénticos”. No lo eran.
La mitad de los gateways de almacenamiento estaban en un modelo de CPU que requería PTI y tenía microcódigo más antiguo inicialmente, mientras que la otra mitad era más nueva y se benefició de características de hardware que reducían la sobrecarga de PTI.
El scheduler y el balanceador no lo sabían, así que la distribución de tráfico creó una lotería de rendimiento.

La solución no fue mágica. Reunieron el estado de mitigación y las revisiones de microcódigo en la flota y encontraron dos baselines distintas.
Los nodos “lentos” no estaban mal configurados; simplemente estaban más impactados por la misma postura de seguridad.
El equipo de plataforma dividió pools por generación de CPU, ajustó pesos de tráfico y movió a los tenants más calientes fuera de los nodos afectados hasta que una mejora de capacidad alcanzó.

La lección: la heterogeneidad convierte el “parcheo” en un experimento distribuido. Si no puedes uniformar la flota, al menos hazla explícitamente no uniforme: labels, pools y restricciones de scheduling.

Mini-historia 2: La optimización que salió mal

Una firma de servicios financieros tenía un servicio sensible a la latencia que gastaba mucho tiempo en syscalls pequeñas. Tras las mitigaciones, el equipo vio un aumento medible en sys% y una regresión dolorosa en p99.
Alguien propuso un “win fácil”: fijar los hilos del servicio a CPUs específicas e aislar esas CPUs del housekeeping del kernel para “evitar vecinos ruidosos”.

Desplegaron pinning e aislamiento de CPU de forma amplia, asumiendo que reduciría el jitter.
Lo que ocurrió fue una clase magistral de consecuencias no intencionadas.
El manejo de IRQs y softirq se volvió irregular; algunos cores quedaron demasiado aislados para ayudar en picos, y otros cargaron una carga desproporcionada de interrupciones.
Los patrones de cambio de contexto cambiaron, y un puñado de cores empezó a calentarse mientras el resto parecía ocioso.

Bajo el capó, las mitigaciones no causaron el nuevo cuello de botella; la optimización sí.
Con PTI habilitado, el coste de cruzar al kernel ya era mayor. Concentrar ese trabajo en menos cores amplificó la sobrecarga.
El sistema no falló de forma abrupta; falló como colas de latencia, que son el tipo de fallo más caro porque parecen “quizá es la red”.

El rollback mejoró la latencia inmediatamente. El equipo reintrodujo pinning solo después de construir un plan adecuado de afinidad IRQ, validar RPS/XPS para colas de red y demostrar con contadores perf que el camino caliente se beneficiaba.

La lección: no uses aislamiento de CPU como parche para cambios sistémicos de sobrecarga. Es un bisturí. Si lo usas como martillo, te golpearás un dedo.

Mini-historia 3: La práctica aburrida pero correcta que salvó el día

Un equipo de plataforma cloud ejecutaba miles de hosts de virtualización. Tenían una práctica que nadie presumía porque es profundamente poco sexy: cada cambio de kernel/microcódigo pasaba por un anillo canario con carga sintética y un pequeño conjunto de tenants reales que optaban por actualizaciones tempranas.
El anillo canario también almacenaba huellas de rendimiento baseline: tasa de syscalls, tasa de VM exit, distribución de interrupciones y un puñado de benchmarks representativos.

Cuando empezaron a llegar mitigaciones, los canarios mostraron una firma clara de regresión en una clase de host: overhead de VM exit aumentado y pérdida de throughput medible en tenants intensivos en IO.
No fue catastrófico, pero sí consistente.
El equipo paró el despliegue, no porque la seguridad no importara, sino porque los rollouts a ciegas en virtualización convierten una “pequeña regresión” en un “incidente de capacidad en toda la flota.”

Trabajaron con baselines de kernel y firmware, ajustaron settings de host y secuenciaron actualizaciones: microcódigo primero en canarios, luego kernel, luego guests y después el resto de la flota.
También actualizaron su modelo de capacidad para que la “semana de parcheo de seguridad” tuviera un presupuesto.

Resultado: los clientes vieron una interrupción mínima y el equipo evitó la tragedia clásica de ops modernas—tener razón pero llegar tarde.
La práctica no fue ingeniosa. Fue disciplinada.

La lección: canarios más huellas de rendimiento convierten el caos en un cambio gestionado. Es aburrido. Mantenlo aburrido.

Errores comunes: síntomas → causa raíz → solución

1) Síntoma: sys% salta después de parchear, pero los dispositivos IO se ven bien

Causa raíz: PTI/KPTI aumentó el coste por syscall/interrupción; la carga es pesada en transiciones al kernel (red, gateways de almacenamiento, patrones DB fsync).

Solución: mide tasas de syscall/cambios de contexto (Tareas 9–11), ajusta batching (IOs más grandes, menos escrituras pequeñas), valida distribución de IRQ (Tarea 12) y planifica capacidad para más CPU por petición.

2) Síntoma: solo algunos nodos están más lentos; mismo “rol”, misma configuración

Causa raíz: modelos de CPU/microcódigo heterogéneos; las mitigaciones difieren por hardware.

Solución: inventaría estado de mitigación desde /sys/devices/system/cpu/vulnerabilities y revisiones de microcódigo (Tareas 2–3) en la flota; crea pools por clase de hardware.

3) Síntoma: hosts de virtualización regresan más que los guests

Causa raíz: sobrecarga compuesta en VM exits y transiciones de privilegio; mitigaciones de host y controles de microcódigo afectan a cada guest.

Solución: benchmarkea en hosts, no solo en guests; asegura alineación de microcódigo y kernel del host; revisa ajustes de host para IBRS/IBPB/STIBP; evita toggles ad-hoc sin canary.

4) Síntoma: reboots aleatorios o “cuelgues raros” tras updates de microcódigo

Causa raíz: inestabilidad de microcódigo/firmware en plataformas específicas; a veces disparada por ciertas funciones de gestión de energía o virtualización.

Solución: correlaciona crashes con cambios de revisión de microcódigo (Tarea 3); despliega en etapas; mantén ruta de rollback (microcódigo/BIOS anterior) probada; aísla clases de hardware afectadas.

5) Síntoma: alguien sugiere mitigations=off para “recuperar rendimiento”

Causa raíz: tratar un límite de seguridad como un knob de tuning; falta de modelo de amenaza y controles compensatorios.

Solución: requiere aceptación de riesgo por escrito; prefiere mitigaciones dirigidas y cambios en la carga; aisla cargas no confiables; actualiza hardware cuando sea necesario.

6) Síntoma: las pruebas de rendimiento no coinciden con producción después del parche

Causa raíz: el benchmark no reproduce patrones de syscall/interrupción, o corre en diferente estado de virtualización/NUMA/SMT.

Solución: benchmarkea el camino caliente (syscalls, red, almacenamiento) y empareja flags de arranque (Tarea 4). Reproduce con concurrencia representativa y tamaños de IO reales.

Broma #2: El predictor de ramas es genial adivinando tu código, pero pésimo adivinando tu ventana de cambios.

Listas de verificación / plan paso a paso

Checklist A: Antes de parchear (kernel + microcódigo)

  1. Inventario: recoge modelos de CPU, revisiones actuales de microcódigo y versiones de kernel por pool.
  2. Baseline: registra latencias p50/p95/p99, sys%, cambios de contexto, fallos de página, IO await y distribución de interrupciones.
  3. Modelo de amenaza: decide si ejecutas código no confiable en hosts compartidos; define política para SMT y para “mitigations=auto” vs flags más estrictos.
  4. Anillo canario: selecciona nodos que representen cada clase de hardware. Sin canario, no hay heroísmo después.
  5. Plan de rollback: verifica que puedes revertir kernel y microcódigo/firmware limpiamente. Pruébalo una vez cuando nadie esté mirando.

Checklist B: Durante el despliegue (cómo no engañarte)

  1. Parchea hosts canario; reinicia; confirma estado de mitigación (Tareas 2, 5, 8, 14).
  2. Confirma revisión de microcódigo y carga temprana (Tarea 3).
  3. Ejecuta pruebas smoke de la carga; compáralas con el baseline: tasa de syscalls (Tarea 9), procesos culpables (Tarea 10), contadores perf (Tarea 11), latencia IO (Tarea 15).
  4. Despliega por clase de hardware; no mezcles y esperes lo mejor.
  5. Vigila señales de saturación: margen de CPU, cola de ejecución, latencia tail, reintentos de errores.

Checklist C: Después del despliegue (asegúralo)

  1. Consistencia de flota: alerta si los archivos de vulnerabilidad difieren entre nodos en el mismo pool.
  2. Actualiza el modelo de capacidad: ajusta CPU por petición/IO según la sobrecarga medida; no te fíes de “pareció bien”.
  3. Runbook: documenta flags de mitigación, por qué SMT está on/off y cómo validar el estado rápidamente (Tareas 2 y 4 son tus amigas).
  4. Guardia de regresiones de rendimiento: añade un benchmark periódico que ejecute syscalls y caminos de IO, no solo bucles de cómputo.

FAQ

1) ¿Spectre y Meltdown son “solo problemas de Intel”?

No. Meltdown en su forma clásica afectó con especial intensidad a muchas CPUs Intel, pero las cuestiones clase Spectre son más amplias y relacionan la especulación en general.
Trátalo como una lección de la industria: los trucos de rendimiento pueden convertirse en pasivos de seguridad.

2) ¿Por qué mi carga intensiva en IO se ralentizó más que mi carga de cómputo?

Intensiva en IO suele significar “pesada en kernel”: más syscalls, interrupciones, cambios de contexto y actividad de tablas de páginas.
PTI/KPTI aumenta el coste de esas transiciones. Los bucles de cómputo que permanecen en espacio usuario tienden a notar menos.

3) ¿Es seguro desactivar mitigaciones por rendimiento?

Seguro es una pregunta de política, no una flag del kernel. Si ejecutas código no confiable, cargas multi-tenant, runners de CI compartidos o cargas tipo navegador, desactivar mitigaciones es pedir problemas.
Si realmente ejecutas un entorno single-tenant y controlado, aún necesitas una aceptación de riesgo por escrito y controles compensatorios.

4) ¿Cuál es la diferencia entre “compilado con retpoline” y “ejecutándose con retpoline”?

Compilado significa que el kernel tiene la capacidad. Ejecutándose significa que el kernel eligió esa mitigación al arrancar dadas las características de CPU, microcódigo y parámetros de arranque.
Comprueba dmesg y /sys/devices/system/cpu/vulnerabilities para confirmar estado en runtime (Tareas 2, 8, 14).

5) ¿Los contenedores cambian algo?

Los contenedores comparten un kernel, así que el estado de mitigación del host aplica directamente.
Si hospedas contenedores no confiables, debes asumir que necesitas el conjunto más fuerte de mitigaciones y tratar el host como una máquina de frontera multi-tenant.

6) ¿Por qué importan las actualizaciones de microcódigo si actualicé el kernel?

Algunas mitigaciones dependen de características de CPU que se exponen o corrigen vía microcódigo.
Un kernel parcheado sin microcódigo apropiado puede dejarte parcialmente mitigado—o mitigado vía rutas de fallback más lentas.

7) ¿Por qué cambió el rendimiento aun cuando el estado de mitigación dice “Mitigated” antes y después?

“Mitigated” no significa “mitigado de la misma manera.” El kernel puede cambiar entre retpoline e IBRS, o cambiar cuándo vacía predictores, según microcódigo y defaults.
Compara líneas de mitigación en dmesg y revisiones de microcódigo, no solo la palabra “Mitigated.”

8) ¿Cuál es el archivo más útil para comprobar en Linux?

/sys/devices/system/cpu/vulnerabilities/*. Es conciso, operativo y se puede scriptar.
También reduce argumentos en postmortems, que es una forma de fiabilidad.

9) ¿Debo desactivar SMT/Hyper-Threading?

Solo si tu modelo de amenaza lo exige o tu política de cumplimiento lo manda.
Desactivar SMT reduce throughput y puede cambiar el comportamiento de latencia de maneras no triviales. Si lo haces, trátalo como un cambio de capacidad y pruébalo bajo carga.

10) ¿Cómo explico el impacto a stakeholders no técnicos?

Di: “Estamos intercambiando una pequeña cantidad de rendimiento para evitar que datos se filtren a través de límites que la CPU antes optimizaba.”
Luego muestra el impacto medido desde canarios y el plan de capacidad. Evita explicaciones vagas; invitan a pánico presupuestario.

Siguientes pasos que realmente puedes hacer

Spectre/Meltdown enseñaron a la industria una verdad molesta: la computadora más rápida es a menudo la menos predecible.
Tu trabajo no es temer a las mitigaciones. Tu trabajo es hacerlas aburridas.

  1. Haz observable el estado de mitigación: exporta el contenido de /sys/devices/system/cpu/vulnerabilities/* a tus métricas y alerta sobre desviaciones.
  2. Inventaría microcódigo como inventarías kernels: rastrea revisiones, etapiza actualizaciones y correlaciónalas con regresiones.
  3. Construye un baseline de syscalls/interrupciones: almacena snapshots de vmstat/pidstat/perf-stat por rol para detectar “inflación de cruces al kernel” rápidamente.
  4. Separa flotas por clase de hardware: no dejes que CPUs heterogéneas se hagan pasar por capacidad idéntica.
  5. Resiste la tentación de flags globales de desactivación: si el rendimiento es inaceptable, arregla el camino caliente (batching, menos syscalls, higiene de IRQ) o actualiza hardware—no desees que el modelo de amenaza desaparezca.

Las CPUs se convirtieron en la noticia de seguridad del año porque les pedimos que fueran ingeniosas sin pedirles que fueran cuidadosas.
Ahora ejecutamos sistemas en producción en un mundo donde “cuidadoso” tiene un coste medible.
Págalo deliberadamente, mídelo sin piedad y mantén tus mitigaciones tan aburridas como tus backups.

]]>
https://cr0x.net/es/spectre-meltdown-cpus-noticia-seguridad/feed/ 0