我一直在我的node.js实例中收到错误报告错误:
(node) Hit max file limit. Increase "ulimit - n"
Run Code Online (Sandbox Code Playgroud)
然而,当我检查我的ulimit -n时,它说65535.我的应用程序无法打开65535连接.有没有人对还有什么要检查有任何建议?
干杯
我试图在虚拟内存限制为2GB ulimit -v 2000000
但仍会出现内存错误的环境中使用java .java -version
在这种环境中运行可以:
$ java -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Run Code Online (Sandbox Code Playgroud)
无论我设置多低-Xmx
,我都无法让java在这种环境下运行.但是,如果ulimit -v
设置为2.5GB,那么我可以设置-Xmx
为250m,但不能更高.
$ java -Xmx250m -version
java version "1.7.0_19"
OpenJDK Runtime Environment (rhel-2.3.9.1.el6_4-x86_64)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)
$ java -Xmx251m -version
#
# There is insufficient memory …
Run Code Online (Sandbox Code Playgroud) 当审查同事的代码时,发现下面的代码
BufferedReader br = new BufferedReader(new FileReader(PATH + fileName));
//...
Run Code Online (Sandbox Code Playgroud)
只是读取一个文件并将这些行连接成一行,但我没有发现任何密切的代码,所以我认为它应该导致资源泄漏,最后导致too many open files error
,所以为了证明这一点,我写了一个测试
for (int i = 0; i < 7168; i++) { // ulimit -n ==> 7168
BufferedReader br = new BufferedReader(new FileReader("src/main/resources/privateKey/foo.pem"));
System.out.println(br.readLine());
}
System.in.read();
Run Code Online (Sandbox Code Playgroud)
很奇怪,一切都好,不会抛出预期的异常.
并在命令行中检查实际打开的文件
? ~ lsof -p 16276 | grep 'foo.pem' | wc -l
2538
Run Code Online (Sandbox Code Playgroud)
为什么只有2538,而不是7168?
那有什么不对?怎么引起的too many open files error
?
正如@GhostCat建议的那样,更改7168 - > Integer.MAX_VALUE,这次造成的
java.io.FileNotFoundException: src/main/resources/privateKey/foo.pem (Too many open files in system)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195) …
Run Code Online (Sandbox Code Playgroud) 每个进程的Mac OS X(10.6)中的最大打开文件数是多少?
ulimit比256说,sysctl说10240,但我的测试程序可以创建9469(在gdb下),10252(没有gdb)文件..
我想限制子进程写入太多数据或占用过多的CPU时间(无限循环).在C中,我会调用setrlimit(2)来做到这一点.在node.js中有这样的东西吗?
我在RHEL 6.3上运行了几个进程,但由于某种原因,它们超出了线程堆栈大小.
例如,Java进程在启动时在运行时被赋予-Xss256k的堆栈大小,并且在实际代码中使用pthread_attr_setstacksize()为C++进程提供1MB的线程堆栈大小.
但是出于某种原因,这些过程并没有坚持这些限制,我不确定为什么.
例如,当我跑
pmap -x <pid>
Run Code Online (Sandbox Code Playgroud)
对于C++和Java进程,我可以看到每个数百个'anon'线程(我已经确认这些线程是由这些进程中的每一个创建的内部工作线程),但是这些线程的分配值各为64MB,而不是限制集以上:
00007fa4fc000000 168 40 40 rw--- [ anon ]
00007fa4fc02a000 65368 0 0 ----- [ anon ]
00007fa500000000 168 40 40 rw--- [ anon ]
00007fa50002a000 65368 0 0 ----- [ anon ]
00007fa504000000 168 40 40 rw--- [ anon ]
00007fa50402a000 65368 0 0 ----- [ anon ]
00007fa508000000 168 40 40 rw--- [ anon ]
00007fa50802a000 65368 0 0 ----- [ anon ]
00007fa50c000000 168 40 40 rw--- [ anon …
Run Code Online (Sandbox Code Playgroud) 所有
我想永久地将核心文件大小设置为无限制.阅读它,建议修改/etc/security/limits.conf.我这样做了以下几行:
我在更改后重新启动并且我发出ulimit -a并且核心仍然设置为0.无法理解为什么设置不起作用.什么可以覆盖它?
我正在修改机器上的/etc/security/limits.conf,然后在Chef配方中安装Supervisor.配方运行完成后,如果我运行,cat /proc/<process id>/limits
我会看到:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max open files 1024 4096 files
Run Code Online (Sandbox Code Playgroud)
如果我登录到机器并运行service supervisor restart
,则会正确设置最大打开文件.但是,如果我在配方中运行此命令(在安装主管后,在配方的最后,任何东西),限制不会改变.直到我登录并手动运行该命令才能更改限制.
如何使用厨师食谱获取主管更改的打开文件限制?操作系统是Ubuntu 12.04.
由于文件句柄限制错误,我的 docker 构建失败。他们崩溃了
Error: EMFILE: too many open files
当我在容器上检查 ulimit -n 时,我看到
-n: file descriptors 1024
所以我将以下标志传递给我的构建命令
docker build --ulimit nofile=65536:65536 -t web .
但这并没有改变任何东西,我的容器仍然显示
-n: file descriptors 1024
无论我做什么,我似乎都无法更改 ulimit 文件描述符限制。
我在这里做错了什么?
我在 docker-compose.yaml 中找不到将参数传递给以下“docker”参数的选项:
--ulimit rtprio=95 --ulimit memlock=-1
换句话说,我希望用 docker-compose 包装以下命令:
docker run --rm -it --network host --ulimit rtprio=95 --ulimit memlock=-1 --name my_proj image/my_image bash
ulimit ×10
docker ×2
java ×2
linux ×2
node.js ×2
chef-infra ×1
debian ×1
dockerfile ×1
file ×1
java-7 ×1
linux-kernel ×1
macos ×1
max ×1
openjdk ×1
pthreads ×1
real-time ×1
redhat ×1
supervisord ×1
ubuntu ×1