Identificar, evaluar y solucionar problemas de performance con Ruby
Identificar, evaluar y solucionar problemas de performance con Ruby
El 27 de Mayo tuve una sesión de “streaming” para platicar sobre como identificar, evaluar y solucionar problemas de performance en Ruby. El video y los recurso están listados en este post.
El video ya está disponible para quienes no tuvieron la oportunidad de acompañarme.
Para la siguiente sesión hay que estar pendientes de mi cuenta de Twitter @mario_chavez
Recursos de plática
Ruby no es el lenguaje más rápido del mundo en términos de ejecución por lo que siempre hay que considerar si la forma en como escribimos nuestros programas es la mejor en aspectos como legibilidad y rendimiento.
Escribiendo Ruby rápido (Erik Michaels-Ober )
Juanito Fatas (Core Ruby ) documentó en un repositorio de Github las diferentes formas de escribir el mismo código en Ruby para determinar cuál es más rápida, todo basado en la plática de Erik Michaels-Ober.
El pragma frozen_string_literal
puede ayudar a reducir el consumo de memoria en un programa de Ruby 2.3 o mejor.
Ruby Optimization with One Magic Comment
Cómo funciona la máquina virtual de Ruby (Mario Chávez)
La herramienta Benchmark IPS es básica para poder medir y comparar como una propuesta de código es más rápida o más lenta que otra. La clave para medir el rendimiento son las métricas.
Rails agregó un generador para poder generar pruebas de performance.
Rails has added a benchmark generator
En el Keynote de Aaron Patterson de Railsconf habla de cómo identifica problemas de performace con Benchmark IPS y Stackprof
Stackprof ayuda para conocer en que parte de nuestro código es que Ruby está tomando más tiempo.
StackProf: The Holy Grail of Rails Profiling
Menos código es código más rápido. Es necesario revisar las dependencias de nuestros programas y eliminar todo lo que no es necesario.
Rack Miniprofiler una una herramienta útil para entender el performace en aplicaciones Rack, como Sinatra o Rails.
rack-mini-profiler - the Secret Weapon of Ruby and Rails Speed
Derailed es otra herramienta que ayuda a entender estáticamente problemas de consumo de memoria y performance para aplicaciones de Rails.
Derailed en Github
Si en este punto tu código en Ruby está tan optimizado como es posible quizás el problema de performance tiene que ver con el acceso a la Base de Datos. Existen patrones que aunque parecen insignificantes pueden causar problemas de performance en ActiveRecord y posiblemente existan situaciones similares con otros ORM en Ruby.
3 ActiveRecord Mistakes That Slow Down Rails Apps: Count, Where and Present
El infame problema de N+1 en los queries.
Fighting the Hydra of N+1 queries - Martian Chronicles
La falta de indices o actualización de los mismos con el paso del tiempo también pueden representar un problema de performance en una aplicación.
Faster Rails: Is Your Database Properly Indexed? - Semaphore
Si usas una base de datos como Postgresql hay tareas de mantenimiento regulares que debe de recibir para asegurar el mejor de los performance.
Simple Tips for PostgreSQL Query Optimization
PgHero es una herramienta que puede ayudar con el monitoreo del performance de la base de datos.
Rails hace que el caching sea muy sencillo pero también es fácil cometer errores. Russian Doll Caching pueden ayudar para evitar renderizar las vistas cada vez que son requeridas.
En modo de producción también hay bastante que hacer para asegurar que las aplicaciones funcionan lo mejor posible. Por ejemplo compilar Ruby con JMalloc y obtener un beneficio en el consumo de memoria.
How we halved our memory consumption in Rails with jemalloc
Configurar Puma (o Unicorn) para un mejor rendimiento es importante.
Configuring Puma, Unicorn and Passenger for Maximum Efficiency
Otra guía para entender como llegar a la configuración perfecta con Puma.
A Simpler Rails Benchmark, Puma and Concurrency - Appfolio Engineering
Si ponemos todos los links mencionados en acción llegaremos a un par de guías de cómo optimizar todo lo posible para mejorar el rendimiento de nuestras aplicaciones.
Rails is Fast: Optimize Your View Performance
La siguiente guía nos lleva de la mano a sacar la mejor ventaja de Heroku.
Big on Heroku: Scaling Fountain without losing a drop - Martian Chronicles
Finalmente algunas herramientas de las que podemos echar mano para ayudarnos a solucionar problemas de performance.
Una de ellas es TracePoint de Ruby que nos ayuda a encontrar los lugares en los que se ejecuta código como creación de objetos, ejecución de queries y otras cosas que pueden ser inesperadas.
Changing the Approach to Debugging in Ruby with TracePoint
SI queremos monitorear nuestra aplicación Skiylight es la herramienta más sencilla del mercado.
La guía completa de performance en aplicaciones Rails basada en problemas reales de consultoría.
The Complete Guide to Rails Performance
Finalmente les dejo este post con la pregunta si Ruby es demasiado lento para escalar.