【问题标题】:Got error of "Too many open file", what's the ulimit when running the program using ProcessBuilder()...start()?出现“打开文件过多”的错误,使用 ProcessBuilder()...start() 运行程序时的 ulimit 是多少?
【发布时间】:2021-08-14 04:11:31
【问题描述】:

在 AWS 上配置 Linux EC2 机器后,我需要运行一个程序。以下代码将出现“打开文件过多”错误。 my_program会打开很多文件,大概5000左右。

string cmd = "my_program";
Process process = new ProcessBuilder()
                      .inheritIO()
                      .command(cmd)
                      .start();

但是,在控制台中运行my_program 可以完成而不会出现任何错误。使用 ProcessBuilder()...start() 运行程序时,ulimit 是什么?

ulimit -n 在 bash 终端中输出 65535。

【问题讨论】:

  • 请将ulimit -n 的输出添加到您的问题中(无评论)。
  • ulimit 的值不依赖于 Java。它是在您的 Java 程序之外设置的。而且您的 Java 程序无法更改它。因此,您的问题的答案是“我们无法告诉您,但您可以使用ulimit 命令自行查找”。
  • 为什么需要同时打开所有这些文件
  • @Cyrus ulimit -n 在终端返回 65535。
  • @chrylis-cautiouslyoptimistic- 它运行一个 pyspark 脚本。 Spark 代码spark.read.oprtion(...).parquet(*files) 会打开很多文件。

标签: java linux ulimit


【解决方案1】:

首先找出您的应用在运行时的限制:

ps -ef | grep <<YOUR-APP-NAME>>

然后:

cat /proc/<<PID-of-your-APP>>/limits

这里的问题是你的应用程序。在 X 或 Y 用户下启动,这些用户有不同的 ulimit 设置。

检查:

cat /etc/security/limits

...我认为并增加这些值。

只要我的 2 美分...

【讨论】:

    【解决方案2】:

    您需要确保您close() 使用后的文件。它们将被垃圾收集器关闭(我不完全确定这一点,因为它在每个实现上可能有所不同)但是如果您处理许多文件而不关闭它们,您可能会在垃圾收集器有任何文件描述符之前用完文件描述符执行的机会。

    您可以做的另一件事是使用基于资源的try 语句,这将确保您在括号组中声明的每个资源都是Closeable 资源,在退出@ 时将强制为close()d 987654325@.

    无论如何,如果您想提高每个进程的最大打开文件数,只需查看您的 shell 手册页(最有可能是 bash(1))并在其中搜索 ulimit 命令(没有ulimit 手册页,因为它是 shell 的内部命令,ulimit 值是每个进程的,所以你不能启动一个进程来让你的进程改变它的最大限制)

    注意 linux 发行版(嗯,最常见的 linux 发行版)通常没有办法以 per user 的方式为此配置强制值(有一套完整的选项来在 BSD 系统中做这样的事情,但是 linux 的 login(8) 程序没有实现 /etc/login.conf 功能来做到这一点),如果它作为多用户系统运行,任意提高这个值可能是你系统中的一个安全问题。

    【讨论】:

      猜你喜欢
      • 2015-12-28
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多