java.io.IOException:错误=11
我在Javajava.io.IOException:错误=11,java,linux,process,processbuilder,Java,Linux,Process,Processbuilder,我在JavaProcessBuilder中遇到了一个奇怪的问题。代码如下所示(以稍微简化的形式) whatever.sh的内容如下: R --slave --args $1 $2 <whatever1.R >> r.log 有人知道这意味着什么吗?根据google/bing对java.io.IOException:error=11的搜索结果,这并不是最常见的异常,我完全感到困惑 我的猜测是,我有太多线程试图同时启动同一个文件。但是,重现问题需要几个小时的CPU时间,因
ProcessBuilder
中遇到了一个奇怪的问题。代码如下所示(以稍微简化的形式)
whatever.sh的内容如下:
R --slave --args $1 $2 <whatever1.R >> r.log
有人知道这意味着什么吗?根据google/bing对java.io.IOException:error=11
的搜索结果,这并不是最常见的异常,我完全感到困惑
我的猜测是,我有太多线程试图同时启动同一个文件。但是,重现问题需要几个小时的CPU时间,因此我没有尝试使用较小的数字
非常感谢您的建议。errno 11表示“资源暂时不可用”。这通常是内存问题,可能会阻止创建线程或套接字
errno 12表示“无法分配内存”。这是一种无法获得内存的情况,是对内存的直接调用(而不是反过来需要内存的资源)
我会尝试增加系统的交换空间,这样可以避免此问题。几乎可以肯定
error=11
就是EAGAIN
错误代码:
$ grep EAGAIN asm-generic/errno-base.h
#define EAGAIN 11 /* Try again */
clone(2)
系统调用记录了一个EAGAIN
错误返回:
EAGAIN正在运行的进程太多。
fork(2)
系统调用记录了两个EAGAIN
错误返回:
EAGAIN fork()无法分配足够的内存来复制
父级的页表,并为其分配任务结构
孩子。
EAGAIN无法创建新流程,因为
调用方的RLIMIT_NPROC资源限制为
遇到。若要超过此限制,流程必须
拥有CAP_系统管理员或CAP_系统资源
能力。
如果内存真的那么少,那么几乎肯定会显示在系统日志中。检查dmesg(1)
output或/var/log/syslog
是否有任何关于系统内存不足的潜在消息。(其他事情可能会破裂。这似乎不太合理。)
更有可能的情况是遇到每个用户对进程的限制或系统范围内的最大进程数。也许您的某个进程没有正确地重新接收僵尸?通过检查随时间变化的ps(1)
输出,很容易发现这一点:
while true ; do ps auxw >> ~/processes ; sleep 10 ; done
(可能每分钟或十分钟检查一次,看你是否真的需要几个小时才能遇到麻烦。)
如果您没有收获僵尸,那么请阅读您必须对ProcessBuilder执行的任何操作,以使用waitpid(2)
收获您死去的孩子
如果您合法地运行的进程超过了RLIMIT允许的数量,则需要在bash(1)
脚本中使用ulimit
(如果以root
身份运行),或者在/etc/security/limits.conf
中为nproc
属性设置更高的限制
如果您运行的是系统范围的进程限制,则可能需要在
/proc/sys/kernel/pid_max
中写入更大的值。请参阅proc(5)
,了解一些(简短的)详细信息。您是否使用lsof
检查了java进程的打开文件?是错误11还是12,还是两者都有?谢谢,这让我找到了正确的方向。由于代码中的一个错误,在循环中创建了一个新线程,而不是重复使用现有线程,最终导致了所描述的问题。因此,出现故障的不是builder.start()
调用,而是最后报告问题的那段代码?调试良好。:)实际上是builder.start()
失败了,但它失败了,因为应用程序的另一部分已经耗尽了可用的资源。正如你在文章中提到的,分叉过程需要一定的内存等。谢谢你的帮助
$ grep EAGAIN asm-generic/errno-base.h
#define EAGAIN 11 /* Try again */
while true ; do ps auxw >> ~/processes ; sleep 10 ; done