似乎为C程序或Ruby程序(使用C堆栈)设置堆栈大小的推荐方法是ulimit
在Bash shell中使用.但
$ ulimit -s
8192
$ ulimit -s 16384
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
并sudo
没有帮助.有没有办法将其设置为16MB,32MB或64MB?我认为应该有一种方法来设置每个程序调用,而不是设置系统范围的参数?
现在8192
可能意味着8MB这是非常小的,如果将其与进程可以使用的数量进行比较,有时甚至高达2GB的RAM.
(更新的注释: ulimit -a
可以显示其当前值).
(更新2:它实际上似乎ulimit -s <value>
是每个shell,如果你第一次设置它,它通常会工作.问题是当你第二次设置它,然后它可能会返回一个错误)
在运行带有2.6.32-22通用内核的Ubuntu 10.04的计算机上会出现以下问题:设置进程的驻留集大小(RSS)的限制似乎没有任何影响.我目前使用以下代码在Python中设置限制:
import resource
# (100, 100) is the (soft, hard) limit. ~100kb.
resource.setrlimit(resource.RLIMIT_RSS, (100, 100))
memory_sink = ['a']*10000000 # this should fail
Run Code Online (Sandbox Code Playgroud)
列表memory_sink每次都成功.当我使用top检查RSS使用情况时,我可以轻松地使用1gb的RAM进程,这意味着限制无效.RSS限制不适用于此内核或发行版吗?如果有帮助,resource.RLIMIT_NPROC(用户进程限制)确实有效.
我正在运行一个处理数千个并发Web套接字连接的Web服务器.为了实现这一点,在Debian linux上(我的基本图像是google/debian:wheezy,在GCE上运行),默认打开文件数设置为1000,我通常只将ulimit设置为所需的数字(64,000) .
这很好,除了当我将我的应用程序停靠并部署它时 - 我发现docker类型忽略了限制定义.我尝试了以下(所有在主机上,而不是在容器本身):
MAX=64000
sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"ulimit -c $MAX\" >> /etc/profile"
ulimit -c $MAX
Run Code Online (Sandbox Code Playgroud)
在做了一些研究后,我发现人们能够通过这样做来解决类似的问题:
sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
Run Code Online (Sandbox Code Playgroud)
并重新启动/重新启动docker服务.
但是,以上所有都失败了:当我的应用程序在容器内部运行时,我收到"太多打开文件"错误(执行以下操作时,没有docker解决了问题).
我试图ulimit -a
在容器内部运行以获得ulimit设置是否有效的指示,但这样做会引发一个关于ulimit的错误,而不是作为PATH一部分的可执行文件.
任何人遇到这个和/或可以建议让码头工人识别极限的方法?
我正在使用tomcat 7和java 1.7开发debian服务器.这是一个收到多个TCP连接的应用程序,每个TCP连接都是java进程打开的文件.
看着/proc/pid of java/fd
我发现,有时,打开文件的数量超过1024,当发生这种情况时,我会在catalina.out
日志中找到stacktrace_SocketException: Too many open files_
我发现有关此错误的一切,人们都提到了ulimit,我已经改变了这个问题并且错误一直在发生.这是配置:
在 /etc/security/limits.conf
root soft nofile 8192
root hard nofile 8192
Run Code Online (Sandbox Code Playgroud)
在 /etc/sysctl.conf
fs.file-max = 300000
Run Code Online (Sandbox Code Playgroud)
该ulimit -a
命令返回:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 8192
pipe size (512 bytes, …
Run Code Online (Sandbox Code Playgroud) 我无法找到这个问题的直接答案,但这里是:
假设我有一个拥有最大打开文件1024的主机:
[root@host]# ulimit -a
open files (-n) 1024
Run Code Online (Sandbox Code Playgroud)
以及在该主机中运行的docker容器:
[root@container]# ulimit -a
open files (-n) 1048576
Run Code Online (Sandbox Code Playgroud)
如果我尝试打开超过1024个文件,我会在容器中遇到问题吗?我认为在这种情况下容器的实际限制将是1024个文件.你怎么看?
我的设置如下所示:Windows 10, Release 1909 (Build 18363.1082),在 Ubuntu 20.04 环境中使用 WSL2。大多数时候一切都很好,但有些问题我无法解决。
在使用parcel
(React bundler) 进行开发期间,我遇到了 bundler 显然同时打开大量文件的问题,并且在某个时候,我遇到了以下问题:
EMFILE: too many open files, open '/home/myusername/Projects/some-project-path/node_modules/@material-ui/icons/esm/RoundedCornerRounded.js'
Run Code Online (Sandbox Code Playgroud)
由于parcel
看似不容易支持使用类似的东西graceful-fs
,我试图增加在 Ubuntu 环境中打开文件的限制。到目前为止我尝试过的:
ulimit -n 4096
(默认情况下是最高的),但显然(到目前为止?)还不够fs.files-max
非常高的值/etc/sysctl.conf
,但它似乎没有效果(无论sysctl -p
是在 重启之后还是重启之后wsl
)fs.inotify.max_user_watches
,但这似乎也没有效果/etc/security/limits.conf
似乎没有效果DefaultLimitNOFILE
中/etc/systemd/system.conf
可以有效果(所以我这样做,以及)有没有人设法在 WSL2 上的 Ubuntu 20.04 上解决类似的系统?这让我很困惑,它阻止我parcel
在这个环境中使用。这真的很遗憾,因为其他一切都运行良好。
所以我发现我在不同地方(可能是/etc/security/limits.conf
)的变化产生了某种影响。只是在直接登录时不会。这说明了这一点:
donmartin@SOMEMACHINE:~$ ulimit -Hn
4096
donmartin@SOMEMACHINE:~$ su donmartin
Password: …
Run Code Online (Sandbox Code Playgroud) 在Linux上,当进程打开文件时,操作系统将检查最大打开文件限制.
如果限制是1024,这个数字是什么意思?
它代表了吗?
从Ubuntu 14.04交换到16.04后,我的新redis服务器出现了问题.使用所有指南配置打开文件限制说使用以下设置更改/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
Run Code Online (Sandbox Code Playgroud)
并且还要添加到/etc/pam.d/common-session和/etc/pam.d/common-session-noninteractive
session required pam_limits.so
Run Code Online (Sandbox Code Playgroud)
我已经完成了所有这些更改,但redis仍然启动时文件限制为4096,在生产负载下,我们很快达到最大连接数.
我启动一个新的bash shell,并执行:
ulimit -m 102400
ulimit -a
"
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) 102400
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited …
Run Code Online (Sandbox Code Playgroud) 我错误地使用有限的服务器作为5000并行连接的iperf服务器.(限制是1024个进程)现在每次登录时,我都会看到:
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)
然后,我试图杀死他们,但是当我做ps时,我得到了这个:
-bash-4.1$ ps
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)
当我做一个killall或类似的事情时也会发生同样的事情.我甚至试图重启系统,但这又是我重启后得到的:
-bash-4.1$ sudo reboot
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: …
Run Code Online (Sandbox Code Playgroud)