У меня есть Spring API с интенсивным использованием памяти, развернутый в кластере кубернетов.
Я настроил автоматическое масштабирование (HPA), чтобы рассматривать потребление памяти как критерий масштабирования, и запустив нагрузочный тест, все работает хорошо во время увеличения масштаба, однако во время уменьшения масштаба <сильный > память не разряжается и, следовательно, созданные поды не удаляются. Если я снова запущу тесты, будут созданы новые поды, но никогда не удаляемые.
Выполняя локальный анализ с использованием визуальной виртуальной машины, я считаю, что проблема связана с GC. Локально GC работает правильно во время теста, но в конце запросов он прекращает выполнение оставляя мусор позади, и он запускается снова только через долгое время. Поэтому я считаю, что этот оставленный мусор мешает масштабированию HPA.
Есть ли у кого-нибудь советы о том, что может вызывать этот эффект, или что-то, что я могу попробовать?
PS. В профилировщике у меня нет признаков утечки памяти, а когда я запускаю сборщик мусора вручную, оставшийся мусор удаляется.
Вот некоторые дополнительные сведения:
- Версия Java: 11
- Весенняя версия: 2.3
- Версия Kubernetes: 1.17
- Образ Docker: openjdk: 11-jre-slim
- HPA запрашивает память: 1 Ги
- Ограничения памяти HPA: 2 Ги
- Показатели использования памяти HPA: 80%
- Мин. Контейнеров HPA: 2
- Количество капсул HPA Max: 8
- Операционная система JVM: -Xms256m -Xmx1G