Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
Приложение на старте засасывает в себя данные из базы, занимая 80 ГБ ОЗУ и работает 3 дня, после которых сжирает все 128 ГБ ОЗУ. По логам (которые, может быть и кривые) и по заявлениям разраба, приложение хранит всегда строго ограниченное число "записей", выкидывая самые старые при необходимости. valgrind и valgrind --massif ничего подозрительного для сокращённого набора данных не сообщают. Приложение работает сутками и не жрёт ничего лишнего. На полном наборе данных про "продуктовой" нагрузкой запускать приложение под valgrind нельзя, оно будет запускаться до второго присшествия. Сначала грешили на фрагментацию памяти в аллокаторе. Запилили отдельный pool-аллокатор, разгрузив системный. Не помогло. Немного изучив устройство аллокатора jemalloc во FreeBSD стало ясно, что разработчики аллокатора сделали очень много для решения подобных проблем и обычный быдлокодер там ничего не сможет просто так дефрагментировать. Например, в jemalloc предусмотрены специальные "обоймы" с кусочками разных размеров - 4, 8, 16... байт, занятость ячеек в "обоймах" хранится в битовой маске. Фрагменты по 8 и 32 байт ложатся в ячейки в своих специальных "обоймах". Занятость ячеек в обойме хранится в битовой маске, которая позволяет быстро освободить-выделить ячейку, быстро найти первую свободную ячейку в ряду занятых ячеек в кассете. То есть игры в виде хаотичного выделения-освобождения кусочков разного размера сводятся внутри аллокатора просто с работой с разными кассетами, которые друг с другом никак не связаны. То есть устроить таким образом "аццкий замес" фрагментов в общем "хипе" нереально. Основное хранилище приложения - b-tree от гугла. Стали думать про дефрагментацию b-tree, которая вполне реальна. В одном узле b-tree много ключей. Если ты удаляешь один ключ, дерево не может моментально занять памяти меньше. Чтобы в таком дереве весь узел был удалён, нужно удалить все ключи из этого узла или прийти к каком-то условию, когда в дереве сработает алгоритм смерживания узлов... То есть, удаляя-добавляя случайные ключи, можно приводить это дерево в фрагментированное состояние, где в узлах будут дырки. Чтобы такое дерево причесать, понадобится полная перестройка. Админам баз данных должна быть знакома процедура перестройки индекса, который они иногда вынуждены делать - делают они её по вышеописанным причинам - "дырок много становится". Эксперименты на эту тему продолжаются, но пока не дают каких-то интересных результатов. Да, фрагментация есть, но чтобы она была очень существенной, нужно удалять ключи в разных местах и по одному, а в приложении удаления немного не такие - удаляются ключи соседние, пачками. Обсудите. Посоветуйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 18:53 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
Сначала уточните. Пишется все на C++11 и нет никаких new/malloc/delete/free, исключительно только std::shared_ptr<>, std::make_shared<>? В гугловом b-tree есть фоновая перестройка индексов без блокировки доступа к дереву на время его перестроения, использовали её? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 20:10 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
gbl37004Стали думать про дефрагментацию b-tree, которая вполне реальна.Ну раз основного подозреваемого уже знаете, то найдите у себя в процессе период когда это дерево можно безболезненно перестроить и ... перестройте его. Это либо решит вашу проблему, либо покажет что источник проблемы в другом месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 20:24 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
gbl37004, думаю что в алгоритме Google-b-tree существует некоторый "гистерезис" пространства. Тоесть он растёт до определённой нормы скачком (это 128G) а потом останавливается когда 99% всех обойм аллоцированы. Можно попробовать сломать алгоритм изменив размер обоймы но это может быть либо очень сложно (размер прописан неявно во многих частях кода) либо это будет иметь малый КПД. Уменьшили в 50% но реальной пользы получили в 10%. Можно попробовать пересмотреть UPDATE (если таковый существует). Проверить, мигрирует ли значение из "обоймы 16" в "обойму 2". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 20:40 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
Вася Уткин, если у него есть возможность делать deadline то можно дерево серализовать на диск а потом быстро прогрузить обратно. Это должно иметь эффект уменьшения памяти. И я не знаю как работает фоновая перестройка но я сильно сомневаюсь что автор сможет ее осуществить в условиях когда 80 Гб занято и свободно 128 - 80 = 48 Гб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 20:43 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
с Паше - серьёзно разговаривать? Да вы уху съели ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 22:32 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
gbl37004 Обсудите. Посоветуйте. Я бы вам посоветовал обратитьсяч за помощью к профессионалам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 22:51 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
valgrind и valgrind --massif ничего подозрительного для сокращённого набора данных не сообщают. Приложение работает сутками и не жрёт ничего лишнего. На полном наборе данных про "продуктовой" нагрузкой запускать приложение под valgrind нельзя, оно будет запускаться до второго присшествия. На сокращённом наборе данных объём потребляемой памяти растёт ? Есщё в каких то сценариях кроме боевого обнаружен рост памяти ? Потому что уж очень сложно будет отлаживаться на 80-гиговом массиве данных... Основное хранилище приложения - b-tree от гугла. Какое конкретно? На таких больших-то наборах данных лучше было бы b-bree не применять. Накладуха, знаешь ли ... Стали думать про дефрагментацию b-tree, которая вполне реальна. В одном узле b-tree много ключей. Если ты удаляешь один Т.е. ты думаешь, что дефрагментация памяти сжират 128 -80 = 48 гигабайт памяти ? А код не знаешь (судя по всему)? Мне кажется, ты не программист, ты -- писатель-фантаст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 22:58 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
Изопропилс Паше - серьёзно разговаривать? Да вы уху съели А это точно оН ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 22:58 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
gbl37004 Сатистика занимаемой памяти формируется не по факту выделения/освобождения виртуальных кусков памяти, которые осуществляют все *malloc, а по факту пометки ядром физической страницы как используемой. То есть если вы сделали *malloc( 10000000000000) , но не произвели ни одной записи туда, то ни одной страницы ядро реально не выделит и не пометит как используемую, а просто сформирует структуру vm_area_struct (на примере Linux ) с виртуальными адресами с vm_start до vm_end, и пихнёт её в список-дерево таких же регионов вирт. памяти текущего процесса. Если вы выделили сначала кучу кусков разного размера, которые после записи в них сопоставились нескольким разным страницам, то все страницы будут реально помечены как используемые и отразятся в статистике потребления памяти как занятость памяти равной сумме их PAGE_SIZE. Если после будут удалены виртуальные куски памяти, но ни одна из этих страниц не будет освобождена полностью, то ни одна страница не будет помечена ядром как свободная. И статистика потребления памяти не изменится, несмотря на то, что сделано было free многим кускам виртуальной памяти. Просто ядро реальную память для сопоставления кускам виртуальной памяти выделяет всегда страницами. И если с страницей сопоставлен хоть один не освобождённые кусок виртуальной памяти, пусть он хоть один байт занимает, в статистике отразится занятость целой страницы памяти. И в догонку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 23:45 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
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 и всё уложить у себя в голове только неделя нужна или около того... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 00:19 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
luislomgbl37004 Сатистика занимаемой памяти формируется не по факту выделения/освобождения виртуальных кусков памяти, которые осуществляют все *malloc, а по факту пометки ядром физической страницы как используемой. То есть если вы сделали *malloc( 10000000000000) , но не произвели ни одной записи туда, то ни одной страницы ядро реально не выделит и не пометит как используемую, а просто сформирует структуру vm_area_struct (на примере Linux ) с виртуальными адресами с vm_start до vm_end, и пихнёт её в список-дерево таких же регионов вирт. памяти текущего процесса. Если вы выделили сначала кучу кусков разного размера, которые после записи в них сопоставились нескольким разным страницам, то все страницы будут реально помечены как используемые и отразятся в статистике потребления памяти как занятость памяти равной сумме их PAGE_SIZE. Если после будут удалены виртуальные куски памяти, но ни одна из этих страниц не будет освобождена полностью, то ни одна страница не будет помечена ядром как свободная. И статистика потребления памяти не изменится, несмотря на то, что сделано было free многим кускам виртуальной памяти. Просто ядро реальную память для сопоставления кускам виртуальной памяти выделяет всегда страницами. И если с страницей сопоставлен хоть один не освобождённые кусок виртуальной памяти, пусть он хоть один байт занимает, в статистике отразится занятость целой страницы памяти. И в догонку Вы пишете о статистике работы менеджера памяти ядра, а я пишу о статистике аллокатора уровня libc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 00:20 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
gbl37004Чтобы прочитать все исходники этого btree Паша, напиши свою реализацию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 00:20 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
maytongbl37004, думаю что в алгоритме Google-b-tree существует некоторый "гистерезис" пространства. Тоесть он растёт до определённой нормы скачком (это 128G) а потом останавливается когда 99% всех обойм аллоцированы. Можно попробовать сломать алгоритм изменив размер обоймы но это может быть либо очень сложно (размер прописан неявно во многих частях кода) либо это будет иметь малый КПД. Уменьшили в 50% но реальной пользы получили в 10%. Можно попробовать пересмотреть UPDATE (если таковый существует). Проверить, мигрирует ли значение из "обоймы 16" в "обойму 2". "обоймы" не относятся к алгоритмам контейнера b-tree, это понятие из jemalloc, аллокатора libc freebsd. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 00:21 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
gbl37004 я пишу о статистике аллокатора уровня libc. Троль? Какая ещё статистиа уровня libc? *malloc-и получают виртуальные регионы от ядра, и, вместе с динамикой их использования, определяют статистику потребления физической памяти в ОС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 08:47 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
gbl37004Стали думать про дефрагментацию b-tree, которая вполне реальна. В одном узле b-tree много ключей. Если ты удаляешь один ключ, дерево не может моментально занять памяти меньше. Это не только на память влияет, но и на скорость поиска, т.к. дерево вырождается при интенсивном изменении. Различные реализации одного и того же бинарного дерева (а) идеальное сбалансированное дерево далее его состояния после изменений, вплоть до наихудшего. Взято тут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 10:06 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
Dima T, т.к. дерево вырождается при интенсивном изменении. B-дерево не может вырождаться, см определение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 10:11 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
ИзопропилDima T, т.к. дерево вырождается при интенсивном изменении. B-дерево не может вырождаться, см определение Посмотрел, не про то дерево написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 10:23 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
Еще пишут 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 ... Тем самым, все сверхбольшое дерево поиска разбивается на ряд страниц и чтение вершин с диска выполняется постранично. Это позволяет существенно уменьшить количество обращений к внешней памяти. Если так, то просто не обращать внимания, похоже памяти у тебя много и поэтому лишнее в своп не загоняется. Для теста можно попробовать параллельно запустить прогу которая просто возьмет у ОС половину физически имеющейся памяти, заполнит нулями и завершится, это заставит основную прогу свопиться, если после этого прога обратно из свопа все не возьмет - значит ей не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 10:36 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
luislomgbl37004 я пишу о статистике аллокатора уровня libc. Троль? Какая ещё статистиа уровня libc? *malloc-и получают виртуальные регионы от ядра, и, вместе с динамикой их использования, определяют статистику потребления физической памяти в ОС. Самтролль? Ядро вам выдаёт только целые страницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 11:59 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
Dima Tgbl37004Стали думать про дефрагментацию b-tree, которая вполне реальна. В одном узле b-tree много ключей. Если ты удаляешь один ключ, дерево не может моментально занять памяти меньше. Это не только на память влияет, но и на скорость поиска, т.к. дерево вырождается при интенсивном изменении. Различные реализации одного и того же бинарного дерева (а) идеальное сбалансированное дерево далее его состояния после изменений, вплоть до наихудшего. Взято тут Похоже, но немного не то. Это у вас не b-tree, а "обычное" бинарное, рассматривается проблема разбалансировки. У меня другое - дерево b-tree и проблема другая - "дырки в нодах". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 12:00 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
gbl37004, дай пожалуйста точную ссылку на гитхаб где находится проект Google b-tree. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 12:11 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
боевыеПохоже, но немного не то. Это у вас не b-tree, а "обычное" бинарное, рассматривается проблема разбалансировки. У меня другое - дерево b-tree и проблема другая - "дырки в нодах". Да, я уже понял что не то. "дырки в нодах" это особенность алгоритма построения b-tree, своего рода плата памятью за отсутствие разбалансировки при интенсивном изменении. Т.е. это нормально что он память отжирает в процессе работы. В принципе неважно сколько занято реальной памяти, важно как часто страницы уходят в своп и читаются оттуда. Как пишут: другая особенность b-tree в том что он должен минимизировать использование свопа. Этот параметр надо замерять. Если не свопится, то значит прога работает эффективно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 12:12 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
(3.5) Сейчас не могу сказать... Может не от гугла, а может это - https://code.google.com/p/cpp-btree/, не знаю точно сейчас А ты там при как? Нихрена не знаешь, но хочешь все исправить и делаешь глубоко идущие выводы.. (4) Какая именно накладуха? само дерево. Фрагментация от удалений-добавлений? (5) Весь код знать нереально, нужна куча времени на чтение всех исходников проекта. Чтобы прочитать все исходники этого btree и всё уложить у себя в голове только неделя нужна или около того...[/quot] Неделя — это немного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 12:18 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
боевыеСамтролль? Ядро вам выдаёт только целые страницы. Да, физическую память помечает как используемую именно страницами, перемещая указатель на неё в дескрипторы в pgd/pmd/pte, которые индексируются битами виртуального адреса. Если имеете что против, обоснуйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:26 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
luislomбоевыеСамтролль? Ядро вам выдаёт только целые страницы. Да, физическую память помечает как используемую именно страницами, перемещая указатель на неё в дескрипторы в pgd/pmd/pte, которые индексируются битами виртуального адреса. Если имеете что против, обоснуйте. Я ниасилил, при чём тут эта тема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:27 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
MasterZiv(3.5) Сейчас не могу сказать... Может не от гугла, а может это - https://code.google.com/p/cpp-btree/, не знаю точно сейчас А ты там при как? Нихрена не знаешь, но хочешь все исправить и делаешь глубоко идущие выводы.. (4) Какая именно накладуха? само дерево. Фрагментация от удалений-добавлений? (5) Весь код знать нереально, нужна куча времени на чтение всех исходников проекта. Чтобы прочитать все исходники этого btree и всё уложить у себя в голове только неделя нужна или около того... Неделя — это немного.[/quot] Я сказал - "сейчас", т.е. на момент написания поста. Ну кому много, кому не много... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:28 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
gbl37004по заявлениям разраба, приложение хранит всегда строго ограниченное число "записей", выкидывая самые старые при необходимости. Еще мысли вслух. Я не знаю как он ищет самые старые записи. Но b-tree явно не оптимизирована для выбрасывания старых записей. Возможно в этой архитектуре еще много косяков куда можно приложить руку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:32 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
On 21.04.2014 14:27, боевые wrote: > Я ниасилил, при чём тут эта тема. Намекают на то, что с приложением вашим всё в порядке, память не течёт, вы просто неправильно используете средства диагностики. А приложение (видимо) просто в таком варианте не влезает в память. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:49 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
On 21.04.2014 14:32, mayton wrote: > Еще мысли вслух. Я не знаю как он ищет самые старые записи. Но b-tree > явно не оптимизирована для выбрасывания > старых записей. Возможно в этой архитектуре еще много косяков куда можно > приложить руку. Что в дереве хранится ? Какие операции нужны для элементов, хранящихся в дереве ? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:51 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 21.04.2014 14:27, боевые wrote: > Я ниасилил, при чём тут эта тема. Намекают на то, что с приложением вашим всё в порядке, память не течёт, вы просто неправильно используете средства диагностики. А приложение (видимо) просто в таком варианте не влезает в память. Я не понял аргументов про неправильность использования средств диагностики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:58 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 21.04.2014 14:32, mayton wrote: > Еще мысли вслух. Я не знаю как он ищет самые старые записи. Но b-tree > явно не оптимизирована для выбрасывания > старых записей. Возможно в этой архитектуре еще много косяков куда можно > приложить руку. Что в дереве хранится ? Какие операции нужны для элементов, хранящихся в дереве ? Давайте это не будем обсуждать, тут проблем нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 13:58 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
боевыеЯ ниасилил, при чём тут эта тема. авторПриложение на старте засасывает в себя данные из базы, занимая 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 будут представлять собой списки этих блоков. Перемещениё ключей будет реализовано как обмен указателями между блоками. Выделение/освобождение блоков-пихаем указатели на них в стек свободных блоков. Таким образом, дерево будет всегда занимать определённую область виртуальной памяти и фиксированный набор физ. страниц для размещения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:08 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
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 будут представлять собой списки этих блоков. Перемещениё ключей будет реализовано как обмен указателями между блоками. Выделение/освобождение блоков-пихаем указатели на них в стек свободных блоков. Таким образом, дерево будет всегда занимать определённую область виртуальной памяти и фиксированный набор физ. страниц для размещения. Это всё понятно. Я только не понимаю, при чём тут всё это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:09 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
MasterZivЧто в дереве хранится ? Какие операции нужны для элементов, хранящихся в дереве ? Это не ко мне вопрос. Да и вообще тема обширная. И одними аллокаторами тут не станцуешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:13 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
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 при выделении множества мелких объектов разной величины в хаотическом хронологическом порядке? Мы до обсуждения страниц и ОС ещё не дошли, у нас ещё до этого куча всего интересного при выделении памяти происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:13 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
Проблемы-то вообще в чем? Утечек памяти нет, просто алгоритм требует до 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 вершин. Вывод: на низком уровне нечего оптимизировать. Только перестроение дерева освободит память. Надо ли это в твоем случае - решай сам, это по количеству свопящихся страниц видно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:20 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
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% ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:31 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
Короче, откопали один контейнер, откуда никогда не удалялись данные, но разраб говорил, что это небольшой грех, сей контейнер всё равно не такой жирный, чтобы влиять на общую картину. Короче, возможно и такой, на самом деле... Щас запустим без контейнера этого, позырим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:32 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
боевыеразраб говорил, что это небольшой грех ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:34 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
боевые, а чё , статистика заполнения узлов - недоступна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:36 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
боевыеКогда я вызываю malloc, управление передаётся не в ядро, а на библиотеку. А что там происходит вы как будто забываете. Вы знаете что происходит в этой библиотеке в случае применения там аллокатора jemalloc при выделении множества мелких объектов разной величины в хаотическом хронологическом порядке? Мы до обсуждения страниц и ОС ещё не дошли, у нас ещё до этого куча всего интересного при выделении памяти происходит. Попытаюсь так. Вы запросили *malloc-ом много кусков памяти в сумме набравших 100 Gb. Записали в них данные. Потом ещё 10 Mb того же самого, потом в пределах первых 100 GB освободили в шахматном порядке, половину кусков. Потом запросили кусков памяти меньшего количества, но большего размера, чем преедыдущие, и так далее. Будь у Вас хоть malloc, хоть jemalloc, хоть tmalloc (рукомендую для линукса его вместо jemalloc) всё равно такая практика работы с памятью приведёт к занятости большего числа страниц, чем суммарный размер всех выделенных в текущий момент регионов , а значит к иной статистике потребления памяти, чем статистика самого приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:38 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
боевые4. Возможно, надо удалять хитрее и агрессивнее, не диапазонами, а единичными ключами и т.п., незнаю, но в сабжевом приложении ключи удаляются пачками последовательных ключей сотнями штук. Мне кажется, чем больше последовательных ключей в пачке при удалении, тем дереву лучше, меньше разрозненных дырок, поэтому я уменьшал число ключей в пачке, чтобы сильнее спровоцировать "эффект разряжения". Удаляешь ты последовательно, а вставляешь? Новые ключи добавляются в имеющиеся страницы, которые при заполнении (как я понимаю) делятся на две с заполнением m и m+1. Вот тебе источник полупустых страниц. В идеале (для максимального использования памяти) надо удалять по немного с каждой полностью заполненной страницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:48 |
|
||
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#18+
боевые поэтому я уменьшал число ключей в пачке, чтобы сильнее спровоцировать "эффект разряжения". Чем меньше пачка, тем чаще дерево перестраивать при добавлении и удалении, что не быстро. Т.е. чем больше ключей в пачке тем быстрее работает. PS Уже несколько раз написал: забей ты на занимаемый объем памяти, он ни о чем не говорит, не надо тебе его оптимизировать, смотри на своп, если это виндовс, то параметр "Ошибок страниц" в диспетчере задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 15:05 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2019521]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
77ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 10ms |
| total: | 191ms |

| 0 / 0 |
