2010-01-31 7 views
6

Meine Werkzeuge sind Linux, Gcc und Pthreads. Wenn mein Programm new/delete von mehreren Threads aufruft und wenn es einen Konflikt für den Heap gibt, werden 'arena's erstellt (siehe folgenden Link als Referenz). Mein Programm läuft 24x7, und Arenen werden immer noch gelegentlich nach 2 Wochen erstellt. Ich denke, dass es irgendwann so viele Arenen wie Threads geben kann. ps (1) zeigt alarmierenden Speicherverbrauch, aber ich vermute, dass nur ein kleiner Teil davon tatsächlich zugeordnet ist.Overhead für eine leere Heap Arena

Was ist der "Overhead" für eine leere Arena? (Wie viel mehr Speicher pro Arena wird verwendet, als wenn die gesamte Zuweisung auf den traditionellen Heap beschränkt wäre?)

Gibt es eine Möglichkeit, die Erstellung im Voraus von n Arenen zu erzwingen? Gibt es eine Möglichkeit, die Zerstörung leerer Arenen zu erzwingen?

+0

Welche Version von glibc und gcc verwenden Sie? – osgx

+0

Die Antwort wird für verschiedene glibc-Versionen unterschiedlich sein. – osgx

+0

Verwenden Sie Ptmalloc? Was gcc und glibc Version? – osgx

Antwort

1

struct malloc_state (aka mstate, aka Arena descriptor) hat Größe

glibc-2,2 (256 + 18) * 4 Bytes = ~ 1 KB für 32-Bit-Modus und ~ 2 KB für 64-Bit-Modus. glibc 2.3 -(256 + 256/32 + 11 + NFASTBINS) * 4 = ~ 1,1-1,2 KB in 32-Bit- und 64-Bit-2,4-2,5 KB für

glibc-xxx/malloc/malloc.c Datei anzeigen, struct malloc_state

+1

Müssen Sie es nicht auf die nächste MMU Paging Block Größe runden? Danke für die Antwort! – rleir

+0

Es ist interner Arena-Deskriptor. Jeder Arena-Deskriptor befindet sich im mmap-Segment. Limit von maximal 65.000 mmaps ist fest codiert. Jede mmap benötigt einige Ressourcen von OS Kernel (VMA). – osgx

+0

Alle Arena Deskriptoren sind in zirkulär verknüpften Liste beginnt von main_arena. Jede neue Arena wird am Anfang der mmap-ed-Region mit einem Offset von sizeof (heap_info) = 4xsizeof (void *) = 16 oder 32 Bytes platziert. Der Heap (mmaped-Segment) ist ausgerichtet und hat eine Größe von HEAP_MIN_SIZE bis HEAP_MAX_SIZE. Es hat eine native Ausrichtung der Aufrufe von mmap (= Seite = 4k). Der Rest von Heap (nach heap_info und mstate) wird für malloc_chunks (malloced data) verwendet. – osgx

0

von malloc.c (glibc 2.3.5) Linie 1546

/* 
    -------------------- Internal data structures -------------------- 
    All internal state is held in an instance of malloc_state defined 
    below. 
... 
    Beware of lots of tricks that minimize the total bookkeeping space 
    requirements. **The result is a little over 1K bytes** (for 4byte 
    pointers and size_t.) 
*/ 

Das gleiche Ergebnis, wie ich für 32-Bit-Modus bekam. Das Ergebnis ist ein wenig mehr als 1 K

1

Zerstörung von Arenen Bytes ... Ich weiß noch nicht, aber es ist so, Text (kurz - es sagt NO auf die Möglichkeit der Zerstörung/Trimmspeicher) aus der Analyse http://www.citi.umich.edu/techreports/reports/citi-tr-00-5.pdf aus dem Jahr 2000 (* etwas veraltet). Bitte nenne deine glibc-Version.

Ptmalloc maintains a linked list of subheaps. To re- 
duce lock contention, ptmalloc searchs for the first 
unlocked subheap and grabs memory from it to fulfill 
a malloc() request. If ptmalloc doesn’t find an 
unlocked heap, it creates a new one. This is a simple 
way to grow the number of subheaps as appropriate 
without adding complicated schemes for hashing on 
thread or processor ID, or maintaining workload sta- 
tistics. However, there is no facility to shrink the sub- 
heap list and nothing stops the heap list from growing 
without bound. 
+0

Es gibt einen Code für Heap (alias Arena) Trimmen (heap_trim). Aber es funktioniert nur für völlig freie Arena. – osgx

+0

Solch "einfacher Weg" der wachsenden Unterhäufigkeitszahl wird zur kontinuierlichen Erstellung von Arenen (Unterhaufen) führen. Die Arena-Nummer kann auch aufgrund der Heap-Fragmentierung anwachsen. – osgx

0

Erwägen Sie die Verwendung von TCmalloc Form google-perftools. Es ist einfach besser geeignet für und langlebige Anwendungen. Und es ist sehr FAST. Werfen Sie einen Blick auf http://goog-perftools.sourceforge.net/doc/tcmalloc.html vor allem auf Grafiken (höher ist besser). Tcmalloc ist zweimal besser als ptmalloc.

+0

Danke für die Idee. Hinweis: Bei der ursprünglichen Frage geht es nicht um Geschwindigkeit, ich brauche sie nicht, um schneller zu sein. – rleir

+0

High Speed ​​ist ein Bonus da :) – osgx

0

In unserer Anwendung waren die Hauptkosten für mehrere Arenen "dunkler" Speicher. Vom Betriebssystem zugewiesener Speicher, auf den wir keine Referenzen haben.

Das Muster, das Sie sehen können, ist

Thread X goes goes to alloc, hits a collision, creates a new arena. 
Thread X makes some large allocations. 
Thread X makes some small allocation(s). 
Thread X stops allocating. 

Große Zuweisungen befreit werden. Aber die ganze Arena an der oberen Grenze der letzten aktiven Zuteilung verbraucht immer noch VMEM, und andere Threads werden diese Arena nicht benutzen, es sei denn, sie treffen einen Konflikt in der Hauptarena.

Grundsätzlich ist es ein Beitrag zur "Speicherfragmentierung", da es mehrere Speicherplätze gibt, die verfügbar sein können, aber eine Arena zu bauen, ist kein Grund, in anderen Bereichen zu suchen.Zumindest denke ich, dass dies der Grund ist, der Punkt ist, dass Ihre Anwendung mit einem größeren VM-Fußabdruck enden kann, als Sie denken sollten. Das trifft meistens auf Sie zu, wenn Sie nur einen begrenzten Swap haben, da Sie sagen, dass das meiste davon ausgelagert wird.

Unsere (speicherhungrige) Anwendung kann auf diese Weise 10% Prozent des Speichers "verschwendet" haben, und es kann in einigen Situationen wirklich beißen.

Ich bin mir nicht sicher, warum Sie leere Arenen erstellen möchten. Wenn Zuordnungen und Freigaben im selben Thread sind, denke ich, dass Sie im Laufe der Zeit dazu neigen werden, dass alle in derselben Thread-spezifischen Arena ohne Konkurrenz sind. Sie können einige kleine Blips haben, während Sie dort ankommen, vielleicht ist das ein Grund.

+0

Danke dafür. Ich möchte diese Antwort als "beste" mit den Antworten von OSGX verbunden auswählen. – rleir