2012-10-23 14 views
8

Recentemente ho imparato a conoscere jemalloc, è l'allocatore di memoria utilizzato da firefox. Ho provato a integrare jemalloc nel mio sistema ignorando l'operatore new e delete e chiamando gli equivalenti jemalloc di malloc e free ie je_malloc e je_free.ho scritto un'applicazione di prova che esegue 100 milioni di allocazioni. Ho eseguito l'applicazione sia con glibc malloc che jemalloc, mentre correre con jemalloc richiede meno tempo per tali allocazioni, l'utilizzo della CPU è piuttosto elevato, inoltre la memoria del footprint è maggiore rispetto a malloc. Dopo aver letto questo documento su jemalloc analysis sembrava che Jemalloc potesse avere impronte più grandi di Malloc poiché impiegava tecniche per ottimizzare la velocità rispetto alla memoria. Tuttavia, non ho alcun suggerimento per l'utilizzo della CPU con Jemalloc. Vorrei precisare che sto lavorando su una macchina multiprocessore i cui dettagli sono forniti di seguito.Utilizzo della CPU e della memoria di jemalloc rispetto a glibc malloc

processore: 11 vendor_id: GenuineIntel CPU famiglia: 6 modello: 44 nome del modello: Intel (R) Xeon (R) X5680 CPU @ 3.33GHz passo: 2 CPU MHz: dimensione della cache 3.325,117 : 12288 KB id fisico: 1 fratelli: 12 nucleo id: 10 core: 6 apicid: 53 fpu: sì fpu_exception: sì livello cpuid: 11 wp: sì flags: fpu VME de pse TSC MSR pae MCE CX8 apic sep mtrr PGE MCA cmov pat PSE36 clflush dts ACPI MMX fxsr SSE SSE2 ss ht tm syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc Arat PNI monitorare ds_cpl VMX SMX est tm2 SSSE3 CX16 xtpr sse4_1 sse4_2 POPCNT lahf_lm bogomips: 6.649,91 dimensioni clflush: 64 cache_alignment: 64 formati indirizzo: 40 bit fisiche, 48 bit virtuale gestione potere: [8]

sto usando top -c -b -d 1.10 -p 24670 | awk -v time = $ TIME '{print time, ",", $ 9}' per tenere traccia dell'utilizzo della CPU.

Qualcuno ha avuto esperienze simili durante l'integrazione di Jemlloc?

Grazie!

risposta

1

Questa domanda potrebbe non appartenere a questo, poiché per le soluzioni del mondo reale, dovrebbe essere irrilevante ciò che altre persone hanno trovato nei loro diversi scenari hardware/ambienti/utilizzo. Dovresti testare sul sistema di destinazione e vedere cosa ti si addice.

Per quanto riguarda l'impronta di memoria più elevata, una delle ottimizzazioni delle prestazioni più classiche nell'informatica è il compromesso tra memoria e tempo. Cioè, memorizzando nella cache determinati risultati per la ricerca immediata in seguito e prevenendo il frequente ricalcolo. Inoltre, poiché è presumibilmente molto più complesso, ci sarebbe probabilmente molto più contabilità interna. Questo tipo di compromesso dovrebbe essere più o meno previsto, specialmente quando si sceglie tra varianti di tale livello e moduli di base ampiamente utilizzati. Devi soddisfare le caratteristiche di performance per le tue caratteristiche di utilizzo, dal momento che, di solito, non esiste un proiettile d'argento.

Si potrebbe anche voler guardare su google TCMalloc che è abbastanza vicino anche se credo che Jemalloc è leggermente più performante in generale, oltre a creare meno frammentazione dell'heap nel tempo.

+0

grazie per i vostri commenti Preet. Stavo cercando di capire se qualcuno avesse osservazioni simili su qualsiasi altra macchina multiprocessore. Sono completamente d'accordo con te sul fatto che le esatte prestazioni sarebbero completamente dipendenti dall'hardware, tuttavia mi chiedevo se il modello di utilizzo della CPU dovesse essere lo stesso, cioè più alto per jemalloc in multiprocessore env. – deb

1

Aerospike ha implementato jemalloc nel nostro database NoSQL e rilasciato pubblicamente l'implementazione circa un anno fa con v3.3.x.Proprio oggi Psi Mankoski ha pubblicato an article on High Scalability sul perché e sul modo in cui lo abbiamo fatto, e sul miglioramento delle prestazioni che ha dato rispetto a GlibC malloc.

Abbiamo visto una diminuzione dell'utilizzo della RAM a causa del modo in cui siamo stati in grado di utilizzare la capacità di debug di jemalloc per ridurre al minimo la frammentazione della RAM. Nell'ambiente di produzione, il server% di memoria libera era spesso un "grafo spiky" e spesso aveva raggiunto il 54% prima dell'implementazione di JEMalloc. Dopo l'implementazione, è possibile vedere la diminuzione dell'utilizzo della RAM nel periodo di analisi di 4 mesi. La memoria RAM% free ha iniziato a "flatline" ed è molto più prevedibile, passando da circa il 22-40% a seconda del nodo del server.

Come dice Preet, si è verificata una frammentazione molto inferiore nel tempo, il che significa meno utilizzo della RAM. L'articolo di Psi dà "prova del budino" dietro una simile affermazione.

19

Un ragazzo saggio ha detto su CppCon che non devi mai indovinare sulle prestazioni. Devi misurarlo invece. Ho provato a utilizzare jemalloc con l'applicazione Linux con multithreading. Era un server di protocollo a livello di applicazione personalizzato (su TCP/IP). Questa applicazione C++ utilizzava un codice Java tramite JNI (circa il 5% del tempo in cui utilizzava Java e il 95% del tempo utilizzava il codice C++). Eseguo 2 istanze dell'applicazione in modalità produzione. Ognuno aveva 150 fili. Dopo 72 ore di funzionamento di glibc uno utilizzato 900 M di memoria, e jemalloc uno utilizzato 2,2 G di memoria. Non ho visto differenze significative nell'utilizzo della CPU. Le prestazioni effettive (tempo medio di pubblicazione della richiesta del client) erano vicine allo stesso per entrambe le istanze. Quindi, nel mio test glibc era molto meglio che jemalloc. Certo, è la mia applicazione specifica. Conclusione: Se si dispone di motivi per ritenere che la gestione della memoria dell'applicazione non sia efficace a causa della frammentazione, è necessario eseguire un test simile a quello descritto. È l'unica fonte di informazioni affidabile per le vostre esigenze specifiche. Se jemalloc è sempre meglio che glibc, glibc renderà jemalloc il suo allocatore ufficiale. Se glibc è sempre migliore, jemalloc si fermerà per esistere. Quando i concorrenti esistono da molto tempo in parallelo, significa che ognuno ha una propria nicchia di utilizzo.

0

Sto sviluppando un semplice database NoSQL.
(https://github.com/nmmmnu/HM4)

jemalloc vs malloc serie

Quando uso jemalloc, riduzione delle prestazioni, ma la memoria "frammentazione" diminuisce pure. Anche Jemalloc sembra utilizzare meno memoria sul picco, ma la differenza è del 5-6%.

Quello che intendo con la frammentazione della memoria è il seguente.

  • Per prima cosa ho allocare un sacco di coppie di valori chiave (5-7 GB di memoria)
  • poi guardo l'utilizzo della memoria.
  • Quindi ho deallocate tutte le coppie e qualsiasi altra memoria utilizzata dal mio eseguibile. L'ordine di assegnazione è uguale all'ordine di deallocazione.
  • Infine controllo nuovamente l'utilizzo della memoria.

In malloc standard, ussage è quasi come sulla cima. (Ho controllato in particolare la memoria di mmap e non ce n'è).

Con jemalloc l'utilizzo è minimo.


informazioni bonus - tcmalloc

L'ultima volta che ho controllato con tcmalloc, è stato davvero molto veloce - probabilmente 10% miglioramenti rispetto malloc standard.

Sul picco, consuma meno memoria rispetto al malloc standard, ma più di jemalloc.

Non ricordo la frammentazione della memoria, ma era lontano dal risultato jemalloc.

Problemi correlati