Я бы начал с поиска, является ли проблема чем-то другим , чем проблема настройки ГХ.Вот несколько возможностей:
Утечка жесткого диска приведет к увеличению времени GC.Работа, выполненная GC, доминируется путем отслеживания и копирования достижимых объектов.Если у вас есть утечка, тогда все больше и больше объектов будут (неправильно) доступны.
Кэш, в котором слишком много объектов доступно, также увеличит время GC.
Чрезмерное использование типов ссылок, финализаторов и т. Д. Может увеличить время GC.
Я бы включил ведение журнала GC и стал бы искать шаблоны в памяти и сообщалось об использовании пространства.по GC.Если вы подозреваете утечку памяти, поскольку в долгосрочной перспективе использование памяти имеет тенденцию к росту, перейдите к следующему шагу и используйте профиль памяти для отслеживания утечки.
В любом случае важно понять, что вызываетпроблема перед попыткой ее исправить.
После некоторого дальнейшего анализа выясняется, что действительно было некоторое увеличение количества данных в секунду.В одной из тем был увеличен ввод сообщений с 10 Кбит / с до 200 Кбит / с.Но я полагал, что Кафка легко справится с такой большой частью данных.
Скорее всего, может.Тем не менее, увеличение пропускной способности в 20 раз неизбежно приведет к созданию и удалению большего количества объектов ... и GC придется запускать чаще, чтобы справиться с этим.
Почему только 200Кбит / с данных, разделенных между 5 брокерами, смог сломать GC.
Что заставляет вас думать, что вы "сломали" GC?15% времени в GC не означают, что оно сломано.
Теперь я могу себе представить, что GC может испытывать трудности с достижением вашей цели максимального времени паузы 20 мс, и в результате может вызывать случайные полные GC.Ваша цель времени паузы "честолюбива", особенно если куча может увеличиться до 10 ГБ.Я бы предложил уменьшить размер кучи, увеличить целевое время паузы и / или увеличить количество физических ядер, доступных для JVM.
Под разбивкой я подразумеваю увеличенную задержку при фиксации смещений.и другие смещения производителей и потребителей.
Итак ... вы просто обеспокоены тем, что увеличение нагрузки в 20 раз привело к тому, что ГХ использовал до 15% доступного ЦП.Ну, это не сломано.Это (ИМО) ожидается.Сборщик мусора не волшебство.Он должен использовать процессорное время, чтобы сделать свою работу.Чем больше работы он должен выполнить, тем больше ЦП он должен использовать для этого.Если рабочая нагрузка вашего приложения связана с большим количеством объектов, то с этим должен справиться GC.
В дополнение к приведенным выше идеям настройки, я подозреваю, что вам следует установить размер G1HeapRegionSize
намного меньшим.Согласно «Настройка первого сборщика мусора» *1049* Моники Беквит, по умолчанию 2048 областей основаны на минимальном размере кучи.Но ваши настройки дадут 1G / 16M == 64 начальных региона.
Наконец, если ваша общая цель состоит в том, чтобы уменьшить загрузку ЦП ГХ, то вам следует использовать пропускную способность ГХ, а не G1GC.Это минимизирует накладные расходы GC.Недостатком является то, что минимизация пауз в GC больше не является целью, поэтому следует ожидать случайных длительных пауз.
И если вы планируете остаться с G1GC, желательно использовать последнюю версию Java;то есть Java 11. (См. «Сборщик мусора G1 в Java 9, наконец-то»). )