![修改特定进程的ulimit(打开文件)](https://linux22.com/image/31964/%E4%BF%AE%E6%94%B9%E7%89%B9%E5%AE%9A%E8%BF%9B%E7%A8%8B%E7%9A%84ulimit%EF%BC%88%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6%EF%BC%89.png)
是否可以更改柔软的 -和硬限制的具体的过程?
就我而言,我的流程是mongod
,很多网络资源告诉我只需执行:
ulimit -n <my new value>
我目前的想法:
- 命令如何知道的限制过程我要修改的?这不会修改整个系统的打开文件限制吗?
- 我猜这个命令只会改变软限制。那么有没有办法增加硬限制呢?
答案1
要更改正在运行的进程的限制,您可以使用实用程序命令prlimit
。
prlimit --pid 12345 --nofile=1024:1024
它的内部作用是调用setrlimit(2)
. prlimit 的手册页应该包含一些有用的调用示例。
来源:https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/
答案2
进程可以通过setrlimit(2)
系统调用更改其限制。当您跑步时,ulimit -n
您应该会看到一个数字。这是进程打开的文件描述符(包括文件、套接字、管道等)数量的当前限制。该ulimit
命令执行getrlimit(2)
系统调用以查明当前值是多少。
关键点是:进程从其父进程继承其当前限制。因此,如果您运行,ulimit -n 64
则将该 shell 的打开文件描述符限制设置为 64。shell 启动的任何进程都将具有相同的限制,除非该新进程setrlimit()
适当调用。
要更改mongodb's
打开文件描述符限制,您可以ulimit -n 2048
在 shell 中运行(或内核允许的任何大数量)。然后您可以使用该 shell 来启动mongodb
。作为子进程,mongodb
将继承打开文件描述符的(大)限制。
要修改系统的打开文件限制(这看起来更像是所有进程打开文件描述符限制的总和),您必须执行诸如“修改”/etc/sysctl.conf
和“运行”之类的操作sysctl -p
。查看fs.file-max
中参数的值/etc/sysctl.conf
。
答案3
至少在 Linux 上,大多数发行版似乎都使用 pam 进行身份验证。 pam 附带的一个模块是限制模块。引用 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.
因此,您可以在硬限制(根设置此设置并且进程无法请求更高)和软限制中设置每个用户、每个组和默认限制。软限制通常设置为低于硬限制,应用程序可以向上增加它,直到达到硬限制。
在您的情况下,如果您想要增加以普通用户身份运行的进程的限制,您可以增加该用户或组的限制。举个例子,我在一些服务器上有一些 mysql cron 作业,需要打开额外的文件句柄,所以我设置了这个:
$ cat /etc/security/limits.d/mysql.conf
@mysql soft nofile 100000
@mysql hard nofile 200000
没有什么需要重新启动的;当您su到该用户时,您可以立即看到新的限制生效。
如果您使用的是典型的 RedHat 派生系统,您可以做的另一件事是将所需的 ulimit 调用放入 /etc/sysconfig/$SERVICE 脚本中。例如,apache 的 init 脚本名为 /etc/init.d/httpd,并且它会查找 /etc/sysconfig/httpd 配置文件(如果找到)。我发现这样做比编辑 init 脚本本身更容易管理,因为 init 脚本会在 rpm 升级时更新,但 sysconfig 文件只有在默认值没有更改的情况下才会更新。
答案4
该命令如何知道我要修改的进程的限制?这不会修改整个系统的打开文件限制吗?
该命令将更改当前进程(您的 shell)和任何子进程(您随后从 shell 运行的任何进程)的限制。
进程以树的形式组织。每个进程都有一个父进程(调用它)。进程号 1 init 是一个特殊进程,因为它是它自己的父进程。像 htop 或 top 这样的工具可以向您显示显示为父级和子级树的进程。