什么是硬/软限制是什么意思?
核心文件大小的差异例如:
ulimit -Sc 1024
对比ulimit -Hc 1024
我经常ulimit -c unlimited
在运行二进制文件之前输入我的脚本.
但是,我想限制文件大小以避免磁盘已满.
然后我想知道最好的方法:
ulimit -Sc 1024 # Soft
ulimit -Hc 1024 # Hard
ulimit -c 1024 # Both
Run Code Online (Sandbox Code Playgroud)
另一个建议:价值怎么样?
ulimit -c 1024
或者ulimit -c 10240
还是其他什么东西?
我在Ubuntu 12上遇到Tomcat7打开文件过多的问题,所以我将打开文件数量的硬限制和软限制分别从4096和1024增加到16384.现在我没有收到任何更多的错误打开文件,但整体CPU%似乎已经上升.增加max文件的数量是否也有一些CPU时间成本?如果没有,为什么不设置极高的ulimit?
是否有人知道在Linux中为另一个用户找到"ulimit -a"值的方法?我希望用户A能够检查用户B的ulimit值.假设是用户A,用户B是非root用户.
提前致谢
我正在尝试运行Jest测试,但是我收到以下错误:
读取文件时出错:
/Users/mike/dev/react/TestTest/node_modules/react-native/node_modules/yeoman-environment/node_modules/globby/node_modules/glob/node_modules/path-is-absolute/package.json
/Users/mike/dev/react/TestTest/node_modules/jest-cli/node_modules/node-haste/lib/loader/ResourceLoader.js : 88 throw err; ^错误:EMFILE:打开文件太多,打开'/ Users/mike/dev/react/TestTest/node_modules/react-native/node_modules/yeoman-environment/node_modules/globby/node_modules/glob/node_modules/path-is-absolute/package.json'at Error(native)npm ERR!测试失败.请参阅上文了解更多详情.
我感兴趣的是错误中列出的路径指向node_modules目录中的文件,由于testPathIgnorePatterns中的node_modules条目,我预期不会读取该文件.
我正在运行Node 4.2.1,我的React-Native安装只有一周了,我今天安装了Jest(所以我觉得我已经掌握了所有内容).我在Mac上.
我已经运行:sudo ulimit -n 10240
,关闭所有终端窗口,甚至尝试重启.(在我之前添加的.bash_profile中ulimit -n 1024
.我尝试过更大的数字.
为了确保问题不仅仅出现在我自己的项目中,我创建了一个新项目react-native init TestTest
并对RN.json进行了RN建议的更改:
{
"name": "TestTest",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node_modules/react-native/packager/packager.sh",
"test": "jest"
},
"dependencies": {
"react-native": "^0.14.1"
},
"jest": {
"scriptPreprocessor": "node_modules/react-native/jestSupport/scriptPreprocess.js",
"setupEnvScriptFile": "node_modules/react-native/jestSupport/env.js",
"testPathIgnorePatterns": [
"/node_modules/",
"packager/react-packager/src/Activity/"
],
"testFileExtensions": [
"js"
],
"unmockedModulePathPatterns": [
"promise",
"source-map"
]
},
"devDependencies": {
"jest-cli": "^0.7.1"
}
}
Run Code Online (Sandbox Code Playgroud)
但我每次都得到同样的错误.
与 unix 命令“ulimit -n”等效的 Windows 是什么?
基本上,我想通过命令提示符设置最大 fd 限制。
我有以下脚本:
cat > /tmp/script.sh <<EndOfScript
#!/bin/sh
ulimit -n 8192
run_app
EndOfScript
Run Code Online (Sandbox Code Playgroud)
在本地运行顺利,总是好的.但是如果我尝试通过ssh远程运行它:
scp /tmp/script.sh user@host:/tmp/script.sh
ssh user@host "chmod 755 /tmp/script.sh; /tmp/script.sh"
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
ulimit: open files: cannot modify limit: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
我也尝试了以下命令:
ssh user@host "ulimit -n 8192"
Run Code Online (Sandbox Code Playgroud)
同样的错误.
看起来ssh远程命令执行对nofile限制强制执行1024次硬限制,但我无法找到如何修改此默认值.我试图修改/etc/security/limits.conf并重启sshd,仍然是同样的错误.
Mac OS X上最大打开文件的默认限制为256(ulimit -n),我的应用程序需要大约400个文件处理程序.
我尝试用setrlimit()更改限制,但即使函数正确执行,我仍然限制为256.
这是我使用的测试程序:
#include <stdio.h>
#include <sys/resource.h>
main()
{
struct rlimit rlp;
FILE *fp[10000];
int i;
getrlimit(RLIMIT_NOFILE, &rlp);
printf("before %d %d\n", rlp.rlim_cur, rlp.rlim_max);
rlp.rlim_cur = 10000;
setrlimit(RLIMIT_NOFILE, &rlp);
getrlimit(RLIMIT_NOFILE, &rlp);
printf("after %d %d\n", rlp.rlim_cur, rlp.rlim_max);
for(i=0;i<10000;i++) {
fp[i] = fopen("a.out", "r");
if(fp[i]==0) { printf("failed after %d\n", i); break; }
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
before 256 -1
after 10000 -1
failed after 253
Run Code Online (Sandbox Code Playgroud)
我不能要求使用我的应用程序的人在/ etc文件或其他内容中查找.我需要应用程序自己完成它.
我的操作系统是 MacOs sierra,我使用以下命令增加每个进程的最大打开文件数,并使它们永久受影响:
$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
Run Code Online (Sandbox Code Playgroud)
当我ulimit -a
用来查看终端中的限制时,它确实有效。
但是,当我运行我的 Java 服务器程序时,当套接字连接接近 5110 时,
“打开的文件太多仍然抛出异常”
所以我写了下面的代码来查看java运行时内核的参数?
String [] cmd={"/bin/bash","-c","ulimit -a"};
Process proc = Runtime.getRuntime().exec(cmd);
InputStream stderr = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line; …
Run Code Online (Sandbox Code Playgroud) 对于使用 Fargate 启动的容器,默认 ULIMIT“NOFILE”设置为 1024。因此,如果我有一个集群,假设有 10 个服务,每个服务有两个或三个任务(全部在 Fargate 上运行),如果我将它们全部设置为使用巨大的 NOFILE 数字(例如 900000),会产生什么影响?
更具体地说,我们需要关心主机吗?我的假设是,如果我使用 EC2 启动类型并将所有任务设置为有效使用所需数量的文件,则托管 EC2 实例很容易就会不堪重负。或者主机可能不会被淹没,但在主机上注册的容器将获得先到先得的文件数量,它们可以打开,可能导致一个服务耗尽另一个服务?但由于我们不管理 EC2 上的实例,因此为所有服务设置尽可能高的 ULIMIT 有什么坏处?我们的容器是否并排位于主机上,因此会共享主机资源限制。或者我们是否为每个服务/每个任务分配一个主机?
当然,我对这一切如何运作的假设可能是错误的。
ulimit ×10
linux ×2
amazon-ecs ×1
aws-fargate ×1
bash ×1
built-in ×1
c ×1
coredump ×1
java ×1
jestjs ×1
macos ×1
macos-sierra ×1
monitoring ×1
python ×1
react-native ×1
reactjs ×1
resources ×1
server ×1
shell ×1
ssh ×1
system ×1
tomcat7 ×1
ubuntu ×1
unix ×1
windows ×1