Domanda

Al momento ho un'applicazione server multi-thread pesantemente e sto cercando un buon allocatore di memoria multi-thread.

Finora sono diviso tra:

  • Sun's umem
  • tcmalloc di Google
  • Allocatore di blocchi di threading Intel
  • Il tesoro di Emery Berger

Da quello che ho trovato il tesoro potrebbe essere il più veloce, ma non ne avevo mai sentito parlare prima di oggi, quindi sono scettico se è davvero bello come sembra. Qualcuno ha esperienza personale nel provare questi allocatori?

È stato utile?

Soluzione

Ho usato tcmalloc e ho letto di Hoard. Entrambi hanno implementazioni simili ed entrambi raggiungono un ridimensionamento delle prestazioni approssimativamente lineare rispetto al numero di thread / CPU (secondo i grafici sui rispettivi siti).

Quindi: se le prestazioni sono davvero così cruciali, allora esegui il test delle prestazioni / carico. Altrimenti, basta lanciare un dado e scegliere uno degli elementi elencati (ponderato per facilità d'uso sulla piattaforma di destinazione).

E da link di trshiv , sembra Hoard, tcmalloc, e ptmalloc sono approssimativamente paragonabili per la velocità. Nel complesso, tt sembra che ptmalloc sia ottimizzato per occupare il minor spazio possibile, Hoard è ottimizzato per un compromesso di velocità + utilizzo della memoria e tcmalloc è ottimizzato per la pura velocità.

Altri suggerimenti

L'unico modo per dire quale allocatore di memoria è giusto per la tua applicazione è provarne alcuni. Tutti gli allocatori citati sono stati scritti da persone intelligenti e batteranno gli altri su un particolare microbench o su un altro. Se tutta la tua applicazione tutto il giorno è mallocare un blocco di 8 byte nel thread A e liberarlo nel thread B, e non è necessario gestire nient'altro, probabilmente potresti scrivere un allocatore di memoria che batte i pantaloni quelli elencati finora. Semplicemente non sarà molto utile per molto altro. :)

Ho esperienza con Hoard dove lavoro (abbastanza per cui uno dei più oscuri bug risolti nella recente versione 3.8 è stato trovato come risultato di quell'esperienza). È un ottimo allocatore, ma quanto è buono per te dipende dal tuo carico di lavoro. E devi pagare per Hoard (anche se non è troppo costoso) per usarlo in un progetto commerciale senza GPL 'il tuo codice.

Un ptmalloc2 leggermente adattato è stato l'allocatore dietro il malloc di glibc per un po 'di tempo, quindi è incredibilmente ampiamente usato e testato. Se la stabilità è importante soprattutto, potrebbe essere una buona scelta, ma non l'hai menzionata nella tua lista, quindi suppongo che sia fuori. Per alcuni carichi di lavoro, è terribile, ma lo stesso vale per qualsiasi malloc per scopi generici.

Se sei disposto a pagare (e il prezzo è ragionevole, secondo la mia esperienza), SmartHeap SMP è anche una buona scelta. La maggior parte degli altri allocatori citati sono progettati come sostituzioni drop-in malloc / free new / delete che possono essere LD_PRELOAD. SmartHeap può essere utilizzato anche in questo modo, ma include anche un'intera API relativa all'allocazione che consente di ottimizzare gli allocatori in base al contenuto del cuore. Nei test che abbiamo eseguito (ancora una volta, molto specifico per una particolare applicazione), SmartHeap era quasi lo stesso di Hoard per le prestazioni quando agiva come una sostituzione di malloc drop-in; la vera differenza tra i due è il grado di personalizzazione. È possibile ottenere prestazioni migliori meno impieghi generici devono essere il proprio allocatore.

E a seconda del caso d'uso, un allocatore multithread per scopi generici potrebbe non essere affatto ciò che si desidera utilizzare; se sei costantemente malloc & amp; liberando oggetti della stessa dimensione, potresti voler semplicemente scrivere un semplice allocatore di lastre. L'allocazione delle lastre viene utilizzata in diversi punti del kernel Linux che si adattano a tale descrizione. (Ti darei un paio di link più utili, ma sono un "nuovo utente" e StackTranslate.it ha deciso che ai nuovi utenti non è consentito essere troppo utile tutto in una risposta. Google può dare una mano abbastanza bene, comunque.)

Personalmente preferisco e raccomando ptmalloc come allocatore multithread. Hoard è buono, ma nella valutazione che il mio team ha fatto tra Hoard e ptmalloc qualche anno fa, ptmalloc era migliore. Da quello che so, ptmalloc è in circolazione da diversi anni ed è ampiamente utilizzato come allocatore multithread.

Potresti trovare questo confronto utile.

Forse questo è il modo sbagliato di affrontare ciò che stai chiedendo, ma forse una tattica diversa potrebbe essere impiegata del tutto. Se stai cercando un allocatore di memoria molto veloce, forse dovresti chiederti perché devi dedicare tutto quel tempo ad allocare memoria quando potresti semplicemente cavartela con l'allocazione di stack delle variabili. L'allocazione dello stack, sebbene molto più fastidiosa, eseguita correttamente potrebbe farti risparmiare un sacco di cose sulla contesa del mutex, oltre a tenere fuori dal tuo codice strani problemi di corruzione della memoria. Inoltre, potenzialmente hai meno frammentazione che potrebbe aiutare.

Abbiamo usato il tesoro in un progetto in cui ho lavorato qualche anno fa. Sembrava funzionare alla grande. Non ho esperienza con gli altri allocatori. Dovrebbe essere abbastanza facile provarne di diversi e fare test di carico, no?

L'allocatore locklessinc è molto buono e lo sviluppatore è reattivo in caso di domande. C'è un articolo che ha scritto su alcuni dei trucchi di ottimizzazione utilizzati, è una lettura interessante: http://locklessinc.com / articoli / allocator_tricks / . L'ho usato in passato con risultati eccellenti.

inserisci qui la descrizione dell'immagine

Probabilmente una risposta tardiva alla tua domanda, ma

perché fare i malloc se hai delle performance?

Il modo migliore sarebbe quello di fare un malloc di una finestra di memoria grande durante l'inizializzazione e poi trovare un gestore di memoria leggero che darebbe in affitto i blocchi di memoria in fase di esecuzione .

Ciò evita qualsiasi possibilità di chiamate di sistema in caso di espansione dell'heap.

Puoi provare ltalloc (allocatore di memoria globale per uso generico con velocità di allocatore di pool veloce).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top