我们有一个由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))
- 这里有三个观察结果:
- 如果我们执行
lsof -p <kafka_pid>|wc -l
,则得到的打开描述符总数仅约为7000。 - 如果我们只执行
lsof|grep kafka|wc -l
,则得到的打开文件描述符数量约为150万。我们已经确认它们都属于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需要更多可用的文件描述符吗?
- 在CentOS 6和CentOS 7中,为什么
lsof
和lsof -p
的输出不同? - 代理节点数量是否少了3个?看到复制因子为2,每个主题分布在3个节点上约有100个分区,因此每个节点约有33个分区。
编辑1: 似乎我们遇到了Kafka问题:https://issues.apache.org/jira/browse/KAFKA-7697
我们计划将Kafka版本降级为2.0.1。
log.retention.check.interval.ms=300000 log.retention.ms=3600000 log.roll.ms=3600000
- Ankit Singhal