使用 sshd 打开的文件不足

使用 sshd 打开的文件不足

我有一个在 WSL2 中运行的 Java 应用程序

我还有一个到应用服务器的 ssh 连接(在 Windows 中),并且将应用服务器的端口隧道传输到托管在第二个应用服务器上的 Web 服务器并返回到我的应用程序。

应用程序在加载页面时会与 Web 服务器建立许多连接。我非常有信心它会正确关闭连接。

然而,过了一会儿,我在 ssh 会话的终端上打印了许多“打开文件过多”错误。

我已将打开文件 ulimit 从 1024 增加到 524288(并使用 /proc//limits 确认了这一点)。我相信应用程序不会打开那么多连接!

在我看来,sshd 似乎没有关闭连接。如果我运行该应用程序,然后重新运行它,我会更快地收到“打开文件过多”的消息,这表明上一次执行的文件仍在 sshd 中打开。

我的诊断正确吗?我能做些什么吗?我在 sshd 配置文件等中看不到任何会影响此问题的内容。

(客户端为Windows 10/WSL2,应用服务器端为Ubuntu 22.04)

编辑:我在 ssh 连接的服务器上运行了该应用程序。它工作正常,没有用完打开的文件。因此,应用程序对连接的使用可能不是问题。我怀疑出于某种原因,打开隧道连接的 sshd 进程对打开的文件仍然有较低的限制

答案1

ssh 隧道会为每个连接创建通道,并且客户端和服务器端都需要每个通道的文件描述符。您可能需要调整应用程序 WSL 环境中的最大打开文件限制。

lsof是一款出色的工具,可轻松检查某个进程的打开文件, lsof -c ssh列出所有 ssh 进程的文件, lsof -p $PID以检查特定的进程 ID

另外,还可以排除不计入打开文件数限制的文件类型。以下命令将列出所有 ssh 进程的所有打开文件,但不包括不计入打开文件数的文件:
lsof -c ssh -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -a

您可以使用 ssh 看门狗,例如自动SSH在需要时重新启动隧道

相关内容