【问题标题】:Kafka Producer 0.9.0 performance, large number of waiting-threadsKafka Producer 0.9.0 性能,大量等待线程
【发布时间】:2016-08-25 23:49:21
【问题描述】:

我们正在以大约 9000 条记录/秒的速度将消息写入我们的 kafka 集群,有时我们会看到生产者的性能大幅下降,然后再也无法恢复。发生这种情况时,我们会看到以下错误“无法在超时内分配缓冲区”。以下是当进程运行良好和达到不良状态时所采用的 JMX 生产者指标。当进程降级时,“等待线程”指标非常高,任何输入都会受到赞赏。

生产者参数是

batch.size=1000000
linger.ms=30000
acks=-1
metadata.fetch.timeout.ms=1000
compression.type=none
max.request.size=10000000

虽然缓冲区完全可用,但错误是“org.apache.kafka.common.errors.TimeoutException:无法在配置的最大阻塞时间内分配内存”

【问题讨论】:

  • 我对这个话题没有经验,但从我没有经验的角度来看,这个问题似乎更适合Server Fault。也许你应该阅读他们的on topic page,看看你是否认为你的问题会在那里得到更多关注。同样,我对您的主题没有经验,但您的问题对我来说很突出,因为它可能是服务器故障的一个好问题。

标签: performance apache-kafka producer


【解决方案1】:

在某一时刻,您开始批量发送 1.000.000 条消息,我认为这就是您的性能下降的原因。尝试降低该数字或将 linger.ms 设置得更低。

【讨论】:

  • 是的,批量大小为 1M,在我遇到降级之前它可以正常工作一段时间,我尝试了 500K 的批量大小,但仍然是同样的问题。从指标来看,大约有 32M 缓冲区可用,但是错误显示“无法在超时内分配缓冲区”
  • 您的 linger.ms 为 30000,这意味着您要么发送完整的批次,要么等待 30 秒,您是否尝试降低此数字?我认为您的错误是一种瓶颈类型的情况。
  • 我认为这可能是 kafka poducer 0.9.0 版本中的一个错误。每当 BufferPool 抛出“无法在配置的最大阻塞时间内分配内存”时,它也应该执行 this.waiters.remove(moreMemory);。否则异常后等待线程数永远不会为0,也不会发生批处理
猜你喜欢
  • 2020-12-17
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2019-03-27
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多