У нас есть 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:
kafka_2.12-2.1.0 (CentOS Linux выпуск 7.6.1810 (Core))
- Есть три наблюдения:
- Если мы сделаем
lsof -p <kafka_pid>|wc -l
, мы получимобщее количество открытых дескрипторов - всего около 7000. - Если мы просто сделаем
lsof|grep kafka|wc -l
, мы получим около 1,5 миллиона открытых FD.Мы проверили, что все они принадлежат только процессу Кафки. - Если мы понижаем систему до 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
в сентосах 6 и центосах 7? - Количество узлов брокера 3Меньше?Считая коэффициент репликации равным 2, мы имеем около 100 разделов на тему, распределенных между 3 узлами, то есть около 33 разделов на узел.
Редактировать 1: Похоже, мы столкнулись с проблемой Кафки:https://issues.apache.org/jira/browse/KAFKA-7697
Мы планируем понизить версию Kafka до 2.0.1.