【Kafka】Failed to allocate 16384 bytes within the configured max blocking time 60000 ms. Total memory

1.问题

Failed to allocate 16384 bytes within the configured max blocking time 60000 ms. Total memory: 33554432 bytes. Available memory: 0 bytes. Poolable size: 16384 bytes

翻译过来就是:
是因为Kafka生产者在分配缓冲区时超出了配置的最大阻塞时间,导致内存耗尽。

2.Kafka配置文件

 kafka:
        #连接地址
        bootstrap-servers: 127.0.0.1:9092
        producer:
            # 发生错误后,消息重发的次数
            retries: 0
            #当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算
            batch-size: 16384
            # 设置生产者内存缓冲区的大小
            buffer-memory: 33554432
            # 键的序列化方式
            key-serializer: org.apache.kafka.common.serialization.StringSerializer
            # 值的序列化方式
            value-serializer: org.apache.kafka.common.serialization.StringSerializer
            #value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 反序列化value的类
            # acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应
            # acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应
            # acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应
            acks: all
            properties:
                # producer发送消息的延时,与batch-size配合使用,默认值0,单位ms
                linger:
                    ms: 50
                metadata:
                    max:
                        age:
                            ms: 300000
        consumer:
            # 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D
            auto-commit-interval: 1s
            # 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
            # latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
            # earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
            auto-offset-reset: earliest
            # 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
            enable-auto-commit: false
            group-id: ${spring.profiles.active}-group
            # 键的反序列化方式
            key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
            # 值的反序列化方式
            value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
            #value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer # 反序列化value的类
            properties:
                max.poll.interval.ms: 86400000
        listener:
            # 在侦听器容器中运行的线程数。
            concurrency: 1
            #listner负责ack,每调用一次,就立即commit
            ack-mode: manual_immediate
            missing-topics-fatal: false
            type: batch
        # 其它属性配置
        properties:
            # 设置发送消息的大小
            max.request.size: 10240000

这里主要看2个参数:

batch-size: 16384
buffer-memory: 33554432

出现这个问题的原因 生产者在尝试分配16384字节的缓冲区空间时,超过了配置的最大阻塞时间(60秒),并且可用内存已经用尽。这可能是由于生产者发送的消息太大或Kafka集群负载过高导致的。

batch-size: 5000
buffer-memory: 53554432

把批次大小调小,然后把缓冲区调大,在观测就没有问题了。另外也可以调整max.block.ms的值,以延长最大阻塞时间,从而给生产者更多的时间来分配缓冲区空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞四海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值