powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как искать причины пожирания памяти, если нет утечек?
25 сообщений из 44, страница 1 из 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
25 сообщений из 44, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как искать причины пожирания памяти, если нет утечек?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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