RubySe viene Ruby 3.2, la nueva versión de Ruby que estaría disponible a partir de el próximo día de Navidad. Shopify es una de las empresas que ha venido apoyando mucho al lenguaje de programación, además de tener la aplicación Ruby on Rails más grande del mundo (o así lo afirman).

Ufuk Kayserilioglu, Gerente de Ingeniería en el equipo de Infraestructura de Shopify, compartió que “hay tantas cosas geniales en 3.2 que no pudimos esperar al día de la publicación, y ya las usamos en los pedidos a Shopify”.

Quedé bastante emocionado con todo lo que describe, y lo hace de manera muy didáctica. Así que decidí compartir por acá toda esta información.

Todos los pedidos al frente de las tiendas online de Spotify son servidos por la última versión de Ruby con el YJIT habilitado. Esto acelera todos los pedidos aproximadamente en un 10%. Así lo comentó su CEO.

YJIT: Yet Another Ruby JIT – fue desarrollado por Maxime Chevalier y su equipo en Shopify. Es un JIT minimalista en Ruby desarrollado dentro de CRuby. Más información. Si bien está disponible ya en Ruby 3.1, en 3.2 está etiquetado como “listo para producción”. El mayor problema resuelto fue el uso de memoria extra en la versión anterior. Ahora utiliza menos memoria (en el caso de Shopify redujeron la configuración del tamaño de memoria ejecutable por defecto de 256MB a 64MB). YJIT asigna la memoria que necesita usar de manera “lazy”.

También hay ahora un Code GC, recolector de basura de código, que invalida y colecta código de máquina que ya no es válido o necesario. Esto permite a aplicaciones que llenan el tamaño de la memoria ejecutable a reclamar algo de memoria para poder continuar beneficiándose del JIT.

Los benchmarks muestran que  a pesar del uso más eficiente de memoria, el nuevo YJIT es más rápido que el anterior, y hasta un 40% más rápido que CRuby.

La última versión de Ruby también implementa Variable Width Allocation, lo que permite que la máquina virtual almacene objetos más grandes para mejorar la información a nivel local.

Hasta Ruby 3.1, la máquina virtual de Ruby asignaría objetos usando slots fijos de 40 bytes. Usaría algo de los 40 bytes para llevar el registro, y podía almacenar algo de información en los restantes 20 o tantos bytes. Pero la mayoría de los objetos almacenan más información que eso. Así que Ruby asignaría memoria extra del sistema para guardar la información extra. La ubicación de la memoria estaría lejos de la ubicación del slot del objeto, lo que significaba que se necesitarían más lecturas de memoria para leer objetos, lo cual es ineficiente.

VWA implementa slots de varios tamaños para permitir a objetos más grandes almacenar su información en el mismo slot. Esto mejora la memoria localmente y permite el acceso a objetos de manera más rápida. La tecnología existía para Ruby 3.1 pero está activada por defecto en Ruby 3.2. Los benchmarks muestran un aumento de velocidad de entre un 2 y 10%.

El trabajo fue realizado por Peter Zhu, Matt Valentine-House y Aaron Patterson. Y hay una charla de RubyKaigi 2021 donde explican más:

[EN] Variable Width Allocation: Optimizing Ruby's Memory Layout / @peterzhu2118 and @eightbitraptor

Por último, Object Shapes,es una técnica para guardar propiedades de objetos de manera eficiente. La técnica viene de Smalltalk y está siendo usada por V8, TruffleRuby y otras máquinas virtuales. La idea es tratar a un objeto como una bolsa de propiedades, y considerar objetos que tengan definidas las mismas propiedades de la misma manera tener la misma “forma”. Con propiedades se refiere al “estado” que tiene un objeto, como variables de instancia y el estado congelado. Representar objetos de esa manera permite optimizaciones nuevas. Chri Seaton (Q.E.P.D.) dió una charla explicando la idea en RubyKaigi 2021:

[EN][Keynote] The Future Shape of Ruby Objects / Chris Seaton @chrisseaton

Maxime Chevalier se dió cuenta trabajando en YJIT que si Ruby implementaba Object Shapes, se podría mejorar acceso a las variables de instancia desde el intérprete y el JIT. También explicó la idea en RubyKaigi 2021:

[EN] YJIT - Building a new JIT Compiler inside CRuby / Maxime Chevalier-Boisvert @maximecb

La implementación estuvo a cargo de Jemma Issroff y Aaron Patterson. Los resultados finales mejoraron por 6 veces la velocidad de acceso a variables de instancia. Jemma Issroff habló de esta implementación en Euruko:

Implementing Object Shapes in CRuby by Jemma Issroff

Ufuk Kayserilioglu también habla sobre mejoras en la estabilidad. Este año Shopify ha estado ejecutando Integración Contínua de su aplicación contra Ruby HEAD (hasta cada hora), por lo que cuando algo falla, o lo corregían en su aplicación o reportaban el bug a Ruby. Gracias a ese trabajo, se identificaron y arreglaron varios bugs.

También están trabajando en un nuevo parser para Ruby, que ya está siendo usado en su servidor Ruby LSP.

Y todo esto sin entrar en los detalles nuevos que traerá el lenguaje, pero eso será información para otro día. Espero con ansias la nueva versión de Ruby para empezar a probarla con mis proyectos…

 

No hay comentarios en este post

Feed de comentarios

Dejar un comentario

Notificarme los nuevos comentarios por correo electrónico. Tambien puedes suscribirte sin comentar.

Toasty!