修改特定进程的ulimit(打开文件)

修改特定进程的ulimit(打开文件)

是否可以更改柔软的 -硬限制具体的过程?

就我而言,我的流程是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 这样的工具可以向您显示显示为父级和子级树的进程。

相关内容