X-Git-Url: https://git.llucax.com/z.facultad/75.00/presentacion.git/blobdiff_plain/bc39f01c85dacd01de7e95478e4aa30333d9be7d..cb85e119316f91a9510313c3d7a9ed4eaf2dbe7c:/presentacion.rst?ds=inline diff --git a/presentacion.rst b/presentacion.rst index 16f0454..ca553ce 100644 --- a/presentacion.rst +++ b/presentacion.rst @@ -11,21 +11,24 @@ Recolección de Basura en D Introducción ============================================================================== -Presentación +Introducción -------------------------------------------------- Motivación ~~~~~~~~~~ * Recolección de basura -* Lenguaje de programación **D** -* Utilidad → Software Libre → Contribución +* Lenguaje de programación D +* Investigación + aplicación +* Software Libre +.. r2b-note:: -Recolección de Basura --------------------------------------------------- + 1 min de presentación -Introducción -~~~~~~~~~~~~ + 1.5 min / 2.5 min + +Recolección de Basura +~~~~~~~~~~~~~~~~~~~~~ ¿Qué? * Administración automática de memoria @@ -33,122 +36,21 @@ Introducción ¿Para qué? * Simplificar interfaces -* Mejorar eficiencia (**!**) * Evitar errores de memoria - - * *Dangling pointers* - * *Memory leaks* - * *Double free* +* Mejorar eficiencia (**!**) ¿Cómo? -Algoritmos clásicos -~~~~~~~~~~~~~~~~~~~ -* Conteo de referencias -* **Marcado y barrido** -* Copia de semi-espacio - -.. raw:: latex - - \multiinclude[format=pdf,graphics={height=4.5cm}]{img/mark-sweep} - -.. dummy: para que ande bien el raw de arriba +* Análisis del grafo de conectividad del *heap* +* 50+ años de desarrollo +* 3000+ *papers* -Estado del arte -~~~~~~~~~~~~~~~ -* Medio siglo de investigación y desarrollo (3000+ publicaciones) -* Objetivo +.. r2b-note:: - * ↓ Tiempo total de ejecución - * ↓ Cantidad de recolecciones - * ↓ Tiempo de recolección - * ↓ **Tiempo (máximo) de pausa** + 5 min / 7.5 min -* Técnicas - - * Particiones - * **Concurrencia** - * Organización de memoria - * **Precisión** - * Análisis estático - - -El lenguaje de programación D --------------------------------------------------- - -Características generales +Recolector de Basura de D ~~~~~~~~~~~~~~~~~~~~~~~~~ -* Sintaxis tipo C/C++ -* Compilado -* Sistema de tipos estático -* Multi-paradigma - -Paradigmas -~~~~~~~~~~ -* Programación de bajo nivel (*system-programming*) ← C/C++ - - * ``asm`` - * ``union`` - * ``extern (C)`` - * ``malloc()`` - - → Conservativo + Manipulación de *root set* - -* Programación de alto nivel ← Python/Ruby/Perl - - * *GC* - * ``T[]``, ``T[K]`` - - → Punteros interiores - -* Orientación a objetos ← Java - - * ``~this()`` - - → Finalización - - - -Recolector de basura de D -============================================================================== - -Implementación actual --------------------------------------------------- - -Organización del heap -~~~~~~~~~~~~~~~~~~~~~ -*Heap* → *Pools* → Páginas → Bloques + Listas de libres - -.. image:: img/heap.pdf - :height: 6.7cm - -Bloques -~~~~~~~ -* Tamaño fijo (por página) - - * Potencias de 2 - * De 16 a 4096 bytes - * Más de 4096 (una página) - - * Objeto **grande** - * Múltiplo de páginas: 4096, 8192, ... - * En páginas contiguas (y mismo *pool*) - -* Indicadores (*bit sets* en *pool*) - - * Marcado - - * *mark* - * *scan* - * *noscan* - - * Barrido - - * *free* - * *finals* - -Algoritmo -~~~~~~~~~ * Marcado y barrido * Marcado iterativo @@ -159,59 +61,63 @@ Algoritmo * *Stop-the-world* - * Durante el marcado, en teoría + * Durante el marcado (en teoría) * *Lock* global * Muy propenso a extender el tiempo de *stop-the-world* en la práctica +.. r2b-note:: -Lo bueno, lo malo y lo feo --------------------------------------------------- + 3 min / 33 min -Lo bueno +Lo Bueno ~~~~~~~~ * Anda :) -* Organización del *heap* (*two-level allocation*) +* Organización del *heap* (< fragmentación) * Marcado iterativo (!\ *overflow*) -* *Bit set* para indicadores (caché) +* *Bitset* para bits de marca (*cache friendly*) (bueno != perfecto) -Lo malo y lo feo +.. r2b-note:: + + 5 min / 38 min + +Lo Malo y lo Feo ~~~~~~~~~~~~~~~~ Lo malo * ↓ Configurabilidad (*no silver bullet*) * ↓ Precisión (información de tipos) → Memoria inmortal * ↓ Concurrencia → Grandes pausas -* ↓ Control sobre el factor de ocupación del *heap* → casos patológicos +* ↓ Control sobre el factor de ocupación del *heap* + + → Casos patológicos Lo feo -* El código (complejo, intrincado, duplicado, poco documentado) → Difícil de - mantener, modificar y mejorar +* El código (complejo, intrincado, duplicado, poco documentado) + + → Difícil de mantener, modificar y mejorar + +.. r2b-note:: + + 3.5 min / 41.5 min Modificaciones Propuestas ============================================================================== -Concurrencia +Modificaciones Propuestas -------------------------------------------------- -fork(2) -~~~~~~~ -* Hijo *nace* con una *fotografía* de la memoria del padre -* Aisla modificaciones en la memoria de padre e hijo -* Minimiza copia efectiva de memoria (*COW*) -* Comienza con un solo hilo (el que llamó a ``fork(2)``) -* Muy eficiente - -Algoritmo principal -~~~~~~~~~~~~~~~~~~~ -* Basado en el trabajo de Gustavo Rodriguez-Rivera y Vince Russo (*Non-intrusive - Cloning Garbage Collector with Stock Operating System Support*) +Concurrencia +~~~~~~~~~~~~ +* Algoritmo basado en el trabajo de Gustavo Rodriguez-Rivera y Vince Russo + (*Non-intrusive Cloning Garbage Collector with Stock Operating System + Support*) * Minimiza tiempo de pausa realizando fase de marcado **concurrente** vía ``fork(2)`` * Proceso padre sigue corriendo el programa @@ -219,6 +125,10 @@ Algoritmo principal * Se comunican resultados vía memoria compartida * Sincronización mínima (``fork(2)`` + ``waitpid(2)``) +.. r2b-note:: + + 2.5 min / 44 min + Problemas ~~~~~~~~~ * Hilo que disparó la recolección bloqueado hasta fin de recolección completa @@ -228,7 +138,11 @@ Problemas → Tiempo de pausa en la práctica ~= tiempo total de recolección -Eager allocation +.. r2b-note:: + + 2.5 min / 46.5 min + +Eager Allocation ~~~~~~~~~~~~~~~~ * Crea un nuevo *pool* de memoria antes de lanzar el marcado concurrente * Devuelve memoria del nuevo *pool* al programa mientras termina el marcado @@ -241,7 +155,11 @@ Eager allocation ↓ Tiempo de pausa real -Early collection +.. r2b-note:: + + 6.5 min / 53 min + +Early Collection ~~~~~~~~~~~~~~~~ * Dispara una recolección *preventiva* antes de que se agote la memoria * Permite al programa (**todos** sus hilos) seguir trabajando mientras la @@ -256,106 +174,84 @@ Early collection ↓ Tiempo de pausa real (no garantizado) +.. r2b-note:: -Otras mejoras --------------------------------------------------- - -Precisión -~~~~~~~~~ -Adaptación del trabajo de Vincent Lang y David Simcha: - -* Compilador genera información sobre ubicación de los punteros en un tipo - - * Indica si una *palabra* debe ser escaneada (uniones) - * Indica si una palabra es un puntero + 3.5 min / 56.5 min -* Se pasa esa información al recolector al momento de pedir memoria -* Recolector original utiliza esa información + Si hago una recolección cuando queda 20% de memoria libre y nadie pide más + memoria mientras se recolecta, es como si tuviera 20% menos de memoria + disponible para el programa => más recolecciones => más consumo de CPU (y + potencialmente run-time) - * Almacena un puntero a la información al final del bloque - * Utiliza la información para escanear solo palabras que son punteros (con - seguridad o potencialmente) - -Optimizaciones y otras mejoras menores -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Otras Mejoras +~~~~~~~~~~~~~ +* Marcado semi-preciso del *heap* * Mejora del factor de ocupación del *heap* * Caché de consultas críticas para acelerar cuellos de botella * Reestructuración, modularización, simplificación y limpieza del código * Pre-asignación de memoria * Optimizaciones algorítmicas sobre búsquedas frecuentes * Registro de pedidos de memoria y recolecciones realizadas +* Configurabilidad (en *tiempo de inicialización*) -Configurabilidad -~~~~~~~~~~~~~~~~ -* Configurable en *tiempo de arranque* -* Vía variable de entorno (``D_GC_OPTS``) -* Viejas opciones convertidas - - * ``mem_stop`` - * ``sentinel`` - -* Nuevas opciones +.. r2b-note:: - * ``pre_alloc`` - * ``min_free`` - * ``malloc_stats_file`` - * ``collect_stats_file`` - * ``conservative`` - * ``fork`` - * ``eager_alloc`` - * ``early_collect`` + 2 min / 58.5 min Resultados ============================================================================== -Banco de Pruebas +Resultados -------------------------------------------------- -Diapositiva 1 -~~~~~~~~~~~~~ -Diapositiva 1 +Tiempo Máximo de Stop-The-World +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. image:: img/norm-hist-stw.pdf + :width: 12.5cm -Diapositiva 2 -~~~~~~~~~~~~~ -Diapositiva 2 +.. r2b-note:: + 5.5 min / 67.5 min -Tiempo de Stop-The-World --------------------------------------------------- + Explicar brevemente división de pruebas (cual es trivial, pequeña, real) -Diapositiva 1 -~~~~~~~~~~~~~ -Diapositiva 1 +Tiempo Máximo de Pausa Real +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. image:: img/norm-hist-pause.pdf + :width: 12.5cm -Diapositiva 2 -~~~~~~~~~~~~~ -Diapositiva 2 +.. r2b-note:: + 2 min / 69.5 min -Tiempo de Pausa Real --------------------------------------------------- + Explicar que donde hay grandes diferencias, es por tiempo de barrido -Diapositiva 1 -~~~~~~~~~~~~~ -Diapositiva 1 +Cantidad Máxima de Memoria Utilizada +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. image:: img/norm-hist-mem.pdf + :width: 12.5cm -Diapositiva 2 -~~~~~~~~~~~~~ -Diapositiva 2 +.. r2b-note:: + 3.5 min / 73 min -Tiempo de Ejecución --------------------------------------------------- + Enganchar lo anterior con la relación con el consumo de memoria -Diapositiva 1 -~~~~~~~~~~~~~ -Diapositiva 1 +Tiempo Total de Ejecución +~~~~~~~~~~~~~~~~~~~~~~~~~ +.. image:: img/norm-hist-time.pdf + :width: 12.5cm + +.. r2b-note:: + + 7 min / 80 min + + * mcore y split bajan mucho por caché de tamaño + * rnddata baja mucho por marcado preciso + * bigarr y sbtree suben porque no hacen más que alocar -Diapositiva 2 -~~~~~~~~~~~~~ -Diapositiva 2 Conclusión @@ -366,18 +262,43 @@ Conclusión Resumen ~~~~~~~ -* Recolección de basura → Inagotable -* D → Multi-paradigma → Desafío -* Recolección de basura en D → Fértil -* Mejoras propuestas → Efectivas -* Resultados → Positivos: Esperados + Inesperados +* Objetivo principal + + Minimizar tiempo de pausa para programas reales + + Tiempo de pausa de Dil: + + * *Stop-the-world* **160 veces menor** (1.66s → 0.01s) + * Pausa real **40 veces menor** (1.7s → 0.045s) + +* Objetivo secundario + + No empeorar mucho el recolector actual en ningún aspecto -Problemas, limitaciones y Puntos Pendientes + Utilización de memoria de Dil: + + **50% mayor** (mucho *overhead* por marcado preciso) + +* Yapa + + Tiempo total de ejecución de Dil: + + Casi **3 veces menor** (55s → 20s) + +.. r2b-note:: + + 4 min / 84 min + +Problemas, Limitaciones y Puntos Pendientes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* Predicción de *early collection* * Explosión de uso de memoria con *eager allocation* +* Eficiencia del marcado preciso +* Mejorar predicción de *early collection* * Experimentar con ``clone(2)`` -* Eficiencia de marcado + +.. r2b-note:: + + 3 min / 87 min Trabajos Relacionados ~~~~~~~~~~~~~~~~~~~~~ @@ -396,14 +317,22 @@ Trabajos Relacionados Gustavo Rodriguez-Rivera y Vince Russo. Software Practiceand Experience Volumen 27, Número 8. Agosto 1997. +.. r2b-note:: + + 1.5 min / 88.5 min + Trabajos Futuros ~~~~~~~~~~~~~~~~ * Organización de memoria * Barrido -* Precisión +* \+ Precisión * Concurrencia → *Lock* **global** * Movimiento +.. r2b-note:: + + 1.5 min / 92 min + Preguntas ~~~~~~~~~ ¿? @@ -412,4 +341,5 @@ Fin ~~~ ¡Gracias! + .. vim: set et sw=4 sts=4 spell spelllang=es :