Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38619843&tid=2019521]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 197ms |

| 0 / 0 |
