Почему добавление дополнительных потребителей не увеличивает пропускную способность?

У меня есть установка Kafka с одним узлом на виртуальной машине с 56 ГБ ОЗУ и диском 750 ГБ с одним брокером.

Вот как выглядит файл server.properties:

broker.id=1
listeners=PLAINTEXT://hostname:port
num.network.threads=15
num.io.threads=30

socket.send.buffer.bytes=1024000
socket.receive.buffer.bytes=1024000
socket.request.max.bytes=1048576000

log.dirs=/path/to/log/

num.partitions=1
num.recovery.threads.per.data.dir=1

offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1

log.retention.hours=2160
log.retention.bytes=500000000000
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000

zookeeper.connect=zkhostname:2181
zookeeper.connection.timeout.ms=6000

group.initial.rebalance.delay.ms=0
message.max.bytes=10485760

У меня есть несколько потребителей и производителей, работающих над различными темами, с соответствием 1: 1 между разделами темы и потребителями (на самом деле у меня в основном 1 раздел и один потребитель). Средний размер каждого моего сообщения 500kb.

Скажем, пропускная способность, которую я получаю для каждого потребителя (который после некоторой обработки создает другую тему), составляет около 200 записей в секунду.

Для конкретной темы у меня есть 10 разделов и 10 потребителей, которые надеются, что обработка будет в 10 раз быстрее (параллельное потребление и отправка).

Пропускная способность была разделена между каждым из потребителей, вероятно, около 20 записей в секунду на каждого потребителя. Единственная причина, по которой я мог подумать, что это может произойти, заключается в том, что ресурсы Kafka достигли некоторых пределов?

На виртуальной машине, если я сделаю free -m, результат будет примерно таким:

               total        used        free      shared  buff/cache   available
Mem:          56339       12055       35087          24        9196       43428
Swap:             0           0           0

Я читал, что Кафка часто использует pagecache под капотом, поэтому я не понимаю, правильно ли это.

Я пытался установить это

export KAFKA_HEAP_OPTS="-Xmx16G -Xms16G"

в kafka-server-start.sh, но, похоже, не помогает.

Если это проблема с памятью или какая-то другая проблема с исчерпанием ресурсов, как мне диагностировать с помощью Kafka? Я пропустил некоторые конфигурации уровня брокера? Мне нужно понять, почему или как снижается производительность моего сервера Kafka.


person void    schedule 21.03.2018    source источник


Ответы (1)


Неудивительно, что в кластере Kafka с одним узлом добавление дополнительных потребителей не увеличит пропускную способность.

Если брокер уже отправляет с максимальной пропускной способностью 1 клиенту, если вы добавите второго клиента, брокеру теперь придется делиться своими ресурсами между обоими.

Сила Kafka в том, что в вашем кластере может быть несколько брокеров, и каждый из них может быть лидером некоторых разделов. Затем каждый потребитель будет подключен к нескольким различным брокерам, чтобы каждый потребитель мог использовать ресурсы каждого брокера.

Я намеренно стараюсь не говорить о том, что может быть вашим узким местом (процессор, сеть и т. д.), но я просто пытаюсь объяснить, почему ваше базовое предположение «больше потребителей = больше пропускной способности» не всегда верно.

person Mickael Maison    schedule 22.03.2018
comment
Моя виртуальная машина с одним узлом имеет один SSD-диск. Скажем, если я добавлю больше брокеров, использующих тот же диск, могу ли я ожидать увеличения пропускной способности? Или все разные брокеры должны использовать разные диски? - person void; 22.03.2018
comment
Это зависит от того, и я боюсь, что это не то, на что я могу ответить в комментарии. Сначала вам нужно определить, что является вашим узким местом, и поэкспериментировать с вашей конфигурацией и вашими ограничениями. - person Mickael Maison; 22.03.2018