Asignadores de memoria Multiproceso para C / C++


Actualmente tengo una aplicación de servidor multihilo en gran medida, y estoy buscando un buen asignador de memoria multihilo.

Hasta ahora estoy dividido entre:

  • Sun's umem
  • tcmalloc de Google
  • Asignador de bloques de construcción de subprocesos de Intel
  • El tesoro de Emery Berger

Por lo que he encontrado, hoard podría ser el más rápido, pero no había oído hablar de él antes de hoy, así que soy escéptico si es realmente tan bueno como parece. Cualquier persona tiene personal ¿experiencia probando estos asignadores?

Author: Yu Hao, 2008-09-29

8 answers

He usado tcmalloc y he leído acerca de Hoard. Ambos tienen implementaciones similares y ambos logran un escalado de rendimiento más o menos lineal con respecto al número de subprocesos/CPU (de acuerdo con los gráficos en sus respectivos sitios).

Entonces: si el rendimiento es realmente tan increíblemente crucial, entonces haga pruebas de rendimiento/carga. De lo contrario, solo tira un dado y elige uno de los enumerados (ponderado por la facilidad de uso en su plataforma de destino).

Y desde el enlace de trshiv , parece que Hoard, tcmalloc y ptmalloc son casi comparables en velocidad. En general, tt parece que ptmalloc está optimizado para tomar el menor espacio posible, Hoard está optimizado para un intercambio de velocidad + uso de memoria, y tcmalloc está optimizado para la velocidad pura.

 17
Author: hazzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-29 18:18:09

La única manera de saber realmente qué asignador de memoria es el adecuado para su aplicación es probar algunos. Todos los asignadores mencionados fueron escritos por gente inteligente y vencer a los demás en un determinado microbenchmark o de otra. Si todo lo que tu aplicación hace durante todo el día es malloc un fragmento de 8 bytes en el hilo A y lo libera en el hilo B, y no necesita manejar nada más, probablemente podrías escribir un asignador de memoria que supere a cualquiera de los listados hasta ahora. Se simplemente no será muy útil para mucho más. :)

Tengo algo de experiencia usando Hoard donde trabajo (lo suficiente como para que uno de los errores más oscuros abordados en la reciente versión 3.8 se encontró como resultado de esa experiencia). Es un muy buen asignador - pero lo bueno, para usted, depende de su carga de trabajo. Y usted tiene que pagar por Hoard (aunque no es demasiado caro) con el fin de utilizarlo en un proyecto comercial sin GPL ' ing su código.

Un ptmalloc2 muy ligeramente adaptado ha sido el asignador detrás de malloc de glibc desde hace bastante tiempo, por lo que es increíblemente ampliamente utilizado y probado. Si la estabilidad es importante por encima de todas las cosas, podría ser una buena opción, pero no lo mencionó en su lista, así que asumiré que está fuera. Para ciertas cargas de trabajo, es terrible, pero lo mismo es cierto para cualquier malloc de propósito general.

Si estás dispuesto a pagar por ello (y el precio es razonable, en mi experiencia), SmartHeap SMP también es una buena opción. La mayoría de los otros los allocators mencionados están diseñados como reemplazos drop-in malloc / free new / delete que pueden ser LD_PRELOAD'd. SmartHeap también se puede usar de esa manera, pero también incluye una API completa relacionada con la asignación que le permite ajustar sus allocators al contenido de su corazón. En las pruebas que hemos realizado (de nuevo, muy específicas para una aplicación en particular), SmartHeap fue aproximadamente lo mismo que Hoard para el rendimiento cuando actuaba como un reemplazo de malloc; la diferencia real entre los dos es el grado de customización. Puede obtener un mejor rendimiento mientras menos propósito general necesite que su asignador sea.

Y dependiendo de su caso de uso, un asignador multihilo de propósito general podría no ser lo que desea usar en absoluto; si está constantemente malloc y objetos libres que son todos del mismo tamaño, es posible que desee escribir un asignador de losa simple. La asignación de Slab se usa en varios lugares del kernel de Linux que se ajustan a esa descripción. (Te daría un par de enlaces útiles más, pero soy un "nuevo usuario" y Stack Overflow ha decidido que a los nuevos usuarios no se les permite ser demasiado útil todo en una respuesta. Google puede ayudar bastante bien, sin embargo.)

 11
Author: strangelydim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-14 19:46:27

Personalmente prefiero y recomiendo ptmalloc como un asignador multiproceso. Hoard es bueno, pero en la evaluación que mi equipo hizo entre Hoard y ptmalloc hace unos años, ptmalloc fue mejor. Por lo que sé, ptmalloc ha existido durante varios años y se usa ampliamente como asignador de múltiples hilos.

Puede encontrar esta comparación útil.

 5
Author: trshiv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-29 04:38:42

Tal vez esta es la manera equivocada de abordar lo que estás pidiendo, pero tal vez una táctica diferente podría ser empleada por completo. Si está buscando un asignador de memoria realmente rápido, tal vez debería preguntar por qué necesita gastar todo ese tiempo asignando memoria cuando tal vez podría salirse con la suya con la asignación de variables de pila. La asignación de pila, mientras que mucho más molesto, hecho bien podría ahorrarle mucho en el camino de la contención mutex, así como mantener extraños problemas de corrupción de memoria fuera de tu código. Además, potencialmente tiene menos fragmentación que podría ayudar.

 4
Author: Mark Kegel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-29 02:22:35

Usamos hoard en un proyecto donde trabajé hace unos años. Parecía funcionar muy bien. No tengo experiencia con los otros repartidores. Debería ser bastante fácil probar diferentes y hacer pruebas de carga, ¿no?

 3
Author: jfm3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-29 02:26:24

El locklessinc allocator es muy bueno y el desarrollador responde si tiene preguntas. Hay un artículo que escribió sobre algunos de los trucos de optimización utilizados, es una lectura interesante: http://locklessinc.com/articles/allocator_tricks / . Lo he usado en el pasado con excelentes resultados.

introduzca la descripción de la imagen aquí

 3
Author: Eloff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-17 17:56:01

Probablemente una respuesta tardía a su pregunta , pero

¿Por qué hacer mallocs si tienes hick ups de rendimiento ?

Mejor manera sería hacer un malloc de una gran ventana de memoria en la inicialización y luego llegar a un light weight Memory manager que sería lease out the memory chunks at run time.

Esto evita cualquier posibilidad de llamadas al sistema si su expansión de montón.

 2
Author: Jay D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-25 01:03:23

Puede probar ltalloc (asignador de memoria global de propósito general con velocidad de asignador de grupo rápido).

 2
Author: tav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-03 20:51:56