Pregunta

Actualmente tengo una aplicación de servidor con múltiples subprocesos y estoy buscando un buen asignador de memoria con múltiples subprocesos.

Hasta ahora estoy dividido entre:

  • umem del sol
  • tcmalloc de Google
  • asignador de bloques de construcción de subprocesos de Intel
  • El tesoro de Emery Berger

Por lo que he encontrado, el acaparamiento 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. ¿Alguien tiene experiencia personal probando estos asignadores?

¿Fue útil?

Solución

He usado tcmalloc y he leído sobre Hoard. Ambos tienen implementaciones similares y ambos logran una escala 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 realice pruebas de rendimiento / carga. De lo contrario, simplemente tira un dado y elige uno de los listados (ponderado por la facilidad de uso en tu plataforma objetivo).

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

Otros consejos

La única forma de saber realmente cuál es el asignador de memoria adecuado para su aplicación es probar algunos. Todos los asignadores mencionados fueron escritos por personas inteligentes y vencerán a los demás en una u otra marca de microbios en particular. Si toda su aplicación funciona durante todo el día, es malloc un fragmento de 8 bytes en el hilo A y libérelo en el hilo B, y no necesita manejar nada más, probablemente podría escribir un asignador de memoria que supere a cualquiera. los enumerados hasta ahora. 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 haya encontrado como resultado de esa experiencia). Es un muy buen asignador, pero qué tan bueno, para usted, depende de su carga de trabajo. Y usted tiene que pagar por Hoard (aunque no es demasiado caro) para usarlo 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 durante 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 la mencionó en su lista, así que asumiré que está fuera. Para ciertas cargas de trabajo, es terrible, pero lo mismo ocurre con cualquier malloc de propósito general.

Si está dispuesto a pagarlo (y el precio es razonable, según mi experiencia), SmartHeap SMP también es una buena opción. La mayoría de los otros asignadores mencionados están diseñados como reemplazos directos de 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 asignadores al contenido de su corazón. En las pruebas que hemos realizado (de nuevo, muy específicas para una aplicación en particular), SmartHeap era casi lo mismo que Hoard para el rendimiento cuando actuaba como un reemplazo directo de malloc; La diferencia real entre los dos es el grado de personalización. Puede obtener un mejor rendimiento cuanto menos general sea el propósito que necesita su asignador.

Y dependiendo de su caso de uso, un asignador multipropósito de propósito general podría no ser lo que quiere usar en absoluto; si eres constantemente malloc & amp; Si se liberan objetos del mismo tamaño, es posible que desee escribir un simple asignador de losas. La asignación de losas se usa en varios lugares del kernel de Linux que se ajustan a esa descripción. (Le daría un par de enlaces más útiles, pero soy un " nuevo usuario " y Stack Overflow ha decidido que a los nuevos usuarios no se les permite ser también útiles en una sola respuesta. Google puede ayuda bastante bien, sin embargo.)

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

Puede encontrar esta comparación útil.

Tal vez esta sea la forma incorrecta de abordar lo que está preguntando, pero tal vez podría emplearse una táctica completamente diferente. Si está buscando un asignador de memoria realmente rápido, tal vez debería preguntarse por qué necesita pasar todo ese tiempo asignando memoria cuando tal vez podría salirse con la asignación de variables de la pila. La asignación de la pila, aunque es mucho más molesta, hacerla bien podría ahorrarle muchos obstáculos, así como evitarle a su código problemas extraños de corrupción de memoria. Además, potencialmente tienes menos fragmentación que podría ayudar.

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

El asignador de locklessinc 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.

ingrese la descripción de la imagen aquí

Probablemente sea una respuesta tardía a tu pregunta, pero

¿Por qué hacer mallocs si tienes mejoras de rendimiento?

Una mejor manera sería hacer un malloc de una ventana de memoria grande en la inicialización y luego crear un ligero administrador de memoria que arrendaría los fragmentos de memoria en tiempo de ejecución .

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

Puede probar ltalloc (asignador de memoria global de uso general con velocidad de asignación rápida de agrupación).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top