工作进程的“最大打开文件数”

30

有没有可能增加工作进程的“最大打开文件数”参数? 我指的是这个参数:

cat /proc/<pid>/limits | grep files
感谢您的建议。

附加信息:我的进程是“Java”。我需要在不停止进程的情况下增加“最大打开文件数”。 - wako
8个回答

33

另一个选项是使用 prlimit 命令(在 util-linux 包中)。例如,如果您想将运行中的进程的最大打开文件数设置为 4096:

prlimit -n4096 -p 进程的pid


我正在使用Linux Mint(基于Ubuntu),但在默认安装中找不到它。通常它是util-linux软件包的一部分,但即使在Mint上安装此软件包也没有这个命令。 - rkachach
➜ ~ lsb_release -d 描述:Ubuntu 16.04.1 LTS ➜ ~ whereis prlimit prlimit:/usr/bin/prlimit /usr/share/man/man2/prlimit.2.gz /usr/share/man/man1/prlimit.1.g - t2d
1
在CentOS 6上找不到prlimit。 - Arvy
尝试安装util-linux RPM包或相应的软件包。 - rkachach
这是一个持久性的变化,即使系统重新启动,它也会保持不变吗? - undefined
@Shawn 我不这么认为 - undefined

28

作为系统管理员:大多数Linux安装版本都可以通过/etc/security/limits.conf文件控制用户的限制,您可以设置每个用户的限制。您需要一行像这样的代码:myuser - nofile 1000

在进程内部getrlimit和setrlimit调用可控制大多数进程资源分配限制。 RLIMIT_NOFILE 控制文件描述符的最大数量。您需要适当的权限才能调用它。


看起来这正是我需要的。我能为一些外部进程设置“setrlimit(RLIMIT_NOFILE,...)”吗? - wako
我不知道有没有这样的东西。如果有的话,我猜你会在一些Linux特定的编程指南中找到它,因为我无法想象标准POSIX会把它放在哪里。 - user79758
3
有时候 limits.conf 文件并未生效,需要在 /etc/systemd/system.confuser.conf 中设置 DefaultLimitNOFILE。请注意,在翻译过程中我没有改变原文的意思,并尽力使语言简洁易懂。 - Xdg
从来没有工作过,即使重新启动系统,prlimit -n4096 -p pid_of_process也解决了问题。 - undefined

6
您可以使用gdb,中断进程,调用上述系统调用以提高您感兴趣的限制,然后继续作业并退出gdb。我以这种方式动态编辑过几次内容。此时,您的应用程序不会崩溃,但只是在执行调用时暂停。如果您迅速行动(或编写脚本!),那么很可能不会被注意到。

+1 好建议,这篇帖子这篇博客描述了如何实现。 - Steve Kehlet
是的,这有点像调整矩阵使事情正常运转...停止世界,编辑变量,继续世界...哦!似曾相识!我就是那个人!(好吧,只要我有gdb!) - lornix
4
在现代 Linux 发行版上,您可以使用 prlimit - Mircea Vutcovici

5
这个链接详细介绍了如何在系统范围或每个用户中更改此设置。

许多应用程序,如Oracle数据库或Apache Web服务器,需要较高的文件打开数。因此,您可以通过在内核变量/proc/sys/fs/file-max中设置新值来增加最大文件打开数,方法如下(以root身份登录):

$ sysctl -w fs.file-max=100000

您需要编辑/etc/sysctl.conf文件,并添加以下行,以便在重新启动后该设置保持不变。


谢谢提供链接。但在询问之前我已经找到了 :-) 但问题是如何在运行时更改参数,而不停止进程,并且是进程范围内的。 - wako
@wako:除非你正在运行最新的开发内核(这很不可能),否则无法从进程外部完成此操作。 - caf
@caf:谢谢。这正是我想听到的。 - wako
请查看@rkachach在上面答案中的评论。使用命令prlimit。 - Ziferius

5
echo -n "Max open files=20:20" > /proc/$pid/limits

...在RHEL5.5和RHEL6.7中工作。

请注意,“-n”是必须的;如果有一个尾随的换行符,会导致关于无效参数的投诉。


4

是的,可以在运行时增加/proc/<pid>/limits中的限制。只需找到pid并执行以下命令:

echo -n "Max open files=20:20" > /proc/$pid/limits

3
无法在Ubuntu 14.04.2 LTS上运行。 - bronze man
在Ubuntu 18.04 LTS上,“无效参数”。 - rdesgroppes

4
下面的命令分别给出了默认限制下每个进程可允许的最大打开文件数(软限制和硬限制):
ulimit -Sa
ulimit -Ha

您可以使用程序或命令来更改这些限制。请参阅ulimit(man ulimit)。


3
在Ubuntu 16.04上,当rethinkdb进程运行时,这些解决方案都无法解决问题。我一直收到错误信息:error: accept() failed: Too many open files.最终在我的/etc/security/limits.conf文件中实现了以下内容。请注意,在nofile之外增加了nproc。据我所知,需要单独指定root用户。
*                soft    nofile          200000
*                hard    nofile          1048576
root             soft    nofile          200000
root             hard    nofile          1048576
*                soft    nproc           200000
*                hard    nproc           1048576
root             soft    nproc           200000
root             hard    nproc           1048576

您可以通过运行 cat /proc/sys/fs/file-max 命令来查看系统的最大文件数。我将我的设置为合理范围内的较高值,以适应服务器的大小。

您可以通过运行 cat /proc/{your-pid}/limits 命令来验证进程允许的最大打开文件数。

有用的文章: https://medium.com/@muhammadtriwibowo/set-permanently-ulimit-n-open-files-in-ubuntu-4d61064429a


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接