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


27

是否有可能改变软-硬限制一个的具体过程?

就我而言,我的流程是mongod,许多网络资源告诉我只需执行:

ulimit -n <my new value>

我目前的想法:

  • 该命令将如何知道我将要修改的进程的限制?这不会修改整个系统的打开文件限制吗?
  • 我猜想此命令只会更改软限制。那么有没有办法增加硬限制呢?

您阅读了这些有价值的信息吗? docs.mongodb.org/manual/reference/ulimit
天衣

是的,我全心全意地学习了所有内容。.我不确定是否遗漏了什么,但是该页面仅告诉您如何查看详细信息。它只告诉您写ulimit -n <值> ...
测试

Answers:


29

进程可以通过setrlimit(2)系统调用更改其限制。运行时,ulimit -n您应该会看到一个数字。这是当前进程打开文件描述符(包括文件,套接字,管道等)数量的限制。该ulimit命令执行了getrlimit(2)系统调用以找出当前值。

这是关键点:进程从其父进程继承其当前限制。因此,如果您运行了ulimit -n 64该程序,则可以将外壳程序打开文件描述符的限制设置为64。外壳程序启动的任何进程都将具有相同的限制,除非该新进程setrlimit()适当地调用。

要更改mongodb's打开文件描述符的限制,您ulimit -n 2048可以在shell中运行(或内核允许的任何大数字)。然后,您将使用该shell启动mongodb。作为子进程,mongodb它将继承打开文件描述符的(大)限制。

要修改系统的打开文件限制(看上去更像是所有进程打开文件描述符限制的总和),您必须执行诸如Modify /etc/sysctl.confand run之类的操作sysctl -p。查看中的fs.file-max参数值/etc/sysctl.conf


很好的解释!非常感谢你。我将立即尝试!
测试

这个答案对我有很大帮助,但是现在的问题是硬限制是2048,在我看来,这还不够。1)如何找到内核允许的限制?2)是否可以立即更改HARD LIMIT?再次感谢!
测试

@test-我从来没有提高硬限制。发现了这一点:blog.samat.org/2011/04/05/… 和此wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux他们说的是同一句话。
布鲁斯·埃迪格

18

要更改正在运行的进程的限制,可以使用Utility命令prlimit

prlimit --pid 12345 --nofile=1024:1024

内部做的是调用setrlimit(2)。prlimit的手册页应包含一些有用的调用示例。

来源:https//sig-io.nl/posts/run-time-editing-of-limits-in-linux/


这节省了我的时间,谢谢。我有一个运行很长时间的Python程序,它会产生too many files open错误。您的回答解决了我的问题,而没有停止该过程。
Visionscaper

1

至少在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文件仅在未更改默认值的情况下才更新。


最佳和最实用的解决方案。
nelaaro

0

该命令将如何知道我将要修改的进程的限制?这不会修改整个系统的打开文件限制吗?

该命令将更改当前进程(您的shell)和任何子进程(您随后在shell中运行的所有进程)的限制。

流程以树状组织。每个进程都有一个父进程(调用它)。进程号1(init)是一个特殊的进程,因为它是其自己的父进程。像htop或top这样的工具可以向您显示以父母和孩子的树的形式显示的进程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.