Здравствуйте, Tonal-, Вы писали:
T>Правда существует вероятность перерасхода памяти ввиду очень неплотного заполнения, но это в принципе можно свести к минимуму каким-нибудь хитрым алгоритмом выделения объектов на используемых блоках (например выделять объекты на наиболее заполненных блоках).
Спасибо за идею буду пробовать.
Я видел у аналога (и это работает) выделяют один раз память и используют не списки а массивы.
> 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Аноним, Вы писали:
А>После 5 суток работы в логах появляються сообщения что не возможно выделить память. А>После перезагрузки все нормально. А>На 98% уверен что память не течет так как проверял код много раз именно на мемору лиик.
Здравствуйте, 8bit, Вы писали:
8>А сколько не может выделить памяти проверяли?
512 байт мне из логов только номер строки где была ошибка известно.
8>Вот, кстати, топик с похожей проблемой. 8>http://www.rsdn.ru/forum/message/2489003.1.aspx
Большое спасибо за ссылку
я тоже сидел на vs6, сейчас тестирую на vs2005 sp1
моя программа активно использует — memset, memcpy, sprintf, вычисление указателей и strcpy
еще хочу добавить что strtok зло
если есть необходимость лучше сразу писать свой аналог strtok
Здравствуйте, 8bit, Вы писали:
8>Подскажите, какие есть эффективные быстрые менеджеры памяти (С/С++)? 8>Знаю про SmartHeap от microquill и про Doug Lea's malloc. 8>Может кто своей реализацией поделится ?
Смотря что тебе нужно. Варианта 2 — либо аллокатор общего назначения как drop-in замена стандартному, что бы просто ускорить работу/уменьшить фрагментацию, либо аллокатор под какую-то конкрутную ситуацию.
В первом варианте так же возможны вариации — без поддержки многопоточности вообще, с базовой поддержкой, либо с эффективной поддержкой многопоточности.
Если тебе нужен аллокатор под конкретную ситуацию (тут я имею в виду в основном, что надо выделять блоки фиксированного размера под объекты одного типа), то тут нельзя сравниться с headerless fixed-size аллокаторами. Во-первых, они headerless, т.е. сами не используют дополнительную память на единицу выделения, т.е. из блока 4кб такой аллокатор может выделить ровно 1кб блоков по 4 байта. Во-вторых, они могут выделять память только одного размера, а как следствие нулевая фрагментация и любое выделение/освобождение это O(1).
Основная идея изложена в FixedAllocator в библиотеке Loki: http://loki-lib.sourceforge.net/
(только поддержка многопоточности там хромает)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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 байта на каждый поток.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Vain, Вы писали:
А>Подскажите пожалуйста позволит ли Thread malloc или nedmalloc бороться с фрагментацией памяти? Вообще оправданно ли использование менеджера памяти для борьбы с фрагментацией памяти или проще хранить данные в статических массивах? В моем случаи макимум требуеться 10-12mb памяти.
Я правильно понимаю, что у вас серверное приложение? Клиенты через сеть к нему ходят и оно через 5 дней начинает помирать. Так? Я бы написал эмулятор клиента какой-нибудь простецкий, чтобы он загружал сервер под завязку работой, это, возможно, сократит время наработки на отказ с 5 дней до чего-то разумного. Еще бы сделал логирование всех запросов эмулятора к серверу чтобы можно было воспроизвести последовательность действий которая сервер убивает. А потом бы уже вскяие аллокаторы стал пробовать.
Алексей
Re[5]: Менеджеры памяти
От:
Аноним
Дата:
23.01.08 13:28
Оценка:
Здравствуйте, alsemm, Вы писали:
A>Я правильно понимаю, что у вас серверное приложение? Клиенты через сеть к нему ходят и оно через 5 дней начинает помирать. Так? Я бы написал эмулятор клиента какой-нибудь
приложение серверное
тестируем создавая нагрузку эквивалентную нескольким неделям работы
логировать у клиента не возможно так как: что предшествует ошибки не известно а если логировать все то места на диски не хватит/клиент не согласиться (у них более миллиона обращений в сутки а каждое обращение даст в логи строк 200)
в любом случаи спасибо за идею
в лог можно писать не нормальное сообщение а только номер строки которая отработала
можно подменить malloc/free на свои и если они отработали с ошибкой сохранять доп информацию
задумался какие части когда вызываються часто но не когда идет обращение клиента (возможно проблемма в них так как под имитацией нагрузки они не тестируються а вызываються с некоторой эпизодичностью)
8>Подскажите, какие есть эффективные быстрые менеджеры памяти (С/С++)? 8>Знаю про SmartHeap от microquill и про Doug Lea's malloc.
8>Может кто своей реализацией поделится ?
Что бы менеджер памяти работал на "файле".
Имеем файл, например 100 мб, и по сути он "пул" памяти на 100мб.
При нехватке, "пул" можно увеличить, или уменьшить при избытке.