kafka os::commit_memory(0x00007f2e0d204000, 12288, 0) failed; error=‘无法分配内存‘ (errno=12)

如果有帮助到您,麻烦请点个赞。❤️

故障现象:

kafka报错如下,经过了多次调配jvm的内存限制,问题依旧

修复

​
增加操作系统允许创建的最大内存映射数:

sysctl -w vm.max_map_count=<number of memory maps> #default is 65536

sysctl -w vm.max_map_count=262144

其他内核参数优化调整

net.nf_conntrack_max = 6553600
net.ipv6.conf.all.disable_ipv6 = 1
net.core.rmem_default=262144
net.core.rmem_max=2097152
net.core.wmem_default=262144
net.core.wmem_max=2097152
net.core.somaxconn = 65535


​

结论:

事实证明,Kafka 为每个日志文件、每个分区、每个主题分配了一个内存映射。当您无限期地保留 kafka 消息并且还有大量分区时,这意味着该进程达到了它可以分配的内存映射数量的限制。这在kafka 文档中有详细描述(该部分的第三个要点)。

要了解 Java 进程正在使用多少内存映射,请使用以下命令:

​​​​​​​jps -l
pmap <id of kafka process> | wc -l

这种东西只有在Kafka重启后才会发现。它展示了测试重新启动(即故障转移和故障恢复场景)的重要性——即使在生产中也是如此。出现问题时能够自信地重新启动非常重要,以便快速恢复服务。

这也表明需要对操作系统级别的值进行良好的监控,而不仅仅是应用程序级别的值或简单的 CPU 和内存消耗。在这种情况下,映射内存部分的数量只会在永久保存消息或承受更多负载时增加。了解要监控的内容至关重要,有时只能通过通读所有文档或查找可以从中学习的公共事后分析才能理解。


版权声明:本文为weixin_43798031原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。