Re[7]: Менеджеры памяти
От: Аноним  
Дата: 17.01.08 11:18
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Правда существует вероятность перерасхода памяти ввиду очень неплотного заполнения, но это в принципе можно свести к минимуму каким-нибудь хитрым алгоритмом выделения объектов на используемых блоках (например выделять объекты на наиболее заполненных блоках).


Спасибо за идею буду пробовать.
Я видел у аналога (и это работает) выделяют один раз память и используют не списки а массивы.
Re[6]: Менеджеры памяти
От: Sergey Россия  
Дата: 17.01.08 11:50
Оценка:
> T>Я хочу увидеть логику возникновения постоянно возрастающего числа 'дырок' в памяти, которые собственно и приведут к фрагментации и исчерпанию памяти. А то сам я что-то не могу придумать такого сценария...
>
> В моем случаи есть N списков размер каждого элемента списка 64/512-1024 байт
> В минуту создаеться и удаляеться M элементов списка M минимум 200 максимум 3-4 тысячи.
>
> После 5 суток работы в логах появляються сообщения что не возможно выделить память.
> После перезагрузки все нормально.
> На 98% уверен что память не течет так как проверял код много раз именно на мемору лиик.

Под XP проблему можно решить, простым вызовом HeapSetInformation переключившись на использование low-fragmentation heap.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Менеджеры памяти
От: 8bit  
Дата: 17.01.08 14:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>После 5 суток работы в логах появляються сообщения что не возможно выделить память.

А>После перезагрузки все нормально.
А>На 98% уверен что память не течет так как проверял код много раз именно на мемору лиик.

А сколько не может выделить памяти проверяли?

Вот, кстати, топик с похожей проблемой.
http://www.rsdn.ru/forum/message/2489003.1.aspx
Автор: MikelSV
Дата: 16.05.07
Re[7]: Менеджеры памяти
От: Аноним  
Дата: 17.01.08 19:41
Оценка:
Здравствуйте, 8bit, Вы писали:

8>А сколько не может выделить памяти проверяли?

512 байт мне из логов только номер строки где была ошибка известно.

8>Вот, кстати, топик с похожей проблемой.

8>http://www.rsdn.ru/forum/message/2489003.1.aspx
Автор: MikelSV
Дата: 16.05.07


Большое спасибо за ссылку
я тоже сидел на vs6, сейчас тестирую на vs2005 sp1
моя программа активно использует — memset, memcpy, sprintf, вычисление указателей и strcpy

еще хочу добавить что strtok зло
если есть необходимость лучше сразу писать свой аналог strtok
Re: Менеджеры памяти
От: remark Россия http://www.1024cores.net/
Дата: 20.01.08 12:43
Оценка: 25 (5)
Здравствуйте, 8bit, Вы писали:

8>Подскажите, какие есть эффективные быстрые менеджеры памяти (С/С++)?

8>Знаю про SmartHeap от microquill и про Doug Lea's malloc.
8>Может кто своей реализацией поделится ?


Смотря что тебе нужно. Варианта 2 — либо аллокатор общего назначения как drop-in замена стандартному, что бы просто ускорить работу/уменьшить фрагментацию, либо аллокатор под какую-то конкрутную ситуацию.

В первом варианте так же возможны вариации — без поддержки многопоточности вообще, с базовой поддержкой, либо с эффективной поддержкой многопоточности.

Из стандартных можно посмотреть на:
hoard
http://www.hoard.org/

jemalloc
http://people.freebsd.org/~jasone/jemalloc/bsdcan2006/BSDcan2006_slides.pdf
http://people.freebsd.org/~jasone/jemalloc/bsdcan2006/jemalloc.pdf

dlmalloc
http://gee.cs.oswego.edu/dl/html/malloc.html

ptmalloc
http://www.malloc.de/en/index.html

TBB
http://threadingbuildingblocks.org/


Если тебе нужен аллокатор под конкретную ситуацию (тут я имею в виду в основном, что надо выделять блоки фиксированного размера под объекты одного типа), то тут нельзя сравниться с headerless fixed-size аллокаторами. Во-первых, они headerless, т.е. сами не используют дополнительную память на единицу выделения, т.е. из блока 4кб такой аллокатор может выделить ровно 1кб блоков по 4 байта. Во-вторых, они могут выделять память только одного размера, а как следствие нулевая фрагментация и любое выделение/освобождение это O(1).
Основная идея изложена в FixedAllocator в библиотеке Loki:
http://loki-lib.sourceforge.net/
(только поддержка многопоточности там хромает)


Если нужна эффективная поддержка многопоточности, то смотри здесь:
http://www.rsdn.ru/Forum/message/2791305.aspx
Автор: 8bit
Дата: 10.01.08

http://www.rsdn.ru/Forum/message/2791305.aspx
Автор: 8bit
Дата: 10.01.08

http://www.rsdn.ru/Forum/message/2791305.aspx
Автор: 8bit
Дата: 10.01.08


Так же можно поглядеть streamflow:
http://people.cs.vt.edu/~scschnei/streamflow/
http://people.cs.vt.edu/~scschnei/papers/ismm06.pdf


Под конкрутную ситуацию может быть построен очень эффективный аллокатор. Вот например идея моего аллоктора для паттерна producer-consumer:
http://groups.google.com/group/comp.programming.threads/browse_frm/thread/378a35b21ae2b42e



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Менеджеры памяти
От: remark Россия http://www.1024cores.net/
Дата: 20.01.08 12:52
Оценка: 13 (2)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Vain, Вы писали:


А>Подскажите пожалуйста позволит ли Thread malloc или nedmalloc бороться с фрагментацией памяти? Вообще оправданно ли использование менеджера памяти для борьбы с фрагментацией памяти или проще хранить данные в статических массивах? В моем случаи макимум требуеться 10-12mb памяти.



Полностью оправдано. В идеале прикладной программист вообще не должен знать, что такое фрагментация.
Вообще странно, что при требовании 10-12mb памяти удаётся исчерпать всю память с помощью фрагментации... больше похоже на утечку памяти... Попробуй подампить хип, что бы увидеть, что у тебя не утекают объекты. Например можно каждый час писать в лог кол-во выделенных, но не освобожденных объектов. Если ты увидишь последовательность типа: 1000, 950, 1050, 1000, то всё нормально, а если 1000, 2000, 3000, 4000, то проблема не в фрагментации.

Если проблема не в утечке, а именно в фрагментации, то не забываем, что в стандартном хипе Win32 есть т.н. Low-fragmentation Heap:
http://msdn2.microsoft.com/en-us/library/aa366750.aspx
которую можно включить с помощью функции HeapSetInformation()


А>Текущая реализация использует malloc/free память выделяеться блоками по 64/512-1024 байт, но выделяеться и отдаеться очень активно. В результате примерно через 5 дней непрерывной работы появляеться ошибка что невозможно выделить память. После рестарта виндовс все работает нормально.



В такой ситуации следует очень пристально поглядеть на headerless fixed-size аллокаторы памяти. Они имеют нулевую внутреннюю фрагментацию и оооочень быстрые. Например, ты можешь создать под такому аллокатору для размеров 64 и 1024 байта на каждый поток.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Менеджеры памяти
От: alsemm Россия  
Дата: 21.01.08 12:25
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Vain, Вы писали:


А>Подскажите пожалуйста позволит ли Thread malloc или nedmalloc бороться с фрагментацией памяти? Вообще оправданно ли использование менеджера памяти для борьбы с фрагментацией памяти или проще хранить данные в статических массивах? В моем случаи макимум требуеться 10-12mb памяти.

Я правильно понимаю, что у вас серверное приложение? Клиенты через сеть к нему ходят и оно через 5 дней начинает помирать. Так? Я бы написал эмулятор клиента какой-нибудь простецкий, чтобы он загружал сервер под завязку работой, это, возможно, сократит время наработки на отказ с 5 дней до чего-то разумного. Еще бы сделал логирование всех запросов эмулятора к серверу чтобы можно было воспроизвести последовательность действий которая сервер убивает. А потом бы уже вскяие аллокаторы стал пробовать.

Алексей
Re[5]: Менеджеры памяти
От: Аноним  
Дата: 23.01.08 13:28
Оценка:
Здравствуйте, alsemm, Вы писали:

A>Я правильно понимаю, что у вас серверное приложение? Клиенты через сеть к нему ходят и оно через 5 дней начинает помирать. Так? Я бы написал эмулятор клиента какой-нибудь


приложение серверное
тестируем создавая нагрузку эквивалентную нескольким неделям работы
логировать у клиента не возможно так как: что предшествует ошибки не известно а если логировать все то места на диски не хватит/клиент не согласиться (у них более миллиона обращений в сутки а каждое обращение даст в логи строк 200)

в любом случаи спасибо за идею
в лог можно писать не нормальное сообщение а только номер строки которая отработала
можно подменить malloc/free на свои и если они отработали с ошибкой сохранять доп информацию
задумался какие части когда вызываються часто но не когда идет обращение клиента (возможно проблемма в них так как под имитацией нагрузки они не тестируються а вызываються с некоторой эпизодичностью)
Re: Менеджеры памяти
От: koder.spb.ru http://koder-spb.wikispaces.com/
Дата: 01.02.08 12:12
Оценка: 12 (1)
Здравствуйте, 8bit, Вы писали:


8>Подскажите, какие есть эффективные быстрые менеджеры памяти (С/С++)?

8>Знаю про SmartHeap от microquill и про Doug Lea's malloc.

8>Может кто своей реализацией поделится ?


Моя реализация
http://koder.spb.ru/index.php?fix=4
http://koder-spb.wikispaces.com/
Re[2]: А есть такой?
От: 8bit  
Дата: 23.05.08 09:56
Оценка:
Что бы менеджер памяти работал на "файле".
Имеем файл, например 100 мб, и по сути он "пул" памяти на 100мб.
При нехватке, "пул" можно увеличить, или уменьшить при избытке.

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.