Kafka生产者/消费者打开了太多文件描述符

我们有一个3节点的Kafka集群部署,其中包含5个主题,每个主题6个分区。我们已经配置了复制因子= 3,我们看到了一个非常奇怪的问题,即文件描述符的数量已经超过了ulimit(对于我们的应用程序是50K)

As per the lsof command and our analysis 

1. there have 15K established connection from kafka producer/consumer  towards broker and at the same time in thread dump we have observed thousands of entry for kafka 'admin-client-network-thread'

admin-client-network-thread" #224398 daemon prio=5 os_prio=0 tid=0x00007f12ca119800 nid=0x5363 runnable [0x00007f12c4db8000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x00000005e0603238> (a sun.nio.ch.Util$3)
- locked <0x00000005e0603228> (a java.util.Collections$unmodifiableSet)
- locked <0x00000005e0602f08> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at org.apache.kafka.common.network.Selector.select(Selector.java:672)
at org.apache.kafka.common.network.Selector.poll(Selector.java:396)
at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:460)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:238)
- locked <0x00000005e0602dc0> (a org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:214)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:205)
at kafka.admin.AdminClient$$anon$1.run(AdminClient.scala:61)
at java.lang.Thread.run(Thread.java:748)


2. As per the lsof output,We have observed 35K entry for pipe and event poll

java    5441 app  374r     FIFO                0,9      0t0  22415240 pipe
java    5441 app  375w     FIFO                0,9      0t0  22415240 pipe
java    5441 app  376u  a_inode               0,10        0      6379 [eventpoll]
java    5441 app  377r     FIFO                0,9      0t0  22473333 pipe
java    5441 app  378r     FIFO                0,9      0t0  28054726 pipe
java    5441 app  379r     FIFO                0,9      0t0  22415241 pipe
java    5441 app  380w     FIFO                0,9      0t0  22415241 pipe
java    5441 app  381u  a_inode               0,10        0      6379 [eventpoll]
java    5441 app  382w     FIFO                0,9      0t0  22473333 pipe
java    5441 app  383u  a_inode               0,10        0      6379 [eventpoll]
java    5441 app  384u  a_inode               0,10        0      6379 [eventpoll]
java    5441 app  385r     FIFO                0,9      0t0  40216087 pipe
java    5441 app  386r     FIFO                0,9      0t0  22483470 pipe


Setup details :- 
apache kafka client :- 1.0.1
Kafka version :- 1.0.1
Open JDK :- java-1.8.0-openjdk-1.8.0.222.b10-1
CentOS version :- CentOS Linux release 7.6.1810

Note:- After restarted VM file descriptor count was able to clear and come to normal count as 1000 
then after few second file descriptor count started to increase and it will reach to 50K (limit) after 
1-week in Idle scenarios.
xclhuni 回答:Kafka生产者/消费者打开了太多文件描述符

此问题是由于使用了不推荐使用的kafka.admin.AdminClient API。而是可以使用org.apache.kafka.clients.admin.AdminClient从Kafka获取类似信息。该API具有等效的方法,并提供与旧版API相同的功能。

使用旧版API(kafka.admin.AdminClient API),在线程转储中观察到许多守护程序线程(“ admin-client-network-thread”)。在旧版API中,管理客户端网络线程以某种方式无法很好地维护,并且您将看到为每个调用创建了大量的“管理客户端网络线程”守护程序线程,并且它们都不会终止。由于存在大量的文件描述符,因此在过程和系统级别都可以看到。

,

经纪人为每个日志段文件和网络连接创建和维护文件句柄。如果代理托管许多分区并且该分区包含许多日志段文件,则总数可能非常庞大。这也适用于网络连接。

段文件的数量是分区的数量乘以取决于保留策略的某个数量。默认的保留策略是在一个星期(或1GB,无论先发生什么情况)之后开始一个新段,并在一个段中的所有数据都存在一个星期以上时删除该段。

我不会立即看到由于设置较大的B[A,.(a,b = i.b)] a b 1: 1 12 2: 2 13 3: 3 14 4: 4 15 而导致的任何性能下降,但是页面缓存未命中很重要。

本文链接:https://www.f2er.com/3167919.html

大家都在问