Утечка памяти в клиенте Hazelcast - PullRequest
0 голосов
/ 14 декабря 2018

У нас есть приложение Spring Boot 2.0.4.Мы используем распределенный кеш Hazelcast 3.11.В нашем приложении мы настроили HazelcastClient, который подключается к серверу Hazelcast в контейнере Docker.

В кеше мы храним разных «персон» на одной карте и одинаковых «персон», но в виде списка на другой (~ 900 человек в одном списке по одному ключу; эти люди на обеих картах не одинаковы для100%, они оба описывают человека в реальной жизни, но у последнего в списке меньше свойств.).Все карты имеют тип BINARY.

Когда мы проводили стресс-тесты, чтобы получить человека по случайному идентификатору из кэша (1-я карта), все прошло отлично.5000 одновременных запросов не повлияли на HEAP нашего приложения, 10000 - незначительно.В формате JSON данные одного человека имеют размер 10 КБ.

Когда мы проводили стресс-тесты, чтобы получить список людей из кэша (2-я карта), мы столкнулись с проблемами в HEAP нашего приложения, где настроен клиент,Мы сделали только 500 одновременных запросов, а размер HEAP вырос до 4 Гб!В формате JSON список имеет размер 800 КБ.Он хранится на 2-й карте и запрашивается одним и тем же ключом 500 раз.

Кто-нибудь знает, что происходит?

DTO

Контроллер

Метод фасада, который извлекается из контроллера и где требуется кэшированиеразместить с помощью аннотации @Cacheable

Конфигурация HazelcastInstance

Hazelcast.xml конфигурация для серверной стороны

500 одновременных запросов (3 раза подряд)

Куча, классы

ОБНОВЛЕНО:

Я сделал 500 одновременных запросов 23раз.Ниже мы видим последние минуты теста.

Обзор телеметрии

1 Ответ

0 голосов
/ 14 декабря 2018

@ Николай, поправьте меня, если я ошибаюсь:

  • вторая карта содержит списки людей, ~ 900 человек, в качестве записи.Вы упомянули, что каждый человек занимает ~ 10 КБ, поэтому каждая запись на второй карте составляет ~ 9 МБ, даже если вы говорите, что это 800 КБ в формате Json.Можете ли вы проверить размер записей на второй карте через Hazelcast.как: client.getMap(map_name).getEntryView(key).getCost().Это даст вам стоимость входной памяти в байтах.

  • 500 одновременных запросов, если каждая запись ~ 9 МБ, потребует дополнительной кучи 4,5 ГБ, что соответствует тому, что вы наблюдали.

Посмотревчисла, все кажется в порядке, за исключением того, что размер Json составляет 800 КБ.

Можете ли вы проверить эти цифры?

...