我们有一个3节点的kafka集群部署,总共有35个主题,每个主题有50个分区。我们总共配置了 replication factor=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作为客户端:
Kafka2.12-2.1.0(centos linux 7.6.1810版(核心))
有三个观察结果:
如果我们这样做了 lsof -p <kafka_pid>|wc -l
,我们得到的开放描述符总数仅为7000个左右。
如果我们这么做的话 lsof|grep kafka|wc -l
,我们有大约150万个开放的fd。我们已经检查过它们都只属于Kafka进程。
如果我们将系统降级到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需要更多可用的文件描述符吗?
为什么产量有差异 lsof
以及 lsof -p
在centos 6和centos 7?
代理节点的数量是否减少了3个?将复制因子视为2,我们在3个节点之间分布了每个主题大约100个分区,因此每个节点大约33个分区。
编辑1:似乎我们正在讨论Kafka问题:https://issues.apache.org/jira/browse/kafka-7697
我们将计划把Kafka的版本降到2.0.1。
暂无答案!
目前还没有任何答案,快来回答吧!