Почему время GC может увеличиться у брокеров Kafka с постоянным количеством записей, производителей и потребителей? - PullRequest
0 голосов
/ 28 декабря 2018

Я использую Kafka 2.1.0.

У нас есть кластер Kafka с 5 брокерами (машины r5.xlarge).Мы часто наблюдаем, что время GC слишком сильно увеличивается без каких-либо изменений в скорости входящих сообщений, что серьезно влияет на производительность кластера.Теперь я не понимаю, что может вызвать резкое увеличение времени GC.

Я попробовал несколько вещей с небольшим улучшением, но я не совсем понимаю причину их возникновения.

export KAFKA_HEAP_OPTS="-Xmx10G -Xms1G"
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:MetaspaceSize=96m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80"

Я хотел бы понять наиболее важные параметры при настройке GC в брокере Kafka.Видя конфигурацию выше, где я иду не так?Что можно сделать, чтобы исправить это?

Все производители и потребители работают нормально, и скорость входящих сообщений остается довольно постоянной.До сих пор мы не смогли выяснить какую-либо закономерность внезапного увеличения времени GC, это кажется случайным.

ОБНОВЛЕНИЕ

После некоторого дальнейшего анализа, ЭтоОказывается, действительно было некоторое увеличение количества данных в секунду.В одной из тем был увеличен ввод сообщений с 10 Кбит / с до 200 Кбит / с.Но я полагал, что Кафка легко справится с этой большой частью данных.

Есть ли что-то, чего мне не хватает ??

Снимок Grafana enter image description here

Ответы [ 2 ]

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

Я бы начал с поиска, является ли проблема чем-то другим , чем проблема настройки ГХ.Вот несколько возможностей:

  • Утечка жесткого диска приведет к увеличению времени 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, наконец-то»). )

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

Kafka 2.1 использует G1GC по умолчанию, поэтому я думаю, вы можете опустить этот аргумент.Я предполагаю, что вы не используете JDK 11. По сравнению с предыдущими версиями, JDK 11 значительно улучшил G1GC.Вместо выполнения однопоточного полного цикла GC теперь можно выполнять параллельную обработку.Несмотря на то, что это не должно улучшать сценарии в лучшем случае с большим отрывом, сценарии в худшем случае должны значительно улучшиться.Если возможно, поделитесь своими результатами после перехода на JDK 11.

Примечание : Я сомневаюсь, что это основная причина, но давайте посмотрим.

...