Be Software Architecture Wise
Be Wise Apps

Read in English · Lire en français · Auf Deutsch lesen

Sección 2.4 de 2.8 · Intermedio · 24 min de lectura

Rendimiento y escalabilidad: latencia, rendimiento (throughput), percentiles y carga

Videolección

5 min · narrado en inglés, con subtítulos
Solo escuchar (audio)
Leer la transcripción

El rendimiento es la cualidad que la gente menciona primero y especifica peor. En esta lección aprenderás el puñado de ideas y fórmulas que usan los profesionales para hacerlo bien.

Imagina un supermercado. El tiempo que pasas en la caja es la latencia: cuánto tarda una unidad de trabajo. Cuántos compradores atienden las cajas en una hora es el throughput: cuánto trabajo se hace por unidad de tiempo. Un buen requisito indica ambos, junto con la carga a la que se aplican. Tu tiempo en la caja es en parte el escaneo, el trabajo en sí, y en parte la cola que tienes delante. Cuando las cajas están ocupadas solo la mitad del tiempo, apenas haces cola. Cuando están ocupadas casi siempre, las colas crecen muchísimo y muy deprisa, aunque cada escaneo tarde lo mismo.

El software funciona igual. El tiempo de respuesta que ve un cliente es todo lo que ocurre entre enviar una solicitud y recibir la respuesta. Una parte es la espera en una cola, porque el worker está ocupado con la solicitud de otro. Otra parte es el tiempo de servicio: el trabajo en sí. El tiempo de red se suma en ambos sentidos. Las dos partes necesitan remedios distintos. Una consulta más rápida reduce el tiempo de servicio. Solo más capacidad o menos carga reducen el tiempo de espera, y con carga, la espera suele ser lo que más pesa. Una consulta puede tardar cinco milisegundos, pero esperar trescientos a que quede libre una conexión.

Veamos por qué las medias engañan. Un servicio de búsqueda registra mil tiempos de respuesta. Novecientos tardan ochenta milisegundos, ochenta tardan ciento cincuenta, quince tardan mil doscientos y cinco tardan cuatro mil. La media es de ciento veintidós milisegundos, lo que parece correcto. Los profesionales usan percentiles en su lugar. El percentil cincuenta, o mediana, es el valor que supera en rapidez la mitad de las solicitudes. Aquí son ochenta milisegundos. El percentil noventa y cinco, p noventa y cinco, es el valor que supera el noventa y cinco por ciento de las solicitudes: ciento cincuenta milisegundos. Pero p noventa y nueve es de mil doscientos milisegundos. Y p noventa y nueve punto nueve es de cuatro mil milisegundos. Así que el dos por ciento de los usuarios espera más de un segundo. Con trescientas búsquedas por segundo, son seis personas cada segundo. Un requisito escrito como una media daría por bueno este sistema. Uno escrito en percentiles lo suspende, con razón.

El extremo lento de la distribución se llama cola. Un usuario que carga cuarenta recursos para ver una página espera al más lento de esos cuarenta, no a la media. Así que un evento raro del uno por ciento afecta a cerca de un tercio de las visualizaciones de página. En los sistemas grandes, una solicitud puede repartirse en abanico entre cien servidores y esperar a todos ellos. Si cada uno es lento una vez de cada cien, la solicitud del usuario es lenta cerca del sesenta y tres por ciento de las veces.

La ley de Little es la fórmula individual más útil en la planificación de capacidad. El número de solicitudes en curso es igual a la tasa de llegada multiplicada por el tiempo que cada una pasa dentro. Usémosla. El servicio de viajes de una app de transporte con conductor atiende mil ochocientas solicitudes por segundo en el pico de la tarde. Cada solicitud mantiene ocupada una conexión a la base de datos durante cuarenta milisegundos. Así que, en promedio, mil ochocientos por cero punto cero cuatro, es decir, setenta y dos conexiones, están ocupadas a la vez. Pero seis instancias con diez conexiones cada una solo dan sesenta. Las solicitudes harán cola para obtener conexiones, y los tiempos de respuesta subirán hasta que empiecen los timeouts. Para mantener el grupo ocupado como máximo en torno al setenta por ciento, necesitas setenta y dos dividido entre cero punto siete, unas ciento tres conexiones, o unas dieciocho por instancia.

¿Por qué mantener ese margen? Esta curva muestra una cola con un solo servidor y un tiempo de servicio de veinte milisegundos. Hasta el cincuenta por ciento de ocupación, el tiempo de respuesta medio es de solo cuarenta milisegundos. Con un ochenta por ciento de ocupación, es de cien milisegundos. Con un noventa por ciento, se duplica hasta doscientos. A partir de ahí, sube casi en vertical. Plana, luego un codo y luego un abismo. Así que nunca planifiques ejecutar recursos críticos cerca de su capacidad máxima.

La escalabilidad es la capacidad de manejar más carga añadiendo recursos. El escalado vertical da más potencia a una máquina. Es sencillo, pero choca con límites estrictos y precios crecientes. El escalado horizontal añade más máquinas. No hay un techo fijo, pero el software debe estar diseñado para ello. Y el paralelismo tiene límites. La ley de Amdahl dice que, si el diez por ciento del trabajo debe hacerse paso a paso, ningún número de procesadores puede hacer el trabajo más de diez veces más rápido. Peor aún, mantener los datos consistentes entre nodos tiene un costo que crece rápidamente, así que, a partir de cierto punto, añadir nodos en realidad reduce la capacidad. Busca las partes serie ocultas, como un único bloqueo o un coordinador central.

La sección completa desarrolla la ley de Amdahl y la Ley de escalabilidad universal, y enumera las principales tácticas de rendimiento. A continuación, en la Sección dos punto cinco, veremos la disponibilidad y la fiabilidad. Nos vemos allí.

Lo que necesitas saber

Dos preguntas distintas: qué tan rápido y cuánto

El rendimiento es la cualidad que la gente menciona primero y especifica peor. Abarca dos preguntas distintas. La latencia pregunta cuánto tarda una unidad de trabajo: cuántos milisegundos pasan entre tocar 'Pagar' y ver 'Pago aceptado'. El rendimiento (throughput) pregunta cuánto trabajo completa el sistema por unidad de tiempo: 1200 pagos por segundo, 40 000 pedidos por hora. Ambos están relacionados, pero no son intercambiables. Un autobús que lleva a 50 personas de Londres a Oxford en 100 minutos tiene peor latencia y un throughput mucho mejor que un deportivo que lleva a dos personas en 60 minutos.

En el software, la misma tensión aparece en todas partes. Agrupar las escrituras en la base de datos mejora el throughput, pero hace que cada escritura individual espere a su lote. Añadir una caché mejora ambos para las lecturas repetidas, pero no hace nada por la primera. Por eso un buen requisito de rendimiento dice a qué pregunta se refiere y, normalmente, indica ambas cosas: 'con 1200 pagos por segundo (throughput), el 99% se completa en menos de 800 ms (latencia)'. ISO/IEC 25010 las clasifica dentro de la eficiencia de rendimiento como comportamiento temporal, utilización de recursos y capacidad (Sección 2.2).

Tiempo de respuesta = tiempo de servicio + tiempo de espera

Cuando mides la latencia desde el lado del cliente obtienes el tiempo de respuesta: todo lo que ocurrió entre el envío de la solicitud y la recepción de la respuesta. Conviene dividirlo en partes. El tiempo de servicio es el tiempo que un recurso dedica realmente a trabajar en tu solicitud: analizarla, ejecutar la consulta, generar el resultado. El tiempo de espera es el tiempo que tu solicitud pasa en una cola porque el recurso está ocupado con la de otro. A esto se suma el tiempo de transferencia por la red, en ambos sentidos.

La distinción importa porque las dos partes responden a remedios distintos. El tiempo de servicio baja cuando abaratas el propio trabajo: un índice mejor, una carga útil más pequeña, un algoritmo más rápido. El tiempo de espera baja cuando añades capacidad o reduces la carga, y a menudo es mucho mayor que el tiempo de servicio cuando un sistema está ocupado. Muchas investigaciones de 'base de datos lenta' terminan con el descubrimiento de que cada consulta tarda 5 ms, pero espera 300 ms a que quede libre una conexión del grupo (pool).

Adónde va el tiempo

El tiempo de respuesta que ve un cliente es el tiempo de red más la espera en la cola más el tiempo de servicio, más el tiempo de red de vueltaClientesolicitudservidorcolaWorker ocupadorespuestaredt. de esperat. de servicioredTiempo de respuesta = red + espera + servicio + red
El tiempo de respuesta que ve un cliente incluye la transferencia por la red, la espera en una cola hasta que un worker ocupado queda libre y el propio tiempo de servicio.

Percentiles: por qué las medias engañan

Los tiempos de respuesta nunca son un único número; forman una distribución, y casi siempre es asimétrica. La mayoría de las solicitudes son rápidas, y una minoría son lentas porque se topan con una caché fría, una pausa de recolección de basura, un bloqueo, un reintento o un vecino sobrecargado. La media aritmética mezcla los dos grupos en una cifra que no describe a nadie. Los profesionales usan percentiles en su lugar. El percentil 50 (p50, la mediana) es el valor que supera en rapidez la mitad de las solicitudes; p95 es el valor que supera el 95% de las solicitudes; p99 y p99.9 describen el 1% y el 0.1% más lentos.

El extremo lento de la distribución se llama cola (tail), e importa más de lo que parece. Los usuarios de la cola suelen ser tus mejores clientes: los de carritos más grandes, historiales más largos y más datos. Un usuario que carga 40 recursos para ver una página experimenta el más lento de esos 40, no la media. Y la probabilidad de que una página de 40 recursos se tope con al menos una solicitud de p99 es 1 − 0.9940 ≈ 33%: un evento 'raro' del 1% afecta a un tercio de las visualizaciones de página.

Ejemplo práctico

Ejemplo práctico: la media que oculta el problema

Una API de búsqueda de productos registra 1000 tiempos de respuesta en un minuto: 900 de 80 ms, 80 de 150 ms, 15 de 1200 ms (una caché fría) y 5 de 4000 ms (un timeout y un reintento).

Suma de todos los tiempos900 × 80 + 80 × 150 + 15 × 1200 + 5 × 4000 = 72 000 + 12 000 + 18 000 + 20 000 = 122 000 ms
Media122 000 ÷ 1000 = 122 ms. Parece saludable frente a un objetivo de 200 ms.
p50 (mediana)La solicitud número 500 más rápida: 80 ms
p95La solicitud número 950 más rápida cae dentro del grupo de 150 ms (solicitudes 901 a 980): 150 ms
p99La número 990 cae dentro del grupo de 1200 ms (solicitudes 981 a 995): 1200 ms
p99.9La número 999 está en el grupo de 4000 ms (996 a 1000): 4000 ms
A quién afecta20 solicitudes de cada 1000 (el 2%) tardaron más de un segundo. Con 300 búsquedas por segundo, eso son 6 usuarios cada segundo, o unos 21 600 por hora.

La media de 122 ms cumple un objetivo de 200 ms mientras el 2% de los usuarios espera más de un segundo. Un escenario escrito como 'media por debajo de 200 ms' daría por bueno este sistema.

Escribir el requisito como 'p95 ≤ 200 ms y p99 ≤ 500 ms' lo suspende, con razón, y dirige al equipo hacia las rutas de caché fría y de reintento.

Los percentiles no se pueden promediar. El p99 de diez servidores no es la media de sus diez valores p99; debe calcularse a partir de los datos combinados, o aproximarse a partir de histogramas fusionados.

# Why the mean misleads: 1,000 response times from one minute of traffic
import statistics

times_ms = [80] * 900 + [150] * 80 + [1200] * 15 + [4000] * 5

mean = statistics.mean(times_ms)
cuts = statistics.quantiles(times_ms, n=1000, method="inclusive")
p50, p95, p99, p999 = cuts[499], cuts[949], cuts[989], cuts[998]
print(f"mean {mean:.0f} ms, p50 {p50:.0f}, p95 {p95:.0f}, p99 {p99:.0f}, p99.9 {p999:.0f}")
# mean 122 ms, p50 80, p95 150, p99 1200, p99.9 4000
El mismo cálculo en unas pocas líneas de Python; la media parece correcta, mientras que p99 y p99.9 revelan el problema.

La latencia de cola a gran escala

La cola pasa a ser lo principal en los sistemas grandes que usan fan-out (abanico), en los que una solicitud de usuario se divide en muchas solicitudes paralelas a otros servidores y la respuesta debe esperar a todas ellas. Un buscador, un feed social o una página de recomendaciones pueden consultar decenas o cientos de shards de backend en cada consulta. Jeffrey Dean y Luiz André Barroso, de Google, lo analizaron en The Tail at Scale (Communications of the ACM, 2013).

Su ilustración es sencilla. Supón que cada servidor responde normalmente en 10 ms, pero tarda 1 segundo en una de cada 100 solicitudes. Una solicitud de usuario que espera a un solo servidor es lenta el 1% de las veces. Una solicitud de usuario que espera a 100 servidores así es lenta siempre que cualquiera de ellos lo sea: 1 − 0.99100 ≈ 63% de las veces. Un evento raro en un servidor se convierte en el caso habitual para el usuario. Dean y Barroso aportan mediciones de un servicio de Google en el que la latencia del percentil 99 para una única solicitud hoja era de 10 ms, pero el percentil 99 de la espera de todas las solicitudes hoja era de 140 ms.

Como no se puede eliminar toda fuente de variabilidad (hardware compartido, trabajos en segundo plano, recolección de basura, colas de red), defienden diseños tolerantes a la cola, igual que los diseños tolerantes a fallos aceptan que el hardware falla. Sus técnicas incluyen las solicitudes de cobertura (hedged requests: enviar una segunda copia a otra réplica si la primera no ha respondido en, por ejemplo, el tiempo del percentil 95, y usar la que vuelva primero), las solicitudes vinculadas que se cancelan entre sí, particiones más finas que se pueden reequilibrar, excluir temporalmente las máquinas lentas y devolver un resultado suficientemente bueno cuando han respondido la mayoría de los shards, pero no todos. En una prueba de rendimiento que describen, enviar la solicitud de cobertura a los 10 ms redujo la latencia del percentil 99.9 de 1800 ms a 74 ms enviando solo alrededor de un 2% más de solicitudes.

La ley de Little: cuántas solicitudes hay en curso

La ley de Little, demostrada por John Little en 1961, es la fórmula individual más útil en la planificación de capacidad. Para cualquier sistema estable, el número medio de elementos dentro de él (L) es igual a la tasa media de llegada (λ, lambda) multiplicada por el tiempo medio que cada elemento pasa dentro (W): L = λ × W. Se cumple sea cual sea el patrón de llegada o el orden de servicio, siempre que el sistema sea estable (en promedio, salen tantos elementos como llegan) y uses unidades coherentes.

En el software, L es el número de solicitudes en curso a la vez (la concurrencia), λ es la tasa de solicitudes y W es el tiempo de respuesta. Si un servicio recibe 200 solicitudes por segundo y cada una pasa 0.25 segundos dentro, entonces en promedio hay 200 × 0.25 = 50 solicitudes en curso en cualquier momento. Ese número determina los grupos de hilos, los grupos de conexiones, la memoria y el número de licencias. La ley también funciona a la inversa: si puedes atender como máximo 50 solicitudes a la vez y cada una tarda 0.25 s, no puedes sostener más de 50 ÷ 0.25 = 200 solicitudes por segundo.

Ejemplo práctico

Ejemplo práctico: dimensionar un grupo de conexiones a la base de datos con la ley de Little

El servicio de viajes de una app de transporte con conductor atiende 1800 solicitudes por segundo en el pico de la tarde. Cada solicitud hace llamadas a la base de datos que mantienen ocupada una conexión durante 40 ms en total. Cada una de las 6 instancias del servicio tiene un grupo de 10 conexiones. ¿Es suficiente?

Tasa de llegada λ1800 solicitudes por segundo
Tiempo que se retiene una conexión W40 ms = 0.040 s
Conexiones en uso L = λ × W1800 × 0.040 = 72 conexiones ocupadas en promedio
Conexiones disponibles6 instancias × 10 = 60
Veredicto72 > 60. Las solicitudes harán cola para obtener conexiones, el tiempo de espera crecerá sin límite en el pico y los tiempos de respuesta subirán hasta que empiecen los timeouts.
Objetivo con margenProcura mantener el grupo como máximo a un 70% de utilización: 72 ÷ 0.7 ≈ 103 conexiones, es decir, unas 18 por instancia
Comprueba la base de datosEl servidor de base de datos también debe poder aceptar 103 conexiones; si no, reduce W (consultas más rápidas, menos viajes de ida y vuelta) o el número de llamadas a la base de datos por solicitud
¿Y si las consultas se vuelven más rápidas?Reducir W a 25 ms da L = 1800 × 0.025 = 45 conexiones, que caben en las 60 existentes con un 75% de utilización

La ley de Little convierte un objetivo de throughput y una latencia en una cifra de concurrencia que se puede comparar directamente con un límite configurado.

Da promedios. Las ráfagas elevan el número instantáneo, y por eso el ejemplo añade margen en lugar de dimensionar exactamente para 72.

Utilización y colas: por qué los sistemas caen al abismo

La utilización (ρ, rho) es la fracción del tiempo en que un recurso está ocupado. Un servidor que recibe 40 solicitudes por segundo, cada una de las cuales necesita 20 ms de servicio, está ocupado 40 × 0.020 = 0.8 del tiempo: un 80% de utilización. La intuición sugiere que un recurso ocupado al 80% solo debería ser un poco más lento que uno ocupado al 50%. La teoría de colas dice lo contrario, porque las solicitudes no llegan de forma uniforme; se agrupan, y cuando se agrupan, las últimas esperan.

El modelo más sencillo es la cola M/M/1: llegadas aleatorias, tiempos de servicio aleatorios y un único servidor. Su tiempo de respuesta medio es W = S ÷ (1 − ρ), donde S es el tiempo de servicio medio. Con un 50% de utilización, W = 2S. Con un 80%, W = 5S. Con un 90%, W = 10S. Con un 99%, W = 100S. El denominador se acerca a cero a medida que la utilización se aproxima al 100%, así que el tiempo de respuesta crece sin límite. Los sistemas reales no son exactamente M/M/1, y los grupos con varios servidores se comportan mejor con la misma utilización, pero la forma es universal: plana, luego un codo y luego un abismo.

Cola M/M/1: tiempo de respuesta medio para un tiempo de servicio de 20 ms

Utilización ρW = S ÷ (1 − ρ)Tiempo de respuesta medioDe ello, espera
50%20 ÷ 0.540 ms20 ms
70%20 ÷ 0.367 ms47 ms
80%20 ÷ 0.2100 ms80 ms
90%20 ÷ 0.1200 ms180 ms
95%20 ÷ 0.05400 ms380 ms
99%20 ÷ 0.012000 ms1980 ms

El abismo de la utilización

Tiempo de respuesta medio según la utilización en una cola con servicio de 20 milisegundos: plano al principio y luego en fuerte subida por encima de un 80 por ciento80%: 100 ms90%: 200 ms50%: 40 ms0%50%100%Utilización ρ20200400T. de respuesta medio W (ms), t. de servicio S = 20 ms
En una cola con un solo servidor, el tiempo de respuesta medio se duplica entre el 80% y el 90% de utilización y sigue subiendo con fuerza hacia el 100%.

Las lecciones prácticas son directas. No planifiques ejecutar recursos críticos cerca del 100% de ocupación; deja margen para que las ráfagas no te empujen más allá del codo. Vigila la utilización y la longitud de la cola a la vez (el método USE de Brendan Gregg comprueba la utilización, la saturación y los errores de cada recurso). Y recuerda que el abismo hace peligrosos los cambios pequeños: con un 90% de utilización, un aumento del tráfico de solo un 6% aproximadamente te lleva al 95% y duplica el tiempo de respuesta medio. El Capítulo 9 trata las colas, el back pressure y la planificación de capacidad en Asincronía, colas y back pressure.

Escalabilidad: carga, elasticidad, escalado vertical y horizontal

La escalabilidad es la capacidad de manejar más carga añadiendo recursos, idealmente con una capacidad que crezca en proporción y sin rediseñar. Solo significa algo cuando dices qué es la 'carga'. Los parámetros de carga difieren entre sistemas: solicitudes por segundo para una API, conexiones simultáneas para un servicio de chat, la proporción entre lecturas y escrituras para una red social, el volumen de datos para una plataforma de analítica o el número de seguidores de la cuenta más seguida para un feed. Un escenario de escalabilidad nombra el parámetro de carga, el crecimiento y la respuesta que debe mantenerse: 'cuando los pedidos diarios crecen de 50 000 a 500 000, la latencia p95 del proceso de pago se mantiene por debajo de 1.5 s añadiendo instancias, con un costo por pedido no más de un 20% mayor'.

La elasticidad añade el factor tiempo: la capacidad de añadir y quitar capacidad automáticamente a medida que la carga sube y baja, de modo que un sitio de venta de entradas pueda crecer para una venta y reducirse después. Es una parte importante del argumento económico a favor de las plataformas en la nube. Hay dos formas básicas de añadir capacidad. El escalado vertical (scaling up) da a una máquina más CPU, más memoria o un almacenamiento más rápido; es sencillo, no requiere cambios en el software y choca con límites estrictos y precios crecientes. El escalado horizontal (scaling out) añade más máquinas y reparte el trabajo; no tiene un techo fijo, pero exige que el software esté diseñado para ello, con instancias sin estado, balanceo de carga y datos particionados. El Capítulo 9 trata las estrategias en detalle en Estrategias de escalado: vertical, horizontal y el cubo de escalado.

La ley de Amdahl: el límite del paralelismo

Añadir procesadores o nodos solo ayuda con el trabajo que se puede hacer en paralelo. La ley de Amdahl, del artículo de Gene Amdahl de 1967 sobre los límites de la computación paralela, recoge esta idea. Si una fracción s del trabajo es serie (debe hacerse paso a paso) y el resto, 1 − s, se puede repartir perfectamente entre N procesadores, la mejor aceleración posible es aceleración(N) = 1 ÷ (s + (1 − s) ÷ N). A medida que N crece sin límite, la aceleración se aproxima a 1 ÷ s. Con un 10% de trabajo serie, ningún número de procesadores puede hacer el trabajo más de diez veces más rápido.

Ejemplo práctico

Ejemplo práctico: un proceso de facturación nocturno

La facturación nocturna de una empresa de telecomunicaciones tarda 8 horas en un servidor. El perfilado muestra que el 10% del tiempo es serie (cargar las tarifas y después escribir un único archivo de resumen); el otro 90% tarifica las llamadas de forma independiente por cliente. La ejecución debe terminar en menos de 1.5 horas. ¿Cuántos servidores se necesitan?

Fracción serie s0.10; fracción paralela 0.90
Aceleración necesaria8 h ÷ 1.5 h ≈ 5.33
N = 41 ÷ (0.10 + 0.90 ÷ 4) = 1 ÷ 0.325 ≈ 3.08; tiempo de ejecución 8 ÷ 3.08 ≈ 2.6 h
N = 81 ÷ (0.10 + 0.1125) = 1 ÷ 0.2125 ≈ 4.71; tiempo de ejecución ≈ 1.70 h
N = 161 ÷ (0.10 + 0.05625) = 1 ÷ 0.15625 = 6.4; tiempo de ejecución = 1.25 h
N más pequeño que cumple el objetivoSe necesita 0.10 + 0.90 ÷ N ≤ 1 ÷ 5.33 = 0.1875, así que N ≥ 0.90 ÷ 0.0875 ≈ 10.3: 11 servidores dan 1 ÷ (0.10 + 0.0818) ≈ 5.50, tiempo de ejecución ≈ 1.45 h
N = 641 ÷ (0.10 + 0.0141) ≈ 8.77; tiempo de ejecución ≈ 0.91 h
Límite cuando N crece1 ÷ 0.10 = 10; el tiempo de ejecución nunca baja de 0.8 h
AlternativaReducir a la mitad la parte serie (s = 0.05), por ejemplo cargando las tarifas en paralelo. Entonces 8 servidores dan 1 ÷ (0.05 + 0.11875) ≈ 5.93, tiempo de ejecución ≈ 1.35 h: el objetivo se cumple con 8 servidores en lugar de 11.

Pasar de 16 a 64 servidores (cuatro veces el costo) solo reduce la ejecución de 1.25 h a 0.91 h. Los rendimientos decrecen rápidamente.

Reducir la fracción serie suele ser mucho más barato que añadir hardware. Los arquitectos buscan las partes serie ocultas: un único bloqueo, una fila de la base de datos que todos actualizan, un coordinador central.

La Ley de escalabilidad universal

La ley de Amdahl supone que los procesadores adicionales nunca empeoran las cosas; la aceleración simplemente se estanca. Los sistemas distribuidos reales a menudo sí empeoran: a partir de cierto punto, añadir nodos reduce el throughput. La Ley de escalabilidad universal (USL) de Neil Gunther lo modela con dos penalizaciones. La contención (α, alfa) es el costo de hacer cola por los recursos compartidos, el mismo efecto que la fracción serie de Amdahl. La coherencia (β, beta) es el costo de mantener los datos consistentes entre nodos: cada nodo debe intercambiar información con todos los demás, así que este costo crece aproximadamente con el cuadrado del número de nodos.

La capacidad relativa es C(N) = N ÷ (1 + α(N − 1) + βN(N − 1)). Con β = 0 se reduce a la ley de Amdahl. Con cualquier β mayor que cero, la capacidad alcanza un máximo en torno a N = √((1 − α) ÷ β) y luego cae. Para α = 0.03 y β = 0.002, el máximo está cerca de √(0.97 ÷ 0.002) ≈ 22 nodos, con una capacidad de unas 8.6 veces la de un nodo; con 32 nodos la capacidad ha vuelto a bajar a unas 8.2. Gunther describe el modelo en Guerrilla Capacity Planning (2007). Su valor práctico es que α y β se pueden ajustar a partir de un puñado de mediciones de pruebas de carga, lo que te permite predecir dónde dejará de compensar el escalado antes de comprar el hardware.

Escalado lineal, de Amdahl y de la USL

Capacidad relativa según el número de nodos para el escalado lineal, la ley de Amdahl con 3 por ciento de trabajo serie y la Ley de escalabilidad universal, que alcanza un máximo y luego bajaLineal (ideal)Amdahl, 3% serieUSL: pico cerca de 22 nodos18162432Número de nodos N8162432Capacidad relativa C(N)
El escalado ideal es lineal; la ley de Amdahl se aplana por el trabajo serie; la USL incluye además los costos de coherencia, así que la capacidad alcanza un máximo y luego disminuye.

Tácticas de rendimiento: una visión general

Bass, Clements y Kazman agrupan las tácticas de rendimiento en dos familias. La primera es controlar la demanda de recursos: reducir cuánto trabajo llega o cuánto cuesta cada unidad. La segunda es gestionar los recursos: hacer que los recursos disponibles trabajen más o añadir más. La mayoría de los diseños reales combinan varias tácticas; cada una tiene también costos en otros ámbitos, y por eso son decisiones arquitectónicas.

Tácticas de rendimiento y dónde las trata el curso

TácticaQué haceCosto o riesgo típicoMás en
Reducir la demanda: limitación de tasa (rate limiting), control de admisión, salas de esperaLimita o suaviza la carga entrante para que el núcleo se mantenga por debajo de su codoAlgunos usuarios sufren retrasos o son rechazadosCapítulo 9: colas y back pressure
Reducir el trabajo por solicitud: algoritmos eficientes, cargas útiles más pequeñas, menos viajes de ida y vueltaReduce el tiempo de servicioEsfuerzo de desarrollo; a veces, código menos flexibleCapítulo 0: datos y algoritmos
Priorizar y planificarAtiende primero el trabajo importante (los pedidos pagados antes que los informes)El trabajo de baja prioridad puede quedarse sin atenderCapítulo 9: patrones de resiliencia
CachéMantiene los resultados cerca del usuario para evitar trabajo repetidoDatos desactualizados, complejidad de invalidación, costo de memoriaCapítulo 7: caché
Concurrencia y asincroníaProcesa en paralelo el trabajo independiente; saca el trabajo lento de la ruta de la solicitudRazonamiento más difícil, problemas de orden y de consistenciaCapítulo 6: comunicación
ReplicaciónAñade copias de servicios o datos para repartir las lecturas y la cargaConsistencia entre copias; costoCapítulo 7: replicación y particionamiento
Particionamiento (sharding)Divide los datos y el trabajo para que cada nodo se ocupe de una parteLas consultas entre particiones y el reequilibrado son difícilesCapítulo 7: replicación y particionamiento
Añadir recursos: escalar vertical u horizontalmenteAumenta la capacidadCosto; limitado por el trabajo serie y de coherenciaCapítulo 9: estrategias de escalado

Comprueba lo que has entendido

Un servicio recibe 500 solicitudes por segundo y cada una tarda 80 ms. ¿Cuántas hay en curso en promedio?

Por la ley de Little, L = 500 × 0.08 = 40 solicitudes en curso.

Con la fórmula M/M/1, ¿cuál es el tiempo de respuesta medio de un servidor con un tiempo de servicio de 10 ms al 75% de utilización?

W = 10 ÷ (1 − 0.75) = 40 ms, de los cuales 30 ms son de espera.

¿Por qué p99 suele ser una medida mejor que la media para un requisito?

Las distribuciones de los tiempos de respuesta son asimétricas; la media puede parecer saludable mientras una parte significativa de los usuarios sufre respuestas muy lentas, y p99 deja al descubierto esa cola.

Si el 20% de un trabajo es serie, ¿cuál es la aceleración máxima que se obtiene añadiendo procesadores?

1 ÷ 0.2 = 5 veces, por muchos procesadores que se añadan.

Siguiente · 2.5Disponibilidad y fiabilidadQué significan realmente la disponibilidad, la fiabilidad y la tolerancia a fallos, cómo calcular los nueves, el MTBF y el MTTR, cómo se combinan los componentes en serie y en paralelo, y las tácticas, el RTO y el RPO que las hacen posibles.Continuar →

Fuentes y lecturas recomendadas

¿Tienes una pregunta sobre esta sección? ArchitectBot, el asistente de estudio con IA del curso, responde primero a partir del curso.

Pregunta: “Nuestra API tiene una media de 150 ms, pero los usuarios siguen quejándose de que es lenta. ¿Cómo debería medir su rendimiento y fijar objetivos?”