2016-05-01 94 views
1

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

生产者参数是

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

Athough缓冲器是完全可用的错误是“org.apache.kafka.common.errors.TimeoutException:无法配置的最大阻断时间内分配内存”

kafka producer metrics - degraded vs good state

+0

我对这个话题没有经验,但从我没有经验的观点来看,似乎这个问题可能更适合[服务器故障](https://serverfault.com/)。也许你应该阅读他们的[在主题页面](https://serverfault.com/help/on-topic),看看你是否认为你的问题可以在那里得到更多的关注。再一次,我没有经历过你的话题,但你的问题对我来说可能是Server Fault的一个好问题。 –

回答

0

在一个点上,你开始发送消息1000000批我认为,这就是为什么你的表现被降级。尝试降低该数字或将linger.ms降低。

+0

是的,批量大小为1M,它在我降级之前运行良好一段时间,我尝试过500K的批量大小,它仍然是同样的问题。从指标有大约32M缓冲区可用,但错误说“无法在超时内分配缓冲区” – user2677485

+0

您的linger.ms是在30000,这意味着要么发送一个完整的批次,要么等待30秒,你试过降低这个号码?我认为你的错误是一种瓶颈类型的情况。 – Nautilus

+0

我认为这可能是kafka poducer 0.9.0版本中的一个错误。每当BufferPool抛出“无法在配置的最大阻塞时间内分配内存”时,它也应该执行this.waiters.remove(moreMemory);.否则,在异常和批处理不会发生后,等待线程数永远不会变为0 – user2677485