накладные расходы для пустой кучи арены - PullRequest
6 голосов
/ 31 января 2010

Моими инструментами являются Linux, gcc и pthreads. Когда моя программа вызывает new / delete из нескольких потоков и когда возникает конфликт из-за кучи, создаются арены (см. Следующую ссылку для справки http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html). Моя программа работает 24x7, а арены иногда создаются после 2 недели. Я думаю, что в конечном итоге может быть столько арен, сколько потоков. PS (1) показывает тревожное потребление памяти, но я подозреваю, что на самом деле отображается только небольшая его часть.

Что такое «накладные расходы» для пустой арены? (Сколько памяти на арене используется больше, чем если бы все выделение было ограничено традиционной кучей?)

Есть ли способ форсировать создание заранее n арен? Есть ли способ форсировать уничтожение пустых арен?

Ответы [ 5 ]

1 голос
/ 07 февраля 2010

Уничтожение арен ... Я пока не знаю, но есть такой текст (кратко - он говорит НЕТ о возможности уничтожения / обрезки памяти) из анализа http://www.citi.umich.edu/techreports/reports/citi-tr-00-5.pdf с 2000 года (* немного устарел). Пожалуйста, назовите вашу версию glibc.

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. 
1 голос
/ 04 февраля 2010

struct malloc_state (он же mstate, он же дескриптор арены) имеет размер

Glibc-2,2 (256 + 18) * 4 байта = ~ 1 КБ для 32-битного режима и ~ 2 КБ для 64-битного режима. Glibc-2.3 (256 + 256/32 + 11 + NFASTBINS) * 4 = ~ 1,1-1,2 КБ в 32-битной и 2,4-2,5 КБ для 64-битной

См. Файл glibc-x.x.x / malloc / malloc.c, структура malloc_state

0 голосов
/ 05 мая 2011

В нашем приложении основной ценой нескольких арен была «темная» память. Память, выделенная ОС, к которой у нас нет ссылок.

Рисунок, который вы видите

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.

Большие ассигнования освобождаются. Но вся арена на высшей отметке последнего в настоящее время активного распределения по-прежнему использует VMEM, и другие потоки не будут использовать эту арену, если не столкнутся с конфликтом на главной арене.

По сути, это вклад в «фрагментацию памяти», поскольку память может быть доступна в нескольких местах, но необходимость в расширении арены не является причиной для поиска в других аренах. По крайней мере, я думаю, что причина кроется в том, что ваше приложение может иметь больший объем виртуальной машины, чем вы думаете. Это чаще всего поражает вас, если у вас ограниченный своп, так как, как вы говорите, большая часть этого оказывается выгруженной.

Наше (голодное до памяти) приложение может таким образом «тратить» 10% процентов памяти, и в некоторых ситуациях оно действительно может укусить.

Я не уверен, почему вы захотите создать пустые арены. Если выделения и освобождения находятся в одном потоке друг с другом, то я думаю, что со временем вы будете склонны к тому, чтобы все они находились на одной и той же поточной арене без каких-либо разногласий. Пока вы туда добираетесь, у вас могут быть небольшие всплески, так что, возможно, в этом причина.

0 голосов
/ 07 февраля 2010

Рассмотрим использование TCmalloc формы google-perftools. Он просто лучше подходит для резьбовых и долговечных приложений. И это очень БЫСТРО . Посмотрите на http://goog -perftools.sourceforge.net / doc / tcmalloc.html особенно на графике (чем выше, тем лучше). Tcmalloc в два раза лучше , чем ptmalloc.

0 голосов
/ 07 февраля 2010

из строки malloc.c (glibc 2.3.5) 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.)
*/

Тот же результат, что и для 32-битного режима. Результат - чуть более 1 Кбайт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...