Как улучшить производительность производителей Kafka?

Kafka

Это 9-й день моего участия в августовском испытании обновлений.Подробности о мероприятии:Испытание августовского обновления

如何提升 Kafka 生产者的吞吐量?.png

Изменяя следующую конфигурацию параметров, производительность производителя может быть улучшена.

buffer.memory

Этот параметр используется для установки размера буфера памяти производителя, который используется производителем для буферизации сообщений, отправляемых на сервер.

Если приложение отправляет сообщения на сервер быстрее, чем может, это приведет к нехватке места у производителя.

В это время вызов метода send() либо блокируется, либо генерируется исключение, в зависимости от того, как установлен параметр block.on.buffer.full (заменен на max.block.ms в версии 0.9.0.0, указывающий, что исключение может быть заблокировано на некоторое время раньше).

Установите буфер для отправки сообщений, значение по умолчанию 33554432, что составляет 32 МБ.

Если скорость отправки сообщений медленнее, чем скорость записи сообщений, то буфер будет заполнен, а производственное сообщение будет заблокировано, поэтому нам следует провести здесь больше стресс-тестов, чтобы убедиться, что этот буфер как можно больше. не быть полным и привести к блокировке производства

compression.type

По умолчанию сообщения отправляются без сжатия.

Для этого параметра можно задать значение snappy , gzp или 1z4 , которое указывает, какой алгоритм сжатия используется для сжатия сообщения перед его отправкой брокеру.

Алгоритм мгновенного сжатия был изобретен Google. Он занимает меньше ресурсов ЦП, но может обеспечить более высокую производительность и значительный коэффициент сжатия. Если вас больше беспокоит производительность и пропускная способность сети, вы можете использовать этот алгоритм.

Алгоритм сжатия gzip обычно потребляет больше ресурсов ЦП, но обеспечивает более высокую степень сжатия, поэтому этот алгоритм можно использовать, если пропускная способность сети относительно ограничена.

Использование сжатия может снизить нагрузку на сетевой транспорт и память, что часто является узким местом при отправке сообщений в Kafka.

По умолчанию нет, без сжатия, но можно использовать сжатие lz4, и эффективность остается хорошей.После сжатия объем данных может быть уменьшен, а пропускная способность может быть улучшена, но это увеличит накладные расходы ЦП на производителя. боковая сторона.

batch.size

Если в один и тот же раздел необходимо отправить несколько сообщений, производитель поместит их в один пакет.

Этот параметр указывает объем памяти, который может использовать пакет, в байтах (не в сообщениях).

Когда пакет заполнен, все сообщения в пакете будут отправлены.

Однако производители не обязательно ждут, пока пакеты не будут заполнены перед отправкой.Могут быть отправлены наполовину полные пакеты, даже пакеты, содержащие только одно сообщение.

Таким образом, даже установка большого размера пакета не приведет к задержке, он просто займет больше памяти.

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

Установите размер пакета слияния. Если пакет слишком мал, это вызовет частые сетевые запросы и снизит пропускную способность;

Если пакет слишком велик, это приведет к тому, что сообщение будет долго ждать отправки, и это сильно нагрузит буфер памяти, и в памяти будет буферизовано слишком много данных.

Значение по умолчанию: 16384, что составляет 16 КБ, то есть пакет отправляется, когда он заполнен 16 КБ. Как правило, в реальной производственной среде значение этого пакета можно увеличить для повышения пропускной способности, и вы можете испытайте это сами.

linger.ms

Этот параметр указывает, как долго производитель ожидает добавления дополнительных сообщений к пакету перед отправкой пакета.

KafkaProducer будет отправлять пакеты, когда пакет будет заполнен или когда будет достигнут предел linger.ms.

По умолчанию производитель будет отправлять сообщения, пока доступны потоки, даже если в пакете только одно сообщение.

Установка для linger.ms значения больше 0 заставляет производителя ждать некоторое время перед отправкой пакета, чтобы в пакет добавлялось больше сообщений.

Хотя это увеличивает задержку, это также увеличивает пропускную способность (поскольку одновременно отправляется больше сообщений, накладные расходы на каждое сообщение меньше).

По умолчанию это значение равно 0, что означает, что сообщение должно быть отправлено немедленно, но это неверно.

Обычно устанавливайте 100 миллисекунд или подобное, что означает, что после отправки сообщения оно входит в пакет.Если пакет заполнен 16 КБ в течение 100 миллисекунд, он будет отправлен естественным образом.

Однако, если пакет не заполняется в течение 100 миллисекунд, то сообщение должно быть отправлено.Задержка отправки сообщения не может быть слишком большой, а также позволяет избежать чрезмерной нагрузки на память.