Conceptos

Ley de Amdahl: fórmula, ejemplos y límites

7 min de lectura

La ley de Amdahl (Amdahl’s law) dice que la aceleración que se obtiene al ejecutar un trabajo en paralelo está limitada por la parte que no puede ejecutarse en paralelo. Si una fracción p del trabajo se reparte entre n procesadores, servidores o hilos, la aceleración es S = 1 / ((1 − p) + p/n), y por mucho que crezca n nunca supera 1 / (1 − p). Con un 95 % de trabajo paralelo, el techo es de 20 veces, incluso con mil máquinas.

Las cifras de abajo son aritmética, sin ninguna prueba ejecutada detrás. Los artículos citados se comprobaron el 1 de noviembre de 2026.

Fracción paralela pn = 2n = 8n = 64n → ∞
0,501,331,781,972
0,901,824,718,7710
0,951,905,9315,4220
0,991,987,4839,26100

¿Qué dice la ley en palabras sencillas?

Un trabajo no puede terminar más rápido que su parte secuencial, así que los workers adicionales solo acortan el resto. Cuando la parte paralela ya es pequeña frente a la secuencial, añadir workers apenas cambia el tiempo total.

Toma un trabajo de 10 segundos en el que 1 segundo es secuencial (un bloqueo, una escritura única) y 9 segundos se reparten por igual, es decir, p = 0,9. Ocho workers lo terminan en 1 + 9/8 = 2,125 segundos (4,71 veces más rápido); sesenta y cuatro necesitan unos 1,14 segundos. Nada lo baja de 1 segundo, así que 10 es el techo.

¿De dónde viene la ley?

Gene Amdahl presentó el argumento en 1967, en la AFIPS Spring Joint Computer Conference, en un artículo que defendía el enfoque de un solo procesador.

No hemos leído el texto completo de Validity of the single processor approach to achieving large scale computing capabilities. Mark Hill y Michael Marty lo resumen en Amdahl’s Law in the Multicore Era (IEEE Computer, 2008): una fracción paralelizable sin límite y sin coste de planificación, el resto totalmente secuencial, y la aceleración descrita sin presentar ninguna ecuación («without presenting an equation»).

¿Qué significa para las pruebas de carga y de capacidad?

El rendimiento deja de crecer al ritmo de los servidores, hilos o pods en cuanto un componente compartido atiende una parte de cada petición de una en una. Una prueba de carga lo muestra como una curva de rendimiento que se aplana mientras sigues añadiendo capacidad.

El artículo de Neil Gunther de 2008, citado más abajo, escribe la misma ley como N / (1 + σ(N − 1)), con σ como fracción secuencial, y mide la escalabilidad como el rendimiento con N dividido entre el rendimiento con 1. En un sistema web, la parte secuencial es todo aquello por lo que cada petición tiene que pasar por turno: un bloqueo o una fila que actualiza cada petición, una única base de datos primaria que recibe todas las escrituras, un único consumidor de cola o una API de terceros con límite de peticiones.

¿Cómo encuentras la parte secuencial en una prueba de carga?

Ejecuta la misma prueba en varios niveles de carga y observa qué recurso se satura mientras el rendimiento se aplana. El componente que está en su límite cuando la capacidad extra deja de compensar es la parte secuencial, o la cola que tiene delante.

Señales típicas: el rendimiento se estanca aunque la capa de aplicación tiene CPU libre, las esperas crecen en un único punto compartido (bloqueos, conexiones a la base de datos, profundidad de la cola), y el tiempo de respuesta sube al mismo ritmo que los usuarios, que es la ley de Little ante un techo. Una ejecución con carga constante no puede mostrarlo, así que sube la carga por escalones. El ajuste Ramp Up Steps de LoadFocus añade usuarios virtuales en lotes iguales. El panel de capacidad de LoadFocus agrupa una ejecución terminada por usuarios virtuales activos y, en los planes de pago, muestra el p95, las peticiones por segundo y la tasa de error de cada escalón en las ejecuciones con un solo generador de carga. Solo indica un nivel de capacidad si la ejecución pasó por al menos tres escalones y el más alto fue al menos el doble del más bajo. No ajusta ningún modelo de escalabilidad, así que el ajuste de más abajo te toca a ti.

¿Qué es la ley de Gustafson?

Es el contrapunto: si el problema crece con la máquina, la parte secuencial sigue siendo pequeña y la aceleración crece casi de forma lineal. Amdahl fija el trabajo; Gustafson fija el tiempo de ejecución.

La nota de John Gustafson de 1988, Reevaluating Amdahl’s law, informó aceleraciones de 1016 a 1021 en un hipercubo de 1024 procesadores en Sandia, para aplicaciones con una parte secuencial del 0,4 al 0,8 %, y defendió que los usuarios agrandan el problema hasta llenar el tiempo del que disponen. Con s’ como la parte secuencial medida en la ejecución paralela, la aceleración escalada, una fórmula que la nota atribuye a E. Barsis en Sandia, es N + (1 − N)s’.

Con s’ = 0,05 y 64 procesadores eso da 60,85, frente a 15,42 según Amdahl, porque los dos valores del 5 % se miden en máquinas distintas. En un sistema web, Gustafson encaja cuando cada servidor añadido trabaja con su propia parte de los datos; Amdahl encaja cuando cada usuario adicional sigue tocando la misma fila compartida.

¿Qué añade la Universal Scalability Law?

Un segundo término de coherencia, el coste de mantener coherentes los datos compartidos entre workers, que crece con el número de pares de workers. Con él, el rendimiento puede llegar a un máximo y luego caer a medida que añades capacidad.

El artículo de Gunther A General Theory of Computational Scalability Based on Rational Functions (arXiv, 2008) formula la Universal Scalability Law (USL) así:

C(N) = N / (1 + σ(N - 1) + κN(N - 1))
peak at N* = sqrt((1 - σ) / κ)

σ es la contención (serialización o colas) y κ la coherencia (copias incoherentes de los datos); con κ = 0 queda la fórmula de Amdahl. Entre los ejemplos de Gunther para el peor caso está la actualización de registros de bases de datos, y llama «retrograde», es decir, decreciente, al rendimiento más allá de N*. Con los valores de ejemplo σ = 0,05 y κ = 0,001, el máximo está cerca de 31 workers: el rendimiento relativo es 9,03 con 32 y 7,82 con 64, donde el término σ por sí solo predice 15,42.

¿Cómo ajustas la USL a una serie de pruebas de carga?

Mide el rendimiento en varios niveles de concurrencia, divide cada valor entre el rendimiento con un usuario y ajusta σ y κ por mínimos cuadrados.

Reordenada, la fórmula queda N / C − 1 = σ(N − 1) + κN(N − 1), que es lineal en σ y κ. Los valores de abajo se generaron a partir de σ = 0,05 y κ = 0,001; pon en x tus propias peticiones por segundo de cada escalón:

import numpy as np

n = np.array([1, 2, 4, 8, 16, 32])          # virtual users
x = np.array([50, 95, 172, 284, 402, 452])  # req/s per level
c = x / x[0]                                # relative capacity
A = np.column_stack([n - 1, n * (n - 1)])
(s, k), *_ = np.linalg.lstsq(A, n / c - 1, rcond=None)
print(f"sigma={s:.3f} kappa={k:.4f}")
print(f"peak near {np.sqrt((1 - s) / k):.0f} users")

El script imprime sigma=0.050, kappa=0.0010 y un máximo cerca de 31 usuarios. Cambia solo la concurrencia entre escalones e incluye un escalón con un usuario, porque cada punto se divide entre él.

¿Dónde dejan de ser útiles estos modelos?

Resumen una curva de rendimiento en una o dos constantes, así que no pueden señalar el bloqueo culpable ni seguir a un sistema que cambia bajo carga. Úsalos para leer una curva medida y prolongarla un poco: un ajuste con escalones muy por debajo del codo dice poco del máximo.

  • Parámetros constantes. Una caché que se calienta, un autoscaler o un pool que llega a su límite cambian σ y κ en mitad de la prueba.
  • Solo rendimiento. El p95 y el p99 pueden degradarse antes: revisa también la latencia de cola.
  • El generador de carga. Si se satura primero, la curva plana es suya.
  • Pruebas cerradas. Un número fijo de usuarios virtuales mide un sistema cerrado; los usuarios reales llegan a su propio ritmo.

FAQ

¿Puedes explicar la ley de Amdahl de forma sencilla? Un trabajo nunca es más rápido que la parte que no se puede repartir. Si una décima parte del trabajo tiene que ejecutarse en serie, ningún número de workers adicionales lo hace más de diez veces más rápido, porque esa décima parte sigue tardando lo mismo.

¿Qué es la ley de Gustafson? La ley de Gustafson dice que, cuando el problema crece con el número de procesadores, la aceleración crece casi de forma lineal, como N + (1 − N)s’, donde s’ es la parte secuencial de la ejecución paralela. John Gustafson la publicó en 1988 (atribuyendo la fórmula a su colega de Sandia E. Barsis) como contrapunto a la suposición de Amdahl de un problema de tamaño fijo.

Lecturas relacionadas


Las afirmaciones técnicas de este artículo no se han revisado de forma independiente.

LoadFocus team
Escrito por el equipo de LoadFocus, las personas detrás de un servicio de pruebas de carga en la nube.