desarrollo        

Identificar, evaluar y solucionar problemas de performance con Ruby

   
Main image

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.

JuanitoFatas/fast-ruby

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.

evanphx/benchmark-ips

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

Railsconf2020

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.

Kill Your Dependencies

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.

Patching Rails Performance

Derailed en Github

schneems/derailed_benchmarks

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.

ankane/pghero

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.

Russian doll caching in Rails

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.

How to Fix Slow Code in Ruby

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.

Skylight

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.

Is Ruby Too Slow For Web-Scale?