Notes |
|
|
Поставь Process Explorer и добавь сюда скриншоты вкладки Performance информации о процессе САС до начала проверки и когда память уже заметно выросла. Ну хотя бы до 4-5 гигов. Еще на всякий случай уточни кэш лежит чисто локально или где-то на сетевом диске. |
|
|
(0018765)
|
Parasite
|
28-06-2019 14:56
(edited on: 28-06-2019 14:57) |
|
1. Пока что нет технической возможности ставить\перепроверять (территориально вдали от любого кэша). Но вангую, что должно быть репродуцируемо на любой стороне, включая твою.
В моем случае было ВСЕГДА повторяемо на ~ 5.6M тайлов в Беркли, ~ 80 Гб общим файловым размером.
2. Кэш проверялся\лежал на локальном диске.
|
|
|
|
1. Скрины с PE докинул. Good.jpg - сразу после старта САСа, bad.jpg - когда вылезло сообщение "Out of memory" - см.ниже.
2. Проблема повторяется и на кэше SQLite в той же мере (скрины с него, соббсно).
Проверялся БОЛЬШОЙ кэш в SQLite, тип файлов - PNG, 100% заполнение (все тайлы - в кэше). Проверка шла в 4 потока (стоит галка "Разбить закачку....4 потока") + галка "Закрывать окна по окончании загрузки". Примерно через час работы занятая САСом память доросла до 4х гигов (см.скрин), в окнах загрузки побежали сообщения "Недостаточно памяти для завершения операции" и затем процесс в окнах остановился. При попытке выйти с САСа - вылезло окно "Out of memory", в итоге - выход по 3м кнопкам. |
|
|
|
Так. Каких 4 Гб занятых САС? Ты помнится писал:
> При этом размер самого саса как процесса - вполне нормален, и не растет.
Это же две большие разницы? И запросы на доп информацию совсем другие.
Нужна дебажная версия САС и примерно через пол часа, не останавливая закачек, зайти в окошко "View\Debug Info" и нажать "Save to file...". Сам файл прицепить сюда.
В идеале проверить на обычном файловом кэше. Но то уже такое дело. |
|
|
|
1. Приаттачил 2 файла - моментально после запуска, и тот же процесс - после часа работы проверки кэша (размер в памяти был примерно полтора гига).
2. На тайловом кэше такого ни разу не замечал за всё время, иначе давно бы сообщил.
3. При выходе с дебажки - вылез мессидж bad2.jpg. Elf при этом не создался - прикладывать нечего.
4. >Так. Каких 4 Гб занятых САС? Ты помнится писал:
То было в TaskManager - в нем размер саса примерно 50...70Мб, но ты сказал в него больше не смотреть. Гигабайты на скрине - не из TaskManager, а из ProcessExlorer.
5. >не останавливая закачек
На всякий уточню: закачек НЕТ - идет перепроверка кэша с винта, со 100% доступностью оного локально. В инет прожка не ходит, закачек как таковых нет. |
|
|
|
> 1. Приаттачил 2 файла - моментально после запуска, и тот же процесс - после часа работы проверки кэша (размер в памяти был примерно полтора гига).
Именно то что надо.
> 2. На тайловом кэше такого ни разу не замечал за всё время, иначе давно бы сообщил.
Всякое бывает. Может ты это на старой версии в файловом кэше гонял, а на новой только SQLite юзал.
> 3. При выходе с дебажки - вылез мессидж bad2.jpg. Elf при этом не создался - прикладывать нечего.
Забей. Известный баг, связанный с обновлением используемых библиотек, но как исправлять пока не знаем.
> То было в TaskManager - в нем размер саса примерно 50...70Мб, но ты сказал в него больше не смотреть. Гигабайты на скрине - не из TaskManager, а из ProcessExlorer.
Вот потому я и говорил, что TaskManager какашка.
> На всякий уточню: закачек НЕТ - идет перепроверка кэша с винта, со 100% доступностью оного локально. В инет прожка не ходит, закачек как таковых нет.
Пофигу. С моей точки зрения это операция закачки выделенной области. Точнее 4 паралельные, но это уже мелочи.
По файлам. В принципе ничего предосудительного не видно, так что похоже дело именно в реализации конкретного тайлохранилища или вообще в библиотеке работы с SQLite. Еще вариант, что получается дикая фрагментация памяти. Я слегка озадачен количеством созданий и удалений объектов TEnumDoublePointBySingleProjectedLine:
/Objects/TEnumDoublePointBySingleProjectedLine/Create 206792552
/Objects/TEnumDoublePointBySingleProjectedLine/Destroy 206792726
Это очень странно.
Вот теперь информация для размышления получена. Нужно думать. |
|
|
(0019314)
|
Parasite
|
02-09-2019 16:07
(edited on: 02-09-2019 16:08) |
|
>похоже дело именно в реализации конкретного тайлохранилища или вообще в библиотеке работы с SQLite
Воспроизводимо И с Berkeley, И с SQLite в одинаковой мере и с одинаковыми эффектами.
Я с тому, что проблема явно не только в "библиотеке работы с SQLite".
>Я слегка озадачен количеством созданий и удалений объектов >TEnumDoublePointBySingleProjectedLine:
>/Objects/TEnumDoublePointBySingleProjectedLine/Create 206792552
Для статистики: число тайлов к проверке по данному выделению: 99.185.164, на момент снятия дебаг-дампа было пройдено процентов 10...15 от этого числа (в каждом из 4х потоков). До 20...25и процентов в каждом - сас никогда не доживал, крэшился с OOM.
А вот при СКАЧКЕ с интернетов в тот самый кэш - всё было ОК, и работало сутками. Проблемы возникают именно что только при перепроверке уже готового. Может, дело в скорости обращения к хранилищу, где перепроверка в разы быстрее скачки - и при оной что-то где-то открывается много быстрее, чем успевает закрываться?
PS: а может ли проблема быть на стадии функционала "Разбить закачку на 4 процесса"? Надо будет попробовать в один поток на досуге....
|
|
|
|
>Воспроизводимо И с Berkeley, И с SQLite в одинаковой мере и с одинаковыми эффектами.
>Я с тому, что проблема явно не только в "библиотеке работы с SQLite".
Ну, реализовывал оба тайлохранилища один и тот же человек, мог просто одинаковые, но при этом не очень корректные для какого-то режима параметры задать или алгоритмы применить :) Всякое бывает.
> Может, дело в скорости обращения к хранилищу, где перепроверка в разы быстрее скачки - и при оной что-то где-то открывается много быстрее, чем успевает закрываться?
Все может быть. Может даже быть такое, что на файловом тайлохранилище проблема не воспроизводится просто потому, что оно медленнее работает.
>PS: а может ли проблема быть на стадии функционала "Разбить закачку на 4 процесса"? Надо будет попробовать в один поток на досуге....
Вряд ли, но если попробуешь, то о любом результате отпишись тут. Вдруг пригодится. |
|
|
|
>Я слегка озадачен количеством созданий и удалений объектов TEnumDoublePointBySingleProjectedLine:
Проверил, таки все правильно. Оно на каждый тайл должно проверить попадает ли он в полигон. А для этого нужно перебрать все отрезки образующие полигон. Так что тут все правильно, разве что крышу сносит у дельфовского менеджера памяти. Но тогда оно так же должно работать и на файловом тайлохранилище. |
|
|
|
>оно так же должно работать и на файловом тайлохранилище.
Как можно БЫСТРО разобрать SQLite в тайловый кэш, для перепроверки уже на нем? Встроенный конвертор будет 99млн тайлов\200Гб в один поток пилить до второго пришествия... |
|
|
|
>Как можно БЫСТРО разобрать SQLite в тайловый кэш, для перепроверки уже на нем? Встроенный конвертор будет 99млн тайлов\200Гб в один поток пилить до второго пришествия...
Больше никак. По крайней мере готовых вариантов я не знаю. |
|
|
|
Как соберется следующая ночная версия попробуй ее погонять. Я убрал там создание TEnumDoublePointBySingleProjectedLine на каждую проверку попадание тайла в прямоугольник. Но думаю, все же дело в реализации конкретных тайлохранилищ. Где-то там есть кэширование излишнее или фрагментация памяти. |
|
|
|
>Как соберется следующая ночная версия попробуй ее погонять
Визуально различий нет. Всё как и раньше (процесс пухнет в памяти).
Аттачу свежие before.txt при запуске САСа/after.txt при памяти процесса ~1.2Gb
PS: при проверке кэша в один проход (без юзания фичи "Разбить закачку на N потоков") - всё как и прежде. Пухнет в памяти примерно так же, разве что возможно чуть медленнее (но это неточно). |
|
|
|
Ну, все так и ожидалось. Но проверить стоило, чтобы исключить окончательно.
Обработано прмерно 2.6 миллиона тайлов. Утекло грубо говоря 1 гиг. Получается до 500 байт на тайл.
Странно. Для рапакованных точно мало, для самих файлов, вроде бы, тоже маловато.
А какого там тайлы размера в среднем? |
|
|
|
>А какого там тайлы размера в среднем?
В данном конкретном - кэш тайлов карты https://map.nostramap.com (но от карты сий бажик не зависит, таки проверено). Кэша примерно 200Гб, САСом успешно проверяется едва ли 25%, и потом его начинает дико глючить (с разнообразными эффектами, но одним финалом ака "три кнопки") по OOM. В итоге успешно скачанный ранее тем же САСом кэш нет никакой возможности проверить даже на дырки.
На всякий случай повышу приоритет тикета. |
|
|
|
>В данном конкретном - кэш тайлов карты https://map.nostramap.com.
Мне это ни о чем не говорит. Глянь какой там в среднем размер тайла.
> Кэша примерно 200Гб, САСом успешно проверяется едва ли 25%
Тоесть гиг 50 таки проверяется. Значит это точно не сами тайлы. Нужно думать.
>На всякий случай повышу приоритет тикета.
А смысл? |
|
|
|
>Глянь какой там в среднем размер тайла.
"Там" - где конкретно?
Если в кэше - то на диске тайлов нет (а есть базы SQLITE), а если на сервере - то надо перекачивать условно-большой кусок в стандартный кэш сугубо для сбора достоверной статистики. Но в любом случае - тайлы там PNG, и карта таки обычная (именно что карта, не полноцветные снимки) - так что размер тайлов должен быть небольшим, вполне сравнимым с гугломаповским.
>Тоесть гиг 50 таки проверяется. Значит это точно не сами тайлы.
Да, непохоже на сами тайлы. И при тайловом кэше я такого поведения никогда не замечал - всё ж не первый день с САСом...
Может, какие-нибудь хэндлеры открываем к базоводам, но не закрываем? Вот они и копятся, пока всё не упадет в OOM. Помнится, где-то в Беркли в свое время неск.лет назад мы мучались с закрытием баз по таймауту - там тоже кучи открытых баз дико открывались и висели, особенно при перепроверке уже готового...
>А смысл?
Для статистики. :) |
|
|
|
Ну, в общем это к Zed'у, автору тайлохранилищ. Я туда в ближайшие годы лезть не собираюсь. |
|
|
|
>автору тайлохранилищ. Я туда в ближайшие годы лезть не собираюсь.
Это было только мое личное предположение. Там по факту может быть что угодно еще. |
|
|
|
> Там по факту может быть что угодно еще.
Ой, вряд ли. Но можно проверить на файловом тайлохранилище вместо sqlite или беркли. |
|
|
|
>можно проверить на файловом тайлохранилище вместо sqlite или беркли.
Вот опять руки дошли до этого бага. Докладаюсь:
1. Просмотр карты заполнения - САС пухнет, причем очень быстро (>600Мб в памяти за меньше чем минуту работы по построению карты заполнения на глубоком зуме со 100% заполнением там). Кэш - SQLite.
2. Экспорт этого кэша SQLite в обычный тайловый кэш - процесс идет, уже >500К тайлов обработано, САС токи НЕ пухнет.
Сдается мне, где-то утечка в многопоточном доступе к кэшу в базоводе ("Операции с кэшем" - вроде как однопоточная задача, судя по всему? И в ней не пухнет).
Как распакует всё в файловый - проверю на нем, будет ли пухнуть (что-то подсказывает, что не будет, ибо никогда ранее на нём не пух). Распаковка займет пару суток - кэш таки большой...Сообщу по этому пункту, как оно разродится. |
|
|
|
>2. Экспорт этого кэша SQLite в обычный тайловый кэш - процесс идет, уже >500К тайлов обработано, САС токи НЕ пухнет.
Экспорт через операцию с выделенной областью или в менеджере кэша?
Если в менеджере кэша, то там совсем другой механизм обработки баз, чем при обычной работе.
>1. Просмотр карты заполнения - САС пухнет, причем очень быстро
Значит точно утечка или проблема внутри кода конкретного типа тайлохранилища.
> Сообщу по этому пункту, как оно разродится.
Ждем.
ЗЫЖ На всякий случай вопрос. Ты когда САС обновляешь, не забываешь все dll свежие подкладывать? А то там движок SQLite уже пару раз обновлялся. |
|
|
|
>Экспорт через операцию с выделенной областью или в менеджере кэша?
Через менеджер кэша.
>то там совсем другой механизм обработки баз, чем при обычной работе.
Ну вот с ним как раз всё ОК, судя по всему. САС сейчас стоит в памяти как влитой уже который час (экспорт - идет, пара десятков миллионов тайлов - уже обработано ОК).
>Значит точно утечка или проблема внутри кода конкретного типа тайлохранилища.
Проверено на Беркли и SQLite - на обоих проблема в наличии. Судя по всему, льется где-то еще ДО конкретного движка базовода (но скорее всего уже ПОСЛЕ собственно операций с тайлами - попробую на тайловом кэше как завершится, скажу точно). И в менеджере кэша (с теми же движками базоводов, теми же ДЛЛками и прочих равных) проблема не наблюдается.
>Ты когда САС обновляешь, не забываешь все dll свежие подкладывать? А то там движок SQLite уже пару раз обновлялся.
Обновлял прошлый раз всю папку - переносил только инишник. И проблема не только с SQLite, но и с Беркли тоже в той же мере. Таки где-то в самом САСе подливает... |
|
|
|
>Через менеджер кэша.
Ну, так там нет полноценной работы тайлохранилища. Просто идет обход всех баз в файловой иерархии, и обработка каждой из них в отдельности. А при работе тайлохранилища, приходится кэшировать открытие баз, что бы не открывать их ради каждого тайла. Вот там похоже и беда.
>Проверено на Беркли и SQLite - на обоих проблема в наличии.
Ну, так оно ж написано одним человеком, SQLite на основе Беркли, так что все логично. Похоже проблема даже не с утечкой, а с излишним кэшированием открытых баз. На малых объемах это не заметно, а вот с большим кэшем уже появляются проблемы.
> И проблема не только с SQLite, но и с Беркли тоже в той же мере. Таки где-то в самом САСе подливает...
Ну, то я на всякий случай спросил. |
|
|
|
>> Сообщу по этому пункту, как оно разродится.
>Ждем.
Сообщаю:
1. Конвертация всего кэша (ок 100Гб/70M тайлов) из SQLite в классический тайловый кэш через Менеджер кэша - ОК, конвертация успешна, САС в памяти не пухнет.
2. Проверка сконвертированного тайлового кэша картой заполнения - ОК, САС в памяти не пухнет.
3. Проверка сконвертированого кэша перекачкой по выделению (100% заполнение кэшем - кача как такового нет, есть только строки "Данный файл имеется в кэше") в 4 параллельных потока - ОК, САС в памяти не пухнет.
4. Условно-длительная работа с просмотром карты\перемещением экрана\сменой зумов - ОК, САС в памяти не пухнет.
ИТОГО: проблема только с большим кэшем типа "база данных".
Прилагаю логи, собранные дебажной версией при холодном старте и после успешного завершения всего процесса на тайловом кэше перекачкой (п.3 выше) - то, что гарантированно валилось в OOM на кэше типа "база данных": 2 файла, start2.txt + end2.txt. |
|
|
(0019462)
|
vdemidov
|
18-11-2019 10:05
(edited on: 18-11-2019 11:45) |
|
Ну, тогда остается только надеятся, что Zed обратит внимание и займется.
ЗЫЖ Ну, похоже, можно не надеятся.
18-11-2019 12:07 zed Assigned To zed =>
|
|
|
|
>Ну, похоже, можно не надеятся.
Так наше дело - зарепортить. Значит, так и будем жить с критическим багом в проде, проявляемом при значениях САСа по умолчанию (кэш в БД), где наступление на эти же грабли другими - вопрос лишь времени и размера их кэша. |
|