2008-09-29 11 views
33

Actualmente tengo una aplicación de servidor de varios subprocesos y busco un buen asignador de memoria de subprocesos múltiples.Asignadores de memoria de subprocesos múltiples para C/C++

Hasta ahora Estoy dividido entre:

  • umem de Sun
  • tcmalloc de Google
  • roscado bloques de construcción de Intel asignador tesoro
  • Emery Berger

Por lo que he el tesoro encontrado 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 asignativos?

+1

Qué problema específico (s) está tratando de resolver con el administrador del montón predeterminado actual que está utilizando? Y, ¿cuál es ese? –

+3

En su aplicación, intente comprobar si puede mejorar el rendimiento mediante el uso de almacenamiento local de subprocesos. Si existe la posibilidad de hacerlo, las ganancias pueden ser mejores que usar un asignador multiproceso. – trshiv

Respuesta

16

He usado tcmalloc y he leído sobre Hoard. Ambas tienen implementaciones similares y ambas logran una escala de rendimiento aproximadamente lineal con respecto al número de subprocesos/CPU (de acuerdo con los gráficos en sus sitios respectivos).

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

Y desde trshiv's link, parece que 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.

+1

El enlace de trshiv es [aquí] (http://dsc.sun.com/solaris/articles/multiproc/multiproc.html) ahora –

+0

Ambos enlaces están rotos ahora – Assimilater

4

Quizás esta es la forma incorrecta de abordar lo que está preguntando, pero tal vez podría emplearse una táctica diferente por completo. Si estás buscando un asignador de memoria realmente rápido, tal vez deberías preguntarte por qué tienes que gastar todo ese tiempo asignando memoria cuando quizás podrías simplemente salirte con la asignación de variables de la pila. La asignación de la pila, aunque es mucho más molesto, se puede hacer de manera correcta y puede ahorrarle mucho dinero en la contención del mutex, así como también evitar problemas extraños de corrupción de memoria fuera de su código. Además, posiblemente tenga menos fragmentación que podría ayudar.

+0

Si se trata de un entorno de subprocesos múltiples, la asignación de la pila es la única opción para objetos muy pequeños en pequeñas cantidades: no desea alcanzar el tamaño de la pila en un subproceso, porque entonces se produce el mismo problema que la corrupción normal de la memoria. – hazzen

+0

Sí, estoy de acuerdo con hazzen. La asignación de apilamientos, incluido el almacenamiento local de subprocesos, puede provocar daños en la memoria si se trata de tamaños de datos grandes o grandes. – trshiv

3

Usamos acumulación en un proyecto en el que trabajé hace algunos años. Parecía funcionar bien. No tengo experiencia con los otros asignadores. Debería ser bastante fácil probar diferentes y realizar pruebas de carga, ¿no?

5

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 se usa ampliamente como asignador multiproceso.

Puede que encuentre this comparison útil.

+0

El artículo vinculado se ha movido [aquí] (http://dsc.sun.com/solaris/articles/multiproc/multiproc.html). –

11

La única manera de saber realmente qué asignador de memoria es el adecuado para su aplicación es probar algunas. Todos los asignadores mencionados fueron escritos por gente inteligente y vencerán a los demás en una marca de microbenchmark particular u otra. Si toda su aplicación hace todo el día es malloc un pedazo de 8 bytes en el hilo A y lo libera en el hilo B, y no necesita manejar nada más, probablemente podría escribir un asignador de memoria que supere los pantalones de cualquiera de los enumerados hasta el momento. Simplemente no será muy útil para mucho más. :)

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

Un ptmalloc2 muy poco adaptado ha sido el asignador detrás del malloc de glibc desde hace bastante tiempo, por lo que es increíblemente utilizado y probado. Si la estabilidad es importante sobre todas las cosas, podría ser una buena opción, pero no lo mencionaste en tu lista, así que supongo que está fuera. Para ciertas cargas de trabajo, es terrible, pero lo mismo puede decirse de cualquier malloc de uso general.

Si está dispuesto a pagar (y el precio es razonable, en 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 malloc/nuevos/eliminados gratuitos 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 (una vez más, muy específicas para una aplicación en particular), SmartHeap era casi lo mismo que Hoard para el rendimiento cuando actuaba como un reemplazo de malloc incorporado; la diferencia real entre los dos es el grado de personalización. Puede obtener un mejor rendimiento con el propósito menos general que necesita su asignador.

Y dependiendo de su caso de uso, un asignador multiproceso de propósito general podría no ser el que quiera usar en absoluto; Si está constantemente malloc & liberando objetos que son todos del mismo tamaño, es posible que desee simplemente escribir un asignador simple de losas. 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 más útiles, pero soy un "nuevo usuario" y Stack Overflow ha decidido que los nuevos usuarios no pueden ser demasiado todo en una sola respuesta. Google puede ayudar bastante bien, aunque .)

2

Probablemente una respuesta tardía a su pregunta, pero

qué hacer si tiene mallocs ups cateto rendimiento?

Mejor manera sería hacer un Malloc de una ventana de gran 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 pila.

2

Puede probar ltalloc (asignador de memoria global de propósito general con la velocidad del asignador rápido de la agrupación).

3

El asignador locklessinc es muy bueno y el desarrollador responde si tiene alguna pregunta. 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.

enter image description here

Cuestiones relacionadas