Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как искать причины пожирания памяти, если нет утечек?
|
|||
|---|---|---|---|
|
#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?fid=57&msg=38620440&tid=2019521]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 290ms |
| total: | 421ms |

| 0 / 0 |
