11

我们遇到了卡夫卡的问题。有时突然,我们会在没有警告的情况下退出同步并在发出事件时开始出现异常。

我们得到的例外是

java.io.IOException: Too many open files

似乎这是 Kafka 在许多情况下抛出的一般异常。我们对其进行了一些调查,我们认为根本原因是尝试向某个主题发出事件时,它失败了,因为 kafka 没有该主题的领导分区

有人可以帮忙吗?

4

4 回答 4

8

我假设你在 Linux 上。如果是这种情况,那么发生的事情是您的打开文件描述符用完了。真正的问题是为什么会发生这种情况。

默认情况下,Linux 通常将此数字保持在相当低的水平。您可以通过 ulimit 检查实际值:

ulimit -a | grep "open files"

然后,您可以再次通过 ulimit 设置该值:

sudo ulimit -n 4096

也就是说,除非有问题的 Kafka 主机有很多主题/分区,否则达到该限制是不寻常的。可能发生的是其他一些进程正在保持文件或连接打开。为了弄清楚你将不得不用 lsof 做一些侦探工作。

于 2015-05-15T14:39:13.670 回答
2

发生这种情况的一种情况是,当您的分区号很大时,因为每个分区都映射到代理中文件系统中的一个目录,该目录由两个文件组成。其中一个用于索引,另一个用于数据。经纪人打开这两个文件。所以更多的分区号有更多的打开文件。正如 Doomy 所说,您可以增加 linux 中打开的文件,但此配置不是永久的,当您关闭会话时,此配置将消失。如果您使用此命令进行检查,则在下一次登录中

ulimit -a | grep "open files"

你可以看到旧号码。但是使用此配置,您可以使其永久化:

打开这个文件:

sudo nano /etc/pam.d/common-session

并添加这一行:

session required pam_limits.so

之后,您可以在 limits.config 中设置限制,如下所示:

sudo nano /etc/security/limits.conf

然后你可以在这个文件中设置限制,例如

* soft nofile 80000

或任何硬配置。之后关闭您的会话并再次检查打开文件的限制

于 2017-11-15T15:45:58.903 回答
1

我在 Linux/CentOS 上遇到过类似的“java.io.IOException: Too many open files”问题。就我而言,在使用isof检查打开的 fd 之后,是 kafka-web-console 打开了太多连接。停止它解决了我的问题。

于 2015-08-18T14:37:56.217 回答
1

在我们的案例中,我们的 Kafka 主题被意外配置"segment.ms" = 20000,并且在默认值为 604800000(1 周)时每 20 秒生成新的日志段。

我们使用的是亚马逊的 msk,所以我们自己没有能力运行命令,但是亚马逊支持能够为我们监控它。这导致了这个问题,但是一些节点没有恢复。

我们走了两步。。

1) 强制压实

我们将保留率和比率设置为低以进行清理

"delete.retention.ms" = 100
"min.cleanable.dirty.ratio" = "0.01"

其中一个节点能够恢复......但另一个节点似乎没有恢复到 Kafka 实际运行压缩的程度,它似乎是最大主题之一的“领导者”。

2)释放空间

我们决定销毁这个大主题,希望它能解除对节点的阻塞。最终,压缩似乎在所有节点上运行。

后来我们用新的分割设置恢复了我们破坏的主题,并且一直运行良好。

于 2020-11-20T20:29:14.233 回答