jueves 3 de septiembre de 2009

Fundamentos de Rendimiento de Software - Referencia rápida

Muchas veces cuando nos ponemos a programar nos olvidamos que no solo se trata de escribir líneas de código que "hagan algo" y ya, nos olvidamos que el ambiente de desarrollo en el que trabajamos no tiene ni la décima parte de la carga de trabajo que tiene un ambiente productivo y es en este último que sucede lo que no consideramos -en el peor de los casos- y tenemos que hacer una revisión de los puntos donde podría estarse presentando el cuello de botella. Leyendo una entrada en el blog de Cary Millsap me encontré con lo que él llama una "Referencia rápida sobre los Fundamentos de Rendimiento del Software" de los términos que deberíamos tener presentes cuando algo no funciona eficientemente.

Glosario

eficiencia Es la medida de cuantos recursos está consumiendo la ejecución de una tarea. Eficiencia es lo inverso a cuanto del tiempo total de servicio de la ejecución de la tarea puede eliminarse sin incrementar su capacidad ni sacrificar la función de negocio.

ocupación Es el valor de utilización de un recurso cuya tasa de transferencia se maximiza con un mínimo impacto en los tiempos de respuesta. El valor de ocupación para un número dado de canales de servicio es menor o igual que el valor mostrado a continuación:

# de canales de servicio1248163264128
Ocupación50%57%66%74%81%86%89%92%

carga Competencia por un recurso inducido por las ejecuciones concurrentes de tareas, medida como utilización.

rendimiento Velocidad de ejecución de la tarea, medido ya sea como tasa de transferencia o tiempo de respuesta.

perfil Descomposición tabular del tiempo de respuesta, listado comúnmente en orden descendente de la aportación del tiempo de respuesta del componente.

demora en la cola Duración que una tarea pasa encolada en un recurso dado, a la espera de su oportunidad de consumirlo, medido en tiempo de ejecución por tarea: segundos por click.

tiempo de respuesta Duración de ejecución de una tarea, medido en tiempo por tarea: segundos por click. El tiempo de respuesta es la suma de la demora en la cola y el tiempo de servicio.

diagrama de secuencia Es un diagrama especificado en el Lenguaje de Modelado Unificado (UML), usado para mostrar las interacciones entre objetos en el orden secuencial en que estas ocurren. Este diagrama es útil para visualizar el tiempo de respuesta.

canal de servicio Un sub-recurso que comparte una sola cola con otros sub-recursos, como una cabina de cuota en un centro comercial o un CPU en una computadora SMP.

tiempo de servicio Duración que una tarea pasa consumiendo un recurso dado, medido en tiempo por ejecución de tarea: segundos por click.

tarea Unidad de trabajo orientada al negocio. Éstas pueden anidarse: imprimir facturas es una tarea; imprimir una factura—subtarea— es también un tarea.

tasa de transferencia Conteo de las ejecuciones completadas por la tarea dentro de un intervalo específico de tiempo: clicks por segundo.

utilización Uso de recurso dividido por capacidad por un intervalo de tiempo específico; una medida cuantitativa de carga.

Principios

1. Un diagrama de secuencia es una herramienta útil para conceptualizar el tiempo de respuesta, sin embargo, para tareas que ejecutan miles de invocacioes (incluso docenas), es más útil el perfil.

2. La tasa de transferencia es el recíproco del tiempo de respuesta. Si agregas carga para crear altas tasas de transferencia cambias el tiempo de respuesta ya que añades espera en la cola.

3. La diferencia entre el tiempo de respuesta de una tarea que tiene un recurso con carga ligera y su tiempo de respuesta con carga pesada es la espera en la cola.

4. La duración de una tarea en la cola para obtener un recurso depende del número de canales de servicio de ese recurso además de su carga:
  1. Agregar canales de servicio reduce la espera en la cola para una carga dada. Sin embargo, el beneficio disminuye cuando los agregas.

  2. Reducir la carga disminuye la espera en la cola para una determinada arquitectura. No hay un límite de escalabilidad para reducir la carga
5. La ocupación es el valor de utilización que define el umbral entre carga ligera y carga pesada sobre un recurso.
  1. En un recurso con carga pesada, los tiempos de respuesta se degradan exponencialmente cuando la carga crece.

  2. En un recurso con carga pesada, los tiempos de respuesta mejoran exponencialmente cuando la carga disminuye
6. Para sistemas con peticiones de servicio de tiempo aleatorio, permitir excesivas cargas sostenidas en los recursos con respecto al valor de ocupación resulta en tiempos de respuesta severamente degradados y tasas de transferencia que fluctúan constantemente con cambios microscópicos en la carga.

7. Para un conjunto de recursos de una computadora, no se puede mejorar el rendimiento haciendo que el código se ejecute velózmente; se puede mejorar el rendimiento solamente eliminando las instrucciones innecesarias en el código, o en el código que compite contra tu código para hacerse de recursos.

8. Mejorar el enfoque de tu código de manera eficiente reduce el tiempo de servicio y carga, los cuales mejoran el tiempo de respuesta, los cuales mejoran exponencialmente el rendimiento en recursos con demasiada carga pesada.

9. No se puede optimizar la tasa de transferencia de una tarea ineficaz. Para analizar la eficiencia de una tarea, se debe analizar su tiempo de respuesta. De aquí que, para optimizar la tasa de transferencia primero se debe analizar el tiempo de respuesta.

10. No le atinarás a la primera en donde es que un programa consume su tiempo, y que es ineficaz tratar de optimizar cualquier cosa que le veas. Analizar su comportamiento ayuda a escribir código que sea más veloz.