Ya fue anunciada la versión estable de Portage 3.0
Hace poco los desarrolladores que están a cargo de del sistema de administración de paquetes Portage (en la distribución de Gentoo Linux) dieron a conocer el lanzamiento de la version estable de la version 3.0.
En la cual, la principal novedad de esta nueva rama presentada, es el trabajo que se realizó a largo plazo sobre la transición a Python 3 y el final del soporte para Python 2.7 (algo que ya se veía venir desde hace mucho tiempo, ya que esta rama quedo oficialmente sin soporte desde hace ya varios meses)
¡Tenemos buenas noticias! El proyecto Portage de Gentoo ha estabilizado recientemente la versión 3.0 del administrador de paquetes.
¿Qué hay de nuevo? Bueno, esta tercera versión de Portage elimina el soporte para Python 2.7, que ha sido un esfuerzo continuo en el repositorio principal de Gentoo por parte del proyecto Python de Gentoo durante el año 2020.
Además de la descontinuación del soporte para Python 2.7, otro cambio importante que se destaca de esta nueva rama estable de Portage 3.0 fue la inclusión de diversas optimizaciones que permitieron hacer que los cálculos sean mucho mas rápidos (entre un 50% y 60%) asociados con la determinación de dependencias.
Curiosamente, algunos desarrolladores sugirieron reescribir el código de resolución de dependencias en C/C ++ o Go para acelerar su trabajo, pero lograron resolver el problema existente con un gran esfuerzo.
Y es que el perfil del código existente mostró que la mayor parte del tiempo de cálculo se dedica a llamar a las funciones use_reduce y catpkgsplit con un conjunto repetido de argumentos (la persona que llevo este labor menciona que por ejemplo, la función catpkgsplit se llamó de 1 a 5 millones de veces).
Con el problema detectado, menciona que para acelerar los cálculos, se aplicó el almacenamiento en caché del resultado de estas funciones mediante diccionarios.
Además, debido a un parche proporcionado por el usuario, la actualización a la última versión de Portage puede acelerar enormemente los cálculos de dependencia entre un 50 y un 60%. ¡Nos encanta ver a nuestra comunidad participar en nuestro software! Para obtener más detalles, consulte esta publicación de Reddit del miembro de la comunidad que proporcionó el parche. ¡Manténgase saludable y siga cocinando con Gentoo!
Además de que también señala que la función incorporada lru_cache era óptima para esta labor de almacenar el caché, pero que solo estaba disponible en las versiones de Python desde 3.2.
Para compatibilidad con versiones anteriores, tambien se agregó un código auxiliar para reemplazar lru_cache, pero la decisión de finalizar el soporte de Python 2.7 en Portage 3.0 simplificó enormemente la tarea y permitió poder prescindir de esta capa.
Dediqué un tiempo a perfilar Portage con cProfile y vmprof para comprender qué funciones tomaban más tiempo. También generé algunos flamegraphs a partir de los resultados del generador de perfiles, que se veían así . Lo que noté fue que algunas funciones, como
use_reduce
ycatpkgsplit
, se llaman con mucha frecuencia con los mismos argumentos (como, 1 a 5 millones de veces, paracatpkgsplit
). Hice algunos experimentos para almacenar en caché los resultados de estas funciones en un dictado, y después de ver algunas buenas aceleraciones, envié un parche a la lista de desarrolladores de Portage. Alguien sugirió usar Python incorporadolru_cache
decorador de funciones en su lugar, pero eso solo está disponible en Python 3.2 y superior.
Por otro lado el uso de la caché ha reducido la operación “emerge -uDvpU –with-bdeps = y @world” en el ThinkPad X220 de 5 minutos 20 segundos a 3 minutos 16 segundos (63%). Las pruebas en otros sistemas han demostrado una ganancia de rendimiento de al menos un 48%.
El desarrollador que preparó el cambio también intentó implementar un prototipo del código de resolución de dependencias en C ++ o Rust, pero la tarea resultó ser demasiado difícil, ya que requería portar una gran cantidad de código y, al mismo tiempo, era dudoso que el resultado valiera la pena el esfuerzo.
Finalmente si quieres conocer mas al respecto sobre la nota de la liberación de esta rama estable, puedes consultar los detalles en el siguiente enlace.