powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как искать причины пожирания памяти, если нет утечек?
44 сообщений из 44, показаны все 2 страниц
Как искать причины пожирания памяти, если нет утечек?
    #38619843
Фотография gbl37004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложение на старте засасывает в себя данные из базы, занимая 80 ГБ ОЗУ и работает 3 дня, после которых сжирает все 128 ГБ ОЗУ. По логам (которые, может быть и кривые) и по заявлениям разраба, приложение хранит всегда строго ограниченное число "записей", выкидывая самые старые при необходимости.

valgrind и valgrind --massif ничего подозрительного для сокращённого набора данных не сообщают. Приложение работает сутками и не жрёт ничего лишнего. На полном наборе данных про "продуктовой" нагрузкой запускать приложение под valgrind нельзя, оно будет запускаться до второго присшествия.

Сначала грешили на фрагментацию памяти в аллокаторе. Запилили отдельный pool-аллокатор, разгрузив системный. Не помогло. Немного изучив устройство аллокатора jemalloc во FreeBSD стало ясно, что разработчики аллокатора сделали очень много для решения подобных проблем и обычный быдлокодер там ничего не сможет просто так дефрагментировать. Например, в jemalloc предусмотрены специальные "обоймы" с кусочками разных размеров - 4, 8, 16... байт, занятость ячеек в "обоймах" хранится в битовой маске. Фрагменты по 8 и 32 байт ложатся в ячейки в своих специальных "обоймах". Занятость ячеек в обойме хранится в битовой маске, которая позволяет быстро освободить-выделить ячейку, быстро найти первую свободную ячейку в ряду занятых ячеек в кассете. То есть игры в виде хаотичного выделения-освобождения кусочков разного размера сводятся внутри аллокатора просто с работой с разными кассетами, которые друг с другом никак не связаны. То есть устроить таким образом "аццкий замес" фрагментов в общем "хипе" нереально.

Основное хранилище приложения - b-tree от гугла. Стали думать про дефрагментацию b-tree, которая вполне реальна. В одном узле b-tree много ключей. Если ты удаляешь один ключ, дерево не может моментально занять памяти меньше. Чтобы в таком дереве весь узел был удалён, нужно удалить все ключи из этого узла или прийти к каком-то условию, когда в дереве сработает алгоритм смерживания узлов... То есть, удаляя-добавляя случайные ключи, можно приводить это дерево в фрагментированное состояние, где в узлах будут дырки. Чтобы такое дерево причесать, понадобится полная перестройка. Админам баз данных должна быть знакома процедура перестройки индекса, который они иногда вынуждены делать - делают они её по вышеописанным причинам - "дырок много становится". Эксперименты на эту тему продолжаются, но пока не дают каких-то интересных результатов. Да, фрагментация есть, но чтобы она была очень существенной, нужно удалять ключи в разных местах и по одному, а в приложении удаления немного не такие - удаляются ключи соседние, пачками.

Обсудите. Посоветуйте.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619862
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сначала уточните.
Пишется все на C++11 и нет никаких new/malloc/delete/free, исключительно только std::shared_ptr<>, std::make_shared<>?
В гугловом b-tree есть фоновая перестройка индексов без блокировки доступа к дереву на время его перестроения, использовали её?
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619867
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gbl37004Стали думать про дефрагментацию b-tree, которая вполне реальна.Ну раз основного подозреваемого уже знаете, то найдите у себя в процессе период когда это дерево можно безболезненно перестроить и ... перестройте его.
Это либо решит вашу проблему, либо покажет что источник проблемы в другом месте.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619870
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gbl37004, думаю что в алгоритме Google-b-tree существует некоторый "гистерезис" пространства.
Тоесть он растёт до определённой нормы скачком (это 128G) а потом останавливается когда 99%
всех обойм аллоцированы. Можно попробовать сломать алгоритм изменив размер обоймы но это
может быть либо очень сложно (размер прописан неявно во многих частях кода) либо это будет
иметь малый КПД. Уменьшили в 50% но реальной пользы получили в 10%.

Можно попробовать пересмотреть UPDATE (если таковый существует). Проверить, мигрирует
ли значение из "обоймы 16" в "обойму 2".
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619871
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин, если у него есть возможность делать deadline то можно дерево серализовать на диск
а потом быстро прогрузить обратно. Это должно иметь эффект уменьшения памяти.

И я не знаю как работает фоновая перестройка но я сильно сомневаюсь что автор сможет
ее осуществить в условиях когда 80 Гб занято и свободно 128 - 80 = 48 Гб.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619918
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с Паше - серьёзно разговаривать? Да вы уху съели
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619923
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gbl37004
Обсудите. Посоветуйте.

Я бы вам посоветовал обратитьсяч за помощью к профессионалам.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619928
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valgrind и valgrind --massif ничего подозрительного для сокращённого набора данных не сообщают. Приложение работает сутками и не жрёт ничего лишнего. На полном наборе данных про "продуктовой" нагрузкой запускать приложение под valgrind нельзя, оно будет запускаться до второго присшествия.


На сокращённом наборе данных объём потребляемой памяти растёт ?
Есщё в каких то сценариях кроме боевого обнаружен рост памяти ?
Потому что уж очень сложно будет отлаживаться на 80-гиговом массиве данных...



Основное хранилище приложения - b-tree от гугла.

Какое конкретно?
На таких больших-то наборах данных лучше было бы b-bree не применять.
Накладуха, знаешь ли ...


Стали думать про дефрагментацию b-tree, которая вполне реальна. В одном узле b-tree много ключей. Если ты удаляешь один

Т.е. ты думаешь, что дефрагментация памяти сжират 128 -80 = 48 гигабайт памяти ?
А код не знаешь (судя по всему)?
Мне кажется, ты не программист, ты -- писатель-фантаст.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619929
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилс Паше - серьёзно разговаривать? Да вы уху съели

А это точно оН ?
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619936
luislom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gbl37004

Сатистика занимаемой памяти формируется не по факту выделения/освобождения виртуальных кусков
памяти, которые осуществляют все *malloc, а по факту пометки ядром физической страницы как используемой.
То есть если вы сделали *malloc( 10000000000000) , но не произвели ни одной записи туда, то ни одной страницы
ядро реально не выделит и не пометит как используемую, а просто сформирует структуру vm_area_struct (на примере Linux )
с виртуальными адресами с vm_start до vm_end, и пихнёт её в список-дерево таких же регионов вирт. памяти текущего процесса.
Если вы выделили сначала кучу кусков разного размера, которые после записи в них сопоставились нескольким разным страницам,
то все страницы будут реально помечены как используемые и отразятся в статистике потребления памяти как занятость памяти
равной сумме их PAGE_SIZE.
Если после будут удалены виртуальные куски памяти, но ни одна из этих страниц не будет освобождена полностью, то ни одна
страница не будет помечена ядром как свободная. И статистика потребления памяти не изменится, несмотря на то, что сделано
было free многим кускам виртуальной памяти. Просто ядро реальную память для сопоставления кускам виртуальной памяти
выделяет всегда страницами. И если с страницей сопоставлен хоть один не освобождённые кусок виртуальной памяти, пусть он
хоть один байт занимает, в статистике отразится занятость целой страницы памяти.
И в догонку
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619942
Фотография gbl37004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivvalgrind и valgrind --massif ничего подозрительного для сокращённого набора данных не сообщают. Приложение работает сутками и не жрёт ничего лишнего. На полном наборе данных про "продуктовой" нагрузкой запускать приложение под valgrind нельзя, оно будет запускаться до второго присшествия.


На сокращённом наборе данных объём потребляемой памяти растёт ?(1)
Есщё в каких то сценариях кроме боевого обнаружен рост памяти ?(2)
Потому что уж очень сложно будет отлаживаться на 80-гиговом массиве данных...(3)



Основное хранилище приложения - b-tree от гугла.

Какое конкретно?(3.5)
На таких больших-то наборах данных лучше было бы b-bree не применять.
Накладуха, знаешь ли ...(4)


Стали думать про дефрагментацию b-tree, которая вполне реальна. В одном узле b-tree много ключей. Если ты удаляешь один

Т.е. ты думаешь, что дефрагментация памяти сжират 128 -80 = 48 гигабайт памяти ?(5)
А код не знаешь (судя по всему)?
Мне кажется, ты не программист, ты -- писатель-фантаст.
(1) нет
(2) других и нет...
(3) +1
(3.5) Сейчас не могу сказать... Может не от гугла, а может это - https://code.google.com/p/cpp-btree/, не знаю точно сейчас
(4) Какая именно накладуха? Фрагментация от удалений-добавлений?
(5) Весь код знать нереально, нужна куча времени на чтение всех исходников проекта. Чтобы прочитать все исходники этого btree и всё уложить у себя в голове только неделя нужна или около того...
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619944
Фотография gbl37004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
luislomgbl37004

Сатистика занимаемой памяти формируется не по факту выделения/освобождения виртуальных кусков
памяти, которые осуществляют все *malloc, а по факту пометки ядром физической страницы как используемой.
То есть если вы сделали *malloc( 10000000000000) , но не произвели ни одной записи туда, то ни одной страницы
ядро реально не выделит и не пометит как используемую, а просто сформирует структуру vm_area_struct (на примере Linux )
с виртуальными адресами с vm_start до vm_end, и пихнёт её в список-дерево таких же регионов вирт. памяти текущего процесса.
Если вы выделили сначала кучу кусков разного размера, которые после записи в них сопоставились нескольким разным страницам,
то все страницы будут реально помечены как используемые и отразятся в статистике потребления памяти как занятость памяти
равной сумме их PAGE_SIZE.
Если после будут удалены виртуальные куски памяти, но ни одна из этих страниц не будет освобождена полностью, то ни одна
страница не будет помечена ядром как свободная. И статистика потребления памяти не изменится, несмотря на то, что сделано
было free многим кускам виртуальной памяти. Просто ядро реальную память для сопоставления кускам виртуальной памяти
выделяет всегда страницами. И если с страницей сопоставлен хоть один не освобождённые кусок виртуальной памяти, пусть он
хоть один байт занимает, в статистике отразится занятость целой страницы памяти.
И в догонку
Вы пишете о статистике работы менеджера памяти ядра, а я пишу о статистике аллокатора уровня libc.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619945
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gbl37004Чтобы прочитать все исходники этого btree
Паша, напиши свою реализацию
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38619946
Фотография gbl37004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytongbl37004, думаю что в алгоритме Google-b-tree существует некоторый "гистерезис" пространства.
Тоесть он растёт до определённой нормы скачком (это 128G) а потом останавливается когда 99%
всех обойм аллоцированы. Можно попробовать сломать алгоритм изменив размер обоймы но это
может быть либо очень сложно (размер прописан неявно во многих частях кода) либо это будет
иметь малый КПД. Уменьшили в 50% но реальной пользы получили в 10%.

Можно попробовать пересмотреть UPDATE (если таковый существует). Проверить, мигрирует
ли значение из "обоймы 16" в "обойму 2".
"обоймы" не относятся к алгоритмам контейнера b-tree, это понятие из jemalloc, аллокатора libc freebsd.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620026
luislom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gbl37004 я пишу о статистике аллокатора уровня libc.

Троль? Какая ещё статистиа уровня libc? *malloc-и получают виртуальные регионы от ядра,
и, вместе с динамикой их использования, определяют статистику потребления физической памяти в ОС.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620098
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gbl37004Стали думать про дефрагментацию b-tree, которая вполне реальна. В одном узле b-tree много ключей. Если ты удаляешь один ключ, дерево не может моментально занять памяти меньше.
Это не только на память влияет, но и на скорость поиска, т.к. дерево вырождается при интенсивном изменении.
Различные реализации одного и того же бинарного дерева

(а) идеальное сбалансированное дерево
далее его состояния после изменений, вплоть до наихудшего.
Взято тут
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620102
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, т.к. дерево вырождается при интенсивном изменении.
B-дерево не может вырождаться, см определение
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620114
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima T, т.к. дерево вырождается при интенсивном изменении.
B-дерево не может вырождаться, см определение
Посмотрел, не про то дерево написал.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620134
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще пишут
http://ru.wikipedia.org/wiki/B-дерево Во всех случаях полезное использование пространства вторичной памяти составляет свыше 50 %. С ростом степени полезного использования памяти не происходит снижения качества обслуживания.
т.е. нормально что при интенсивном изменении до 2х раз может вырасти. Но
http://shpargalum.ru/shpora-gos-povtas/strukturyi-i-algoritmyi-obrabotki-dannyix/b-derevya.-osobennosti-predstavleniya-b-derevev.html ... Тем самым, все сверхбольшое дерево поиска разбивается на ряд страниц и чтение вершин с диска выполняется постранично. Это позволяет существенно уменьшить количество обращений к внешней памяти.
Если так, то просто не обращать внимания, похоже памяти у тебя много и поэтому лишнее в своп не загоняется. Для теста можно попробовать параллельно запустить прогу которая просто возьмет у ОС половину физически имеющейся памяти, заполнит нулями и завершится, это заставит основную прогу свопиться, если после этого прога обратно из свопа все не возьмет - значит ей не надо.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620240
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
luislomgbl37004 я пишу о статистике аллокатора уровня libc.

Троль? Какая ещё статистиа уровня libc? *malloc-и получают виртуальные регионы от ядра,
и, вместе с динамикой их использования, определяют статистику потребления физической памяти в ОС.
Самтролль? Ядро вам выдаёт только целые страницы.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620241
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tgbl37004Стали думать про дефрагментацию b-tree, которая вполне реальна. В одном узле b-tree много ключей. Если ты удаляешь один ключ, дерево не может моментально занять памяти меньше.
Это не только на память влияет, но и на скорость поиска, т.к. дерево вырождается при интенсивном изменении.
Различные реализации одного и того же бинарного дерева

(а) идеальное сбалансированное дерево
далее его состояния после изменений, вплоть до наихудшего.
Взято тут
Похоже, но немного не то. Это у вас не b-tree, а "обычное" бинарное, рассматривается проблема разбалансировки. У меня другое - дерево b-tree и проблема другая - "дырки в нодах".
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620250
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gbl37004, дай пожалуйста точную ссылку на гитхаб где находится проект Google b-tree.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620252
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боевыеПохоже, но немного не то. Это у вас не b-tree, а "обычное" бинарное, рассматривается проблема разбалансировки. У меня другое - дерево b-tree и проблема другая - "дырки в нодах".
Да, я уже понял что не то.
"дырки в нодах" это особенность алгоритма построения b-tree, своего рода плата памятью за отсутствие разбалансировки при интенсивном изменении.
Т.е. это нормально что он память отжирает в процессе работы.

В принципе неважно сколько занято реальной памяти, важно как часто страницы уходят в своп и читаются оттуда. Как пишут: другая особенность b-tree в том что он должен минимизировать использование свопа. Этот параметр надо замерять. Если не свопится, то значит прога работает эффективно.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620262
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(3.5) Сейчас не могу сказать... Может не от гугла, а может это - https://code.google.com/p/cpp-btree/, не знаю точно сейчас

А ты там при как?
Нихрена не знаешь, но хочешь все исправить и делаешь глубоко идущие выводы..

(4) Какая именно накладуха?

само дерево.


Фрагментация от удалений-добавлений?
(5) Весь код знать нереально, нужна куча времени на чтение всех исходников проекта. Чтобы прочитать все исходники этого btree и всё уложить у себя в голове только неделя нужна или около того...[/quot]

Неделя — это немного.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620356
luislom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боевыеСамтролль? Ядро вам выдаёт только целые страницы.

Да, физическую память помечает как используемую именно страницами,
перемещая указатель на неё в дескрипторы в pgd/pmd/pte, которые
индексируются битами виртуального адреса. Если имеете что против, обоснуйте.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620357
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
luislomбоевыеСамтролль? Ядро вам выдаёт только целые страницы.

Да, физическую память помечает как используемую именно страницами,
перемещая указатель на неё в дескрипторы в pgd/pmd/pte, которые
индексируются битами виртуального адреса. Если имеете что против, обоснуйте.
Я ниасилил, при чём тут эта тема.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620358
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv(3.5) Сейчас не могу сказать... Может не от гугла, а может это - https://code.google.com/p/cpp-btree/, не знаю точно сейчас

А ты там при как?
Нихрена не знаешь, но хочешь все исправить и делаешь глубоко идущие выводы..

(4) Какая именно накладуха?

само дерево.


Фрагментация от удалений-добавлений?
(5) Весь код знать нереально, нужна куча времени на чтение всех исходников проекта. Чтобы прочитать все исходники этого btree и всё уложить у себя в голове только неделя нужна или около того...

Неделя — это немного.[/quot]
Я сказал - "сейчас", т.е. на момент написания поста.
Ну кому много, кому не много...
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620363
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gbl37004по заявлениям разраба, приложение хранит всегда строго ограниченное число "записей", выкидывая самые старые при необходимости.
Еще мысли вслух. Я не знаю как он ищет самые старые записи. Но b-tree явно не оптимизирована для выбрасывания
старых записей. Возможно в этой архитектуре еще много косяков куда можно приложить руку.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620387
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 21.04.2014 14:27, боевые wrote:

> Я ниасилил, при чём тут эта тема.

Намекают на то, что с приложением вашим всё в порядке,
память не течёт, вы просто неправильно используете средства диагностики.
А приложение (видимо) просто в таком варианте не влезает в память.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620390
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 21.04.2014 14:32, mayton wrote:

> Еще мысли вслух. Я не знаю как он ищет самые старые записи. Но b-tree
> явно не оптимизирована для выбрасывания
> старых записей. Возможно в этой архитектуре еще много косяков куда можно
> приложить руку.

Что в дереве хранится ?
Какие операции нужны для элементов, хранящихся в дереве ?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620404
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 21.04.2014 14:27, боевые wrote:

> Я ниасилил, при чём тут эта тема.

Намекают на то, что с приложением вашим всё в порядке,
память не течёт, вы просто неправильно используете средства диагностики.
А приложение (видимо) просто в таком варианте не влезает в память.

Я не понял аргументов про неправильность использования средств диагностики.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620408
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 21.04.2014 14:32, mayton wrote:

> Еще мысли вслух. Я не знаю как он ищет самые старые записи. Но b-tree
> явно не оптимизирована для выбрасывания
> старых записей. Возможно в этой архитектуре еще много косяков куда можно
> приложить руку.

Что в дереве хранится ?
Какие операции нужны для элементов, хранящихся в дереве ?


Давайте это не будем обсуждать, тут проблем нет.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620422
luislom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боевыеЯ ниасилил, при чём тут эта тема.

авторПриложение на старте засасывает в себя данные из базы, занимая 80 ГБ ОЗУ и работает 3 дня, после которых сжирает все 128 ГБ ОЗУ. По логам (которые, может быть и кривые) и по заявлениям разраба, приложение хранит всегда строго ограниченное число "записей", выкидывая самые старые при необходимости.


Вот эти 128 ГБ в статистике ОС, и не больше 80 ГБ по статистике приложения-это то,
что приложение считает по *malloc/free, а ОС по выделенным для размещения кусков
виртуальной памяти процессу физическим страницам. Если приложение имеет 3 региона, полученные *malloc, по 100B,
то она покажет занятость памяти в 300B. Но, если эти три региона будут распологаться на трёх разных физических
страницах, то ОС покажет занятость в 3*PAGE_SIZE B, 12KB на linux. Одна из причин такой ситуации, в постоянных *malloc
и free кусков памяти разного размера в хаотичном хронологическом порядке. Излишняя увлечённость std::string, std::hash_map и пр.
Как следствие-пишите свою B-tree. Если изначально планируется, что оно будет занимать определённый объём памяти,
то можно запросить этот объём один раз при создании, разбить на блоки одинакового размера и вести некий стек
свободных блоков для выделения/освобождения. Узлы B-tree будут представлять собой списки этих блоков.
Перемещениё ключей будет реализовано как обмен указателями между блоками. Выделение/освобождение
блоков-пихаем указатели на них в стек свободных блоков. Таким образом, дерево будет всегда занимать определённую область
виртуальной памяти и фиксированный набор физ. страниц для размещения.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620425
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
luislomбоевыеЯ ниасилил, при чём тут эта тема.

авторПриложение на старте засасывает в себя данные из базы, занимая 80 ГБ ОЗУ и работает 3 дня, после которых сжирает все 128 ГБ ОЗУ. По логам (которые, может быть и кривые) и по заявлениям разраба, приложение хранит всегда строго ограниченное число "записей", выкидывая самые старые при необходимости.


Вот эти 128 ГБ в статистике ОС, и не больше 80 ГБ по статистике приложения-это то,
что приложение считает по *malloc/free, а ОС по выделенным для размещения кусков
виртуальной памяти процессу физическим страницам. Если приложение имеет 3 региона, полученные *malloc, по 100B,
то она покажет занятость памяти в 300B. Но, если эти три региона будут распологаться на трёх разных физических
страницах, то ОС покажет занятость в 3*PAGE_SIZE B, 12KB на linux. Одна из причин такой ситуации, в постоянных *malloc
и free кусков памяти разного размера в хаотичном хронологическом порядке. Излишняя увлечённость std::string, std::hash_map и пр.
Как следствие-пишите свою B-tree. Если изначально планируется, что оно будет занимать определённый объём памяти,
то можно запросить этот объём один раз при создании, разбить на блоки одинакового размера и вести некий стек
свободных блоков для выделения/освобождения. Узлы B-tree будут представлять собой списки этих блоков.
Перемещениё ключей будет реализовано как обмен указателями между блоками. Выделение/освобождение
блоков-пихаем указатели на них в стек свободных блоков. Таким образом, дерево будет всегда занимать определённую область
виртуальной памяти и фиксированный набор физ. страниц для размещения.
Это всё понятно. Я только не понимаю, при чём тут всё это?
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620430
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЧто в дереве хранится ?
Какие операции нужны для элементов, хранящихся в дереве ?

Это не ко мне вопрос. Да и вообще тема обширная. И одними аллокаторами тут не
станцуешь.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620431
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
luislomбоевыеЯ ниасилил, при чём тут эта тема.

авторПриложение на старте засасывает в себя данные из базы, занимая 80 ГБ ОЗУ и работает 3 дня, после которых сжирает все 128 ГБ ОЗУ. По логам (которые, может быть и кривые) и по заявлениям разраба, приложение хранит всегда строго ограниченное число "записей", выкидывая самые старые при необходимости.


Вот эти 128 ГБ в статистике ОС, и не больше 80 ГБ по статистике приложения-это то,
что приложение считает по *malloc/free, а ОС по выделенным для размещения кусков
виртуальной памяти процессу физическим страницам. Если приложение имеет 3 региона, полученные *malloc, по 100B,
то она покажет занятость памяти в 300B. Но, если эти три региона будут распологаться на трёх разных физических
страницах, то ОС покажет занятость в 3*PAGE_SIZE B, 12KB на linux. Одна из причин такой ситуации, в постоянных *malloc
и free кусков памяти разного размера в хаотичном хронологическом порядке. Излишняя увлечённость std::string, std::hash_map и пр.
Как следствие-пишите свою B-tree. Если изначально планируется, что оно будет занимать определённый объём памяти,
то можно запросить этот объём один раз при создании, разбить на блоки одинакового размера и вести некий стек
свободных блоков для выделения/освобождения. Узлы B-tree будут представлять собой списки этих блоков.
Перемещениё ключей будет реализовано как обмен указателями между блоками. Выделение/освобождение
блоков-пихаем указатели на них в стек свободных блоков. Таким образом, дерево будет всегда занимать определённую область
виртуальной памяти и фиксированный набор физ. страниц для размещения.
Когда я вызываю malloc, управление передаётся не в ядро, а на библиотеку. А что там происходит вы как будто забываете. Вы знаете что происходит в этой библиотеке в случае применения там аллокатора jemalloc при выделении множества мелких объектов разной величины в хаотическом хронологическом порядке?

Мы до обсуждения страниц и ОС ещё не дошли, у нас ещё до этого куча всего интересного при выделении памяти происходит.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620440
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблемы-то вообще в чем?

Утечек памяти нет, просто алгоритм требует до 100% избытка памяти для работы. http://shpargalum.ru/shpora-gos-povtas/strukturyi-i-algoritmyi-obrabotki-dannyix/b-derevya.-osobennosti-predstavleniya-b-derevev.html Б-дерево порядка m со страничной организацией - это структура данных, удовлетворяющая следующим условиям:

весь набор из n элементов разбивается на отдельные страницы, причем каждая страница может содержать от m до 2m вершин , за исключением корневой страницы, для которой число вершин может изменяться от 1 до 2m
...
т.е. при изменении дерева оно может занять памяти до 2х раз больше при том же количестве элементов (в наихудшем варианте когда каждая страница содержит m вершин) т.к. алгоритм не обещает немедленного освобождения памяти удаленных из дерева вершин. Память высвобождается при удалении страницы, а страница удаляется если на ней осталось <m вершин.

Вывод: на низком уровне нечего оптимизировать. Только перестроение дерева освободит память. Надо ли это в твоем случае - решай сам, это по количеству свопящихся страниц видно.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620456
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПроблемы-то вообще в чем?

Утечек памяти нет, просто алгоритм требует до 100% избытка памяти для работы. http://shpargalum.ru/shpora-gos-povtas/strukturyi-i-algoritmyi-obrabotki-dannyix/b-derevya.-osobennosti-predstavleniya-b-derevev.html Б-дерево порядка m со страничной организацией - это структура данных, удовлетворяющая следующим условиям:

весь набор из n элементов разбивается на отдельные страницы, причем каждая страница может содержать от m до 2m вершин , за исключением корневой страницы, для которой число вершин может изменяться от 1 до 2m
...
т.е. при изменении дерева оно может занять памяти до 2х раз больше при том же количестве элементов (в наихудшем варианте когда каждая страница содержит m вершин) т.к. алгоритм не обещает немедленного освобождения памяти удаленных из дерева вершин. Память высвобождается при удалении страницы, а страница удаляется если на ней осталось <m вершин.

Вывод: на низком уровне нечего оптимизировать. Только перестроение дерева освободит память. Надо ли это в твоем случае - решай сам, это по количеству свопящихся страниц видно.
Это ясно. Просто искусственный эксперимент пока не дал 50% прироста потребления памяти.
Эксперимент:
1. Было построено дерево на 200 млн ключей с нуля. Заняло 11 гигов ОЗУ.
2. Поток добавления продолжал работать (с блокировками всё в порядке), но при превышении лимита кол-ва ключей в дереве, вызывалась процедура удаления случайных 33....1000 ключей последовательно (.erase(iterator_from, iterator_until)).
3. Получилось таким образом отожрать лишних 100 мб памяти, далее всё стабилизировалось.
4. Возможно, надо удалять хитрее и агрессивнее, не диапазонами, а единичными ключами и т.п., незнаю, но в сабжевом приложении ключи удаляются пачками последовательных ключей сотнями штук. Мне кажется, чем больше последовательных ключей в пачке при удалении, тем дереву лучше, меньше разрозненных дырок, поэтому я уменьшал число ключей в пачке, чтобы сильнее спровоцировать "эффект разряжения".

Короче, 100 мегабайт для 11 гигов - это не 50% )
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620462
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, откопали один контейнер, откуда никогда не удалялись данные, но разраб говорил, что это небольшой грех, сей контейнер всё равно не такой жирный, чтобы влиять на общую картину. Короче, возможно и такой, на самом деле... Щас запустим без контейнера этого, позырим.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620468
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боевыеразраб говорил, что это небольшой грех
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620472
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боевые,

а чё , статистика заполнения узлов - недоступна?
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620474
luislom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боевыеКогда я вызываю malloc, управление передаётся не в ядро, а на библиотеку. А что там происходит вы как будто забываете. Вы знаете что происходит в этой библиотеке в случае применения там аллокатора jemalloc при выделении множества мелких объектов разной величины в хаотическом хронологическом порядке?

Мы до обсуждения страниц и ОС ещё не дошли, у нас ещё до этого куча всего интересного при выделении памяти происходит.

Попытаюсь так. Вы запросили *malloc-ом много кусков памяти в сумме набравших 100 Gb. Записали в них данные.
Потом ещё 10 Mb того же самого, потом в пределах первых 100 GB освободили в шахматном порядке, половину кусков.
Потом запросили кусков памяти меньшего количества, но большего размера, чем преедыдущие, и так далее.
Будь у Вас хоть malloc, хоть jemalloc, хоть tmalloc (рукомендую для линукса его вместо jemalloc) всё равно такая практика
работы с памятью приведёт к занятости большего числа страниц, чем суммарный размер всех выделенных в текущий
момент регионов , а значит к иной статистике потребления памяти, чем статистика самого приложения.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620494
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боевые4. Возможно, надо удалять хитрее и агрессивнее, не диапазонами, а единичными ключами и т.п., незнаю, но в сабжевом приложении ключи удаляются пачками последовательных ключей сотнями штук. Мне кажется, чем больше последовательных ключей в пачке при удалении, тем дереву лучше, меньше разрозненных дырок, поэтому я уменьшал число ключей в пачке, чтобы сильнее спровоцировать "эффект разряжения".
Удаляешь ты последовательно, а вставляешь? Новые ключи добавляются в имеющиеся страницы, которые при заполнении (как я понимаю) делятся на две с заполнением m и m+1. Вот тебе источник полупустых страниц. В идеале (для максимального использования памяти) надо удалять по немного с каждой полностью заполненной страницы.
...
Рейтинг: 0 / 0
Как искать причины пожирания памяти, если нет утечек?
    #38620529
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боевые поэтому я уменьшал число ключей в пачке, чтобы сильнее спровоцировать "эффект разряжения".
Чем меньше пачка, тем чаще дерево перестраивать при добавлении и удалении, что не быстро. Т.е. чем больше ключей в пачке тем быстрее работает.

PS Уже несколько раз написал: забей ты на занимаемый объем памяти, он ни о чем не говорит, не надо тебе его оптимизировать, смотри на своп, если это виндовс, то параметр "Ошибок страниц" в диспетчере задач.
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как искать причины пожирания памяти, если нет утечек?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]