Приветствую. Нужна помощь специалиста.
В двух словах - есть небольшой сервис, в некотором роде упрощенный "велосипед с редиса". Ведет в своей памяти значения переданных в него данных "по строковому ключу", использует для этих данных время жизни (это все редиска умеет), уведомляет подключенных клиентов об изменении данных, на которые эти клиенты подписаны (это частично редиска умеет) + опция синхронизация всего блока данных в случае переподключения и немного других мелочей, сугубо сервисных (как раз тех, которые редиска не умеет).
Заметил, что сервис работает какое-то время стабильно и без проблем с достаточно немаленьким потоком входящих данных (в секунду сыпется по 500 ключей, в значенийх которых структуры длиной по 1000 элементов, каждый элемент - это небольшая структура из 5-10 строковых полей). Потребление памяти в это время укладывается в диапазон 90-110 Мб...
Но в какой-то момент использование памяти резко (в течение буквально нескольких минут) выстреливает до 1.5-1.9 Гб, и с этого момента становятся заметны незначительные затупы. Вставил мониторинг в код - снимает и логгирует потребление памяти через "process.memoryUsage()". И вот что увидел:
В какой-то момент использование памяти по всем полям сначала резко вырастает, потом еще резче падает до "обычных" значений, но общее потребление не уменьшается. Соответственно три вопроса:
- что это за лавинообразное возрастание памяти, когда поток входящих данных не меняется, его объем константа (специально для теста делал)
- почему при освобождении памяти потребление ее процессом не уменьшается (собственно что это вообще было)
- куда копать для устранения этой ситуации (пытаюсь уже раз сотый смотреть в сторону редиса, но некоторые возможности этого модуля никак не укладываются в редиску, а отказаться от них нельзя - придется много переделывать в дургих службах)
Заранее спасибо