我们有一个 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)
Run Code Online (Sandbox Code Playgroud)
我们已经部署了最新的 Kafka 版本并使用 spring-kafka 作为客户端:
kafka_2.12-2.1.0(CentOS Linux 版本 7.6.1810(核心))
lsof -p <kafka_pid>|wc -l,我们得到的打开描述符总数只有 7000 左右。lsof|grep kafka|wc -l,我们将获得大约 150 万个开放 FD。我们已经检查过它们都只属于 Kafka 进程。lsof|grep kafka|wc -l会回到 7000。我们已尝试将文件限制设置为非常大,但仍然出现此问题。以下是为 kafka 进程设置的限制:
cat /proc/<kafka_pid>/limits
Limit …Run Code Online (Sandbox Code Playgroud)