是否有可能改变软-和硬限制一个的具体过程?
就我而言,我的流程是mongod
,许多网络资源告诉我只需执行:
ulimit -n <my new value>
我目前的想法:
- 该命令将如何知道我将要修改的进程的限制?这不会修改整个系统的打开文件限制吗?
- 我猜想此命令只会更改软限制。那么有没有办法增加硬限制呢?
是否有可能改变软-和硬限制一个的具体过程?
就我而言,我的流程是mongod
,许多网络资源告诉我只需执行:
ulimit -n <my new value>
我目前的想法:
Answers:
进程可以通过setrlimit(2)
系统调用更改其限制。运行时,ulimit -n
您应该会看到一个数字。这是当前进程打开文件描述符(包括文件,套接字,管道等)数量的限制。该ulimit
命令执行了getrlimit(2)
系统调用以找出当前值。
这是关键点:进程从其父进程继承其当前限制。因此,如果您运行了ulimit -n 64
该程序,则可以将外壳程序打开文件描述符的限制设置为64。外壳程序启动的任何进程都将具有相同的限制,除非该新进程setrlimit()
适当地调用。
要更改mongodb's
打开文件描述符的限制,您ulimit -n 2048
可以在shell中运行(或内核允许的任何大数字)。然后,您将使用该shell启动mongodb
。作为子进程,mongodb
它将继承打开文件描述符的(大)限制。
要修改系统的打开文件限制(看上去更像是所有进程打开文件描述符限制的总和),您必须执行诸如Modify /etc/sysctl.conf
and run之类的操作sysctl -p
。查看中的fs.file-max
参数值/etc/sysctl.conf
。
要更改正在运行的进程的限制,可以使用Utility命令prlimit
。
prlimit --pid 12345 --nofile=1024:1024
内部做的是调用setrlimit(2)
。prlimit的手册页应包含一些有用的调用示例。
来源:https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/
too many files open
错误。您的回答解决了我的问题,而没有停止该过程。
至少在Linux上,大多数发行版似乎都使用pam进行身份验证。pam随附的一个模块是极限模块。从README引用pam_limits:
The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.
因此,您可以在硬类别(root用户设置此类别,进程无法请求更高的类别)和软类别中设置每个用户,每个组和默认限制。通常将软限制设置为低于硬限制,并且应用程序可以将其向上增大,直到达到硬限制为止。
在您的情况下,如果您要增加作为普通用户运行的限制的过程,则可以增加该用户或组的限制。例如,我在某些需要打开额外文件句柄的服务器上有一些mysql cron作业,因此我将其设置为:
$ cat /etc/security/limits.d/mysql.conf
@mysql soft nofile 100000
@mysql hard nofile 200000
无需重启。当您向该用户求助时,您可以立即看到新的限制生效。
如果您使用的是典型的RedHat派生系统,则可以做的另一件事是将所需的ulimit调用放入/ etc / sysconfig / $ SERVICE脚本中。例如,apache的init脚本名为/etc/init.d/httpd,如果找到/ etc / sysconfig / httpd配置文件,它会提供源文件。我发现通过执行此操作而不是编辑init脚本本身更容易管理,因为init脚本在rpm升级时会更新,但是sysconfig文件仅在未更改默认值的情况下才更新。