Kafka代理节点出现“打开文件太多”错误导致宕机

8

我们有一个由3个节点组成的Kafka集群部署,共有35个主题,每个主题有50个分区。总体上,我们配置了副本因子=2。 我们发现一个非常奇怪的问题,有时候Kafka节点会停止响应并报错:

ERROR Error while accepting connection (kafka.network.Acceptor)
java.io.IOException: Too many open files
  at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
  at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
  at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
  at kafka.network.Acceptor.accept(SocketServer.scala:460)
  at kafka.network.Acceptor.run(SocketServer.scala:403)
  at java.lang.Thread.run(Thread.java:745)

我们已部署最新的Kafka版本,并使用spring-kafka作为客户端:

kafka_2.12-2.1.0(CentOS Linux release 7.6.1810 (Core))

  • 这里有三个观察结果:
    1. 如果我们执行 lsof -p <kafka_pid>|wc -l,则得到的打开描述符总数仅约为7000。
    2. 如果我们只执行 lsof|grep kafka|wc -l,则得到的打开文件描述符数量约为150万。我们已经确认它们都属于Kafka进程。
    3. 如果我们将系统降级到Centos6,则lsof|grep kafka|wc -l的输出结果会恢复到7000。

我们已尝试将文件限制设置得非常大,但仍然出现此问题。以下是为kafka进程设置的限制:

cat /proc/<kafka_pid>/limits
    Limit                     Soft Limit           Hard Limit           Units
    Max cpu time              unlimited            unlimited            seconds
    Max file size             unlimited            unlimited            bytes
    Max data size             unlimited            unlimited            bytes
    Max stack size            8388608              unlimited            bytes
    Max core file size        0                    unlimited            bytes
    Max resident set          unlimited            unlimited            bytes
    Max processes             513395               513395               processes
    Max open files            500000               500000               files
    Max locked memory         65536                65536                bytes
    Max address space         unlimited            unlimited            bytes
    Max file locks            unlimited            unlimited            locks
    Max pending signals       513395               513395               signals
    Max msgqueue size         819200               819200               bytes
    Max nice priority         0                    0
    Max realtime priority     0                    0
    Max realtime timeout      unlimited            unlimited            us

我们有几个问题:
  • 我们已经配置了如此大的进程限制,为什么代理会间歇性地崩溃?Kafka需要更多可用的文件描述符吗?
  • 在CentOS 6和CentOS 7中,为什么lsoflsof -p的输出不同?
  • 代理节点数量是否少了3个?看到复制因子为2,每个主题分布在3个节点上约有100个分区,因此每个节点约有33个分区。

编辑1: 似乎我们遇到了Kafka问题:https://issues.apache.org/jira/browse/KAFKA-7697

我们计划将Kafka版本降级为2.0.1。


目前所有主题的总流量仅为2K条/秒。生产者和消费者似乎没有任何问题。需要提及的一件事是,我们已将kafka日志保留策略更改为1小时,因为我们的消息不需要长期存储。 - Ankit Singhal
是的..我们已经配置了以下值:log.retention.check.interval.ms=300000 log.retention.ms=3600000 log.roll.ms=3600000 - Ankit Singhal
这些值看起来没问题,因为您提到在CentOS6上没有看到此问题,所以您不认为它可能与操作系统有关吗? - Soumen Mukherjee
我认为问题可能只是在CentOS6或CentOS7中的lsof显示方面,不应该是操作系统的问题。 - Ankit Singhal
在Centos6上,我们只有性能环境。虽然使用所有主题的真实场景很难复制,但当配置的FD达到50K时,我们已经看到了这个问题。 - Ankit Singhal
显示剩余5条评论
1个回答

1

根据提问者早期的更新,他发现自己遇到了https://issues.apache.org/jira/browse/KAFKA-7697问题。

现在快速检查显示该问题已解决,并且根据jira,解决此问题的方法是使用Kafka 2.1.1及以上版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接