2010-03-25 8 views
8

Actualmente estoy evaluando algunos de los asignadores de memoria escalables, concretamente nedmalloc y ptmalloc (ambos construidos sobre dlmalloc), como un reemplazo para malloc/nuevo predeterminado debido a la contención significativa observada en el entorno multiproceso. Su desempeño publicado parece ser bueno, sin embargo, me gustaría comprobar cuáles son las experiencias de otras personas que realmente los han utilizado.Experiencias de asignador de memoria escalable

  • ¿Se cumplieron sus objetivos de rendimiento?
  • ¿Experimentó problemas inesperados o difíciles de resolver (como corrupción de montón)?
  • Si ha intentado tanto ptmaalloc y nedmalloc, cuál de los dos me recomiendan? ¿Por qué (facilidad de uso, rendimiento)?
  • ¿O tal vez recomendaría otro asignador escalable (gratis con una licencia permitida preferida)?
+0

Por cierto ¿ha evaluado el asignador de Hoard (http://www.hoard.org)? –

+2

No lo hice, porque su licencia GPL no es aceptable en este caso (y su licencia comercial parece demasiado costosa para nosotros). – Suma

+0

Dado que es importante para mí, ¿podría explicarme por qué la GPL no es aceptable? ¿Qué lo hace inaceptable en tu caso? –

Respuesta

5

he implementado NedMalloc en nuestra aplicación y estoy muy contenta con los resultados. La contención que he visto antes se había ido, y el asignador fue bastante fácil de conectar, incluso el rendimiento general fue muy bueno, hasta el punto en que la sobrecarga de las asignaciones de memoria está fuera de servicio ahora es casi inmesurable.

No probé el ptmalloc, ya que no encontré una versión de Windows preparada y perdí la motivación una vez que NedMalloc funcionó bien para mí.

Además de los dos mencionados, creo que también podría ser interesante probar TCMalloc - tiene algunas características que suenan mejor que NedMalloc en teoría (como muy poco sobrecarga para pequeñas asignaciones, en comparación con 4 B encabezado utilizado por NedMalloc) Sin embargo, como no parece tener el puerto de Windows listo, también podría ser difícil.


Después de unas semanas de uso de NedMalloc que se vio obligado a abandonarla, porque su espacio de arriba ha demostrado ser demasiado alto para nosotros. Lo que nos impactó en particular fue que NedMalloc parece estar recuperando la memoria de que ya no está acostumbrado al sistema operativo de mala manera, manteniendo la mayoría de ellos aún comprometidos. Por ahora lo he reemplazado con JEMalloc, que parece no ser tan rápido (todavía es rápido, pero no tan rápido como lo fue NedMalloc), pero es muy robusto de esta manera y su escalabilidad también es muy buena.


Y después de unos meses de usar JEMalloc he cambiado a TCMalloc.Tomó más esfuerzo adaptarlo para Windows en comparación con los otros, pero sus resultados (tanto de rendimiento como de fragmentación) parecen ser los mejores para nosotros de lo que he probado hasta ahora.

+0

¿Puede explicar los cambios que ha realizado en TCmalloc? Estamos teniendo el problema opuesto, donde TCmalloc en Windows no devuelve la memoria al sistema correctamente. (En Linux usa madvise (MADV_DONTNEED) para devolver la memoria física, pero no hay un equivalente en Windows.) ¿Cómo resolvió este problema? – skoy

+2

@skoy Puede encontrar las fuentes de todos nuestros asignadores en http://community.bistudio.com/wiki/ArmA_2:_Custom_Memory_Allocator - el basado en TCMalloc está en ftp://downloads.bistudio.com/arma2.com/update/ Allocs/TCMalloc_source.7z. Puede observar que hemos cambiado TCMalloc_SystemAlloc y TCMalloc_SystemRelease bastante. Nota: mientras tanto, hemos cambiado al asignador Intel TBB, basado en el rendimiento a gran escala y las pruebas de estabilidad. – Suma

+0

¡Gracias, eso es increíblemente útil! – skoy

4

En el pasado he necesitado un método muy rápido para asignar memoria. Descubrí que no había una asignación que estuviera a la altura del trabajo.

Después de un par de días de búsqueda encontré boost :: pool, que en nuestra aplicación obtuvimos un aumento en el rendimiento de 300x.

Nos affectivly simplemente llamamos malloc/libre en los objetos que queremos crear. Aunque hay un poco de sobremesa de configuración, con tener que malloc una gran cantidad de memoria para empezar, pero una vez hecho esto, esto es muy rápido.

1

Intenté seguir su camino hace un tiempo cuando me enfrenté a una disputa de subprocesos múltiples y un grave problema de fragmentación. Después de bastante poco tiempo de las pruebas, concluí que el beneficio de estos asignadores es insignificante en la mayoría de los casos interesantes que tuve.

La verdadera solución fue sacar mi propio administrador de memoria que estaba especializado para las tareas que estaba haciendo más a menudo.

1

Si está en Win32, mi experiencia ha sido que es difícil superar al administrador de montón de Windows normal siempre que haya habilitado el Low Fragmentation Heap con la API HeapSetInformation. Creo que esto es ahora estándar en las versiones más nuevas de Windows. Maneja el bloqueo usando primitivas Win32 Interbloqueadas en lugar de un bloqueo Mutex/CritSec más simple.

+0

Puede ser difícil superarlo en rendimiento y fragmentación de un único subproceso, pero desafortunadamente está lejos de ser escalable para múltiples núcleos. Parece omitir el "Caché de subprocesos" que ofrece otro asignador escalable, que utilizan para evitar bloquear en situaciones típicas por completo. – Suma

+0

Bastante justo. Si/cuando ha medido el uso de algunos de ellos, hágame saber sus resultados en comparación con LFH aquí. –

Cuestiones relacionadas