Это такое попадалово... Кто-то пропарывает пямять, а софта падает в аллокаторе. А поскольку я его делал, все саппорты валятся ко мне, хотя виноват в этом совсем не я, а заказчик. Ой йоо, как же я теперь ненавижу аллокаторы памяти.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Писать надо руководителю о необходимости реорганизации
процесса поддержки аллокатора,
создании багтрекера для выявления типовых причин,
выделении людей на сортировку багов,
создания курсов обучения по использованию аллокатора и т.д.
А лично тебе надо руководить вновь создаваемым отделом.
Здравствуйте, McSeem2, Вы писали:
MS>Это такое попадалово... Кто-то пропарывает пямять, а софта падает в аллокаторе. А поскольку я его делал, все саппорты валятся ко мне, хотя виноват в этом совсем не я, а заказчик. Ой йоо, как же я теперь ненавижу аллокаторы памяти.
У меня дежавю, поиском не нашел, но стойкое ощущение, что ты уже писал об этом и жаловался на свой внутрифирменный аллокатор, который вообще-то очень хорош оказался, но из-за него как пишешь шишки не по делу сыпятся.
Здравствуйте, McSeem2, Вы писали:
MS>Это такое попадалово... Кто-то пропарывает пямять, а софта падает в аллокаторе. А поскольку я его делал, все саппорты валятся ко мне, хотя виноват в этом совсем не я, а заказчик. Ой йоо, как же я теперь ненавижу аллокаторы памяти.
Обобщу — не пишете код (и не советуйте библиотеки), который будет чересчур интенсивно использоваться в вашем проекте. Даже если это не аллокатор, а всего лишь rpc или сериализация, в большинстве случаев испорченная память проявится именно в "популярном" коде и разбираться с этим вам
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, McSeem2, Вы писали:
MS>Это такое попадалово... Кто-то пропарывает пямять, а софта падает в аллокаторе. А поскольку я его делал, все саппорты валятся ко мне, хотя виноват в этом совсем не я, а заказчик. Ой йоо, как же я теперь ненавижу аллокаторы памяти.
В отладочной сборке хорошо бы аллокатору проверять на валиднолсть свое использование.
MS>>Это такое попадалово... Кто-то пропарывает пямять, а софта падает в аллокаторе. А поскольку я его делал, все саппорты валятся ко мне, хотя виноват в этом совсем не я, а заказчик. Ой йоо, как же я теперь ненавижу аллокаторы памяти. M>В отладочной сборке хорошо бы аллокатору проверять на валиднолсть свое использование.
..и портить память обидчику
Как много веселых ребят, и все делают велосипед...
Здравствуйте, minorlogic, Вы писали:
M>В отладочной сборке хорошо бы аллокатору проверять на валиднолсть свое использование.
Понятное дело, есть Debug Info, и проверка на пропарывание, если повезет. Скажем, аллокируют 12 байт, а минимальная гранулярность — 16, значит, 4 байта в конце можно проверить, не напорото ли. Ну, просто забиваем хвост числами Фибоначчи или чем-то другим, а в функции Free — проверяем. Но засада в том, что у нас это очень редкая ситуация. Все любят наш аллокатор из за алайментов, но в хвост уже ничего не запишешь, его просто нету. И пропарывание памяти портит следующую аллокацию, из за чего все вылетает на инфу в буккипере, и падает. А я как всегда виноват. Да, условия таковы, что даже в дебаге нельзя аллокировать больше. Память до сих пор страшный дефицит, особенно на всяких Wii и прочих там PSVita.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, McSeem2, Вы писали:
MS> Да, условия таковы, что даже в дебаге нельзя аллокировать больше. Память до сих пор страшный дефицит, особенно на всяких Wii и прочих там PSVita.
Туго , а то можно было бы CRC еще писать всей служебной информации и т.п.
Здравствуйте, McSeem2, Вы писали:
> Да, условия таковы, что даже в дебаге нельзя аллокировать больше. Память до сих пор страшный дефицит, особенно на всяких Wii и прочих там PSVita.
Кстати, совершенно непонятно почему, неужели даже при нынешних ценах на память ее дорого добавить?
Здравствуйте, Michael7, Вы писали:
M>Кстати, совершенно непонятно почему, неужели даже при нынешних ценах на память ее дорого добавить?
Извиняюсь за много-букфф.
Есть такая аксиома — памяти много не бывает. А уж что трворят эти флешисты на ActionScript-3 — это просто ужас-ужас. Начинаю ненавидеть Flash.
Да, и я сделал другой аллокатор, не такой эффективный, но зато malloc-friendly. Наш первый гениален, но он требует алаймента на 4K, это стандартная фишка в VirtualAlloc или mmap. Но заказчики всегда хотят подсунуть свой sysAlloc, а от этого алайменты сбиваются и начинаются потери памяти. Мы говорим — не надо делать своих сис-аллоков, пользуйтесь нашими и аллокируйте память тоже через наш и все будет оптимально. Но нет, не хотят. А проблема в том, что аллокатор запрашивает большие куски памяти, типа мегабайта или 16 и потом рубает их по мере необходимости, так работают все аллокаторы. Но если в параллель работает еще один аллокатор, то очевидно, что память, захваченная нашим, для другого уже не доступна, хотя место там есть. И это источник главного возмущения. А наш аллокатор очень эффективен, он работает без хэдеров и очень быстро, быстрее чем dlmalloc. Ну и мы в результаьте плюнули на эффективность и сделали так, чтобы большие аллокации, типа больше 512 байт направлялись непосредственно в SysAlloc. А для мелких, котороых из скриптов прет просто гигантскими количествами — блоки по 4K, но от сис-аллока не требуется алаймета, правда тоже с потерями. Да, и гранулярность там — 8 байт, а не 16. Начальник и приятель Миха придумал схему на грани фола, как это все разрулить, причем, с разными хипами, даже вложенными, с мульти-нитными аренами, и прочими балеринами и преферансом. Но определить, кто реально порет память при этом очень не просто. Мы даже пытались прикрутить Valgrind, но оказалось, что это too much hassle в нашем случае.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, McSeem2, Вы писали:
MS>Это такое попадалово... Кто-то пропарывает пямять, а софта падает в аллокаторе. А поскольку я его делал, все саппорты валятся ко мне, хотя виноват в этом совсем не я, а заказчик. Ой йоо, как же я теперь ненавижу аллокаторы памяти.
Это делается так.
1) Заводим переменную препроцессора СистемАллокатор
2) #ifdef СистемАллокатор то используем стандартные malloc/free new/delete по вкусу
(Внутри твоего аллокатора, чтобы не трогать остальные исходники.)
3) натравливаем стандартный механизм поиска ошибок памяти — valgrind или что там у вас в Виндах.
4) Через полчаса приходим со стеком ошибки к виновнику торжества.
5) Когда тот исправит ошибку, отключаем СистемАллокатор и включаем НашАллокатор.
Здравствуйте, alpha21264, Вы писали:
A>1) Заводим переменную препроцессора СистемАллокатор A>2) #ifdef СистемАллокатор то используем стандартные malloc/free new/delete по вкусу A> (Внутри твоего аллокатора, чтобы не трогать остальные исходники.) A>3) натравливаем стандартный механизм поиска ошибок памяти — valgrind или что там у вас в Виндах. A>4) Через полчаса приходим со стеком ошибки к виновнику торжества. A>5) Когда тот исправит ошибку, отключаем СистемАллокатор и включаем НашАллокатор.
К сожалению, не катит. У нас аллокатор многохиповый и многотредовый, что очень сильно меняет паттерн. И еще в нем есть call-back по превышению лимита, когда надо запускать GC. Самое гнусное — когда пропарывание не воспроизводится. Я даже делал отладочную версию на основе голого mmap или VirtualAlloc с guard pages, аллокация в самом конце страницы, а следующшая идет голая. Это по идее самый надежный способ. Тормозит жутко и память жрет как миллион китайцев. Пару раз помогло, но из за сбоя таймингов в основном не работает. В общем, огреб я на свою жопу в полный рост.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, McSeem2, Вы писали:
MS>А наш аллокатор очень эффективен, он работает без хэдеров и очень быстро,
Делит куски памяти по основанию 2? Адрес страницы вычисляет округлением младших бит?
Просто любопытно... бо, судя по всему, придется попробовать нарисовать аналогичное. Хорошо ли показывает себя для std::string?
Я так понимаю, что надо резервировать выровненные области памяти на всяк случай и потом коммитить по мере надобности?
Здравствуйте, McSeem2, Вы писали:
MS>Это такое попадалово... Кто-то пропарывает пямять, а софта падает в аллокаторе. А поскольку я его делал, все саппорты валятся ко мне, хотя виноват в этом совсем не я, а заказчик. Ой йоо, как же я теперь ненавижу аллокаторы памяти.
Здравствуйте, minorlogic, Вы писали:
M>С другими алокаторами сравнивали ? Заточен на определенный сценарий работы ? Интересно в чем была мотивация свой писать
Это была моя ошибка, я повелся на мнение, что аллокатор сильно улучшит систему. Просто до этого нафигачили много кода, не думая об эффективности, типа Array<Array>Array>> ну и т.д. В общем, была гонка. Плюс многотредовость, GC, ref-counters и прочий преферанс с балеринами. Не спас аллокатор, как я и предсказывал. Надо на прикладном уровне грамотно и нежно обращяться с памятью, причем в любом языке. Но некоторые заказчики наш аллокатор очень ценят тем не менее. Моя же позиция в том, что код не должен зависеть от аллокатора, я даже тесселлятор сделал так, что ему пофиг, какой там аллокатор, чисто как proof of concept и пример для подражания. Но как обычно, всем пох. А на функции Realloc, я попотел сильно.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.