Domanda

Firefox 3 è arrivato con un nuovo allocatore: jemalloc .

Ho sentito in diversi posti che questo nuovo allocatore è migliore. I migliori risultati di Google non hanno fornito ulteriori informazioni e sono interessato a come funziona esattamente.

È stato utile?

Soluzione

jemalloc è apparso per la prima volta in FreeBSD, frutto di un'idea di "Jason Evans", da cui il "je". Lo deriderei per essere egocentrico se non avessi scritto una volta un sistema operativo chiamato paxos :-)

Vedi questo PDF per tutti i dettagli. È un white paper che descrive in dettaglio come funzionano gli algoritmi.

Il vantaggio principale è la scalabilità nei sistemi multi-processore e multi-thread ottenuti, in parte, utilizzando più arene (i blocchi di memoria grezza da cui vengono effettuate le allocazioni).

Nelle situazioni a thread singolo, non vi è alcun vantaggio reale per più arene, quindi viene utilizzata una singola arena.

Tuttavia, in situazioni multi-thread, vengono create molte arene (quattro volte più arene rispetto ai processori) e i thread vengono assegnati a queste arene in modo round robin.

Ciò significa che la contesa di blocco può essere ridotta poiché, mentre più thread possono chiamare contemporaneamente malloc o gratis , contenderanno solo se condividono la stessa arena. Due thread con arene diverse non si influenzeranno a vicenda.

Inoltre, jemalloc tenta di ottimizzare la localizzazione della cache poiché l'atto di recuperare i dati dalla RAM è molto più lento rispetto all'utilizzo dei dati già presenti nella cache della CPU (non diversamente dal concetto alla differenza tra il recupero veloce dalla RAM rispetto al lento recupero dal disco). A tal fine, tenta innanzitutto di ridurre al minimo l'utilizzo complessivo della memoria poiché è più probabile che l'intero set di lavoro dell'applicazione sia nella cache.

E, laddove ciò non sia possibile, cerca di garantire che le allocazioni siano contigue, poiché la memoria allocata insieme tende a essere utilizzata insieme.

Dal white paper, queste strategie sembrano offrire prestazioni simili agli attuali migliori algoritmi per l'uso a thread singolo offrendo al contempo miglioramenti per l'uso a thread multipli.

Altri suggerimenti

Esiste una fonte interessante: la fonte C stessa: http://mxr.mozilla.org/mozilla-central/source /memory/mozjemalloc/jemalloc.c

All'inizio, un breve sommario descrive come funziona approssimativamente. Tuttavia, manca un'analisi dell'algoritmo più approfondita.

Per quanto riguarda i vantaggi offerti da jemalloc su mozilla, per http : //blog.pavlov.net/2008/03/11/firefox-3-memory-usage/ (anche il primo risultato google per mozilla + jemalloc):

[...] ha concluso che jemalloc ci ha dato la minima quantità di frammentazione dopo aver eseguito per un lungo periodo di tempo. [...] I nostri test automatici su Windows Vista hanno mostrato un calo del 22% nell'utilizzo della memoria quando abbiamo attivato jemalloc.

Aerospike ha implementato jemalloc in una filiale privata nel 2013. Nel 2014 è stato incorporato in Aerospike 3.3. Psi Mankoski ha appena scritto dell'implementazione di Aerospike, oltre a quando e come utilizzare efficacemente jemalloc, per Alta scalabilità .

jemalloc ha davvero aiutato Aerospike a trarre vantaggio dalle moderne architetture informatiche multithread, multi-CPU e multi-core. Ci sono anche alcune funzionalità di debug molto importanti integrate in jemalloc per gestire le arene. Il debug ha permesso a Psi di essere in grado di dire, ad esempio, quale fosse una vera perdita di memoria, rispetto a quale fosse il risultato della frammentazione della memoria. Psi discute anche di come la cache dei thread e l'allocazione per thread abbiano fornito un miglioramento generale delle prestazioni (velocità).

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