Ulimit文件描述符限制不适用于特定进程


14

我最近检查了我们的Redis流程之一,使用以下方法对ulimit进行了应用:

cat /proc/<redis-pid>/limits

很惊讶地得知这是默认的低值:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

我很惊讶,因为我们配置了以下内容:

# /etc/sysctl.conf 
fs.file-max = 100000

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

# /etc/ssh/sshd_config
UsePAM yes

# /etc/pam.d/sshd
session required pam_limits.so

谁能告诉我为什么未将增加的ulimit应用于正在运行的Redis进程?

Redis进程以用户“ redis”的身份运行,由于限制增加,服务器已重新启动。我们在Debian Squeeze上。

Answers:


19

在Linux中,可以根据需求类型在各个位置设置资源限制。

  1. /etc/security/limits.conf 文件。
  2. /etc/sysctl.conf 文件。
  3. ulimit 命令

/etc/security/limits.confpam_limits的一部分,因此在登录会话期间pam_limits模块将读取此文件中设置的限制。登录会话可以通过ssh或通过terminal。而且pam_limits不会影响此处提到的守护进程。

/etc/sysctl.conf是系统范围的全局配置,我们无法在此处设置用户特定的配置。它设置放置在所有用户/进程上的最大资源量。

ulimit命令用于设置外壳的限制。因此,当ulimit在shell上设置限制时,由于child process继承parent processes属性的规则,从shell产生的进程也将获得该值。

因此,对于您的情况,由于以上都不是任何内容的redis一部分而启动init,将直接为您提供帮助。正确的做法是,您必须使用ulimit命令在初始化脚本本身中设置新值。像下面的脚本一样,

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

愿望清单中已经存在一个错误,可以向中添加ulimit功能start-stop-daemon

另外,请检查redis配置中是否有任何限制的方法。


伟大的摘要Kannan!现在,我将ulimit添加到启动脚本中。遗憾的是,没有办法只为将与妖魔化的进程一起工作的用户设置限制(因为我们有多个启动脚本),但这是可行的。谢谢!
2014年

好答案。子进程继承了父进程的属性,这让我感到惊讶,对于运行子进程的用户而言,所有限制看起来都是正确的,但使用的是父进程所有者的限制。
同步

2

sysctl fs.file-max参数是广泛的全局系统限制,我认为在ulimit中设置相同的值不是一个好主意。

如果同时在ulimit 100000和sysctl.conf 100000中设置,则一个用户可以阻止系统

无论如何,谈论您的问题,您可以肯定地说,您的系统使用pam_limits

man pam_limits
grep -i limit /etc/pam.d/*

谢谢-我将考虑提高fs.file-max值。关于pam-我相信我们正在使用它(我在问题中添加了一些额外的配置)。不过,我不确定我是否了解PAM,因为我们的设置似乎与SSH有关,该用户未使用它。我还需要配置其他文件吗?我总是可以在redis的初始化脚本中放置ulimit设置,但宁愿不必这样做。
UpTheCreek 2014年

2

您已为sshd启用pam_limits,但是此命令是否正在SSH会话中执行?您可能需要向/etc/pam.d/login和/或/etc/pam.d/su和/或添加同一行/etc/pam.d/sudo


谢谢。我怀疑那是不对的。该进程正在启动在的init.d脚本这一行:if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS。在这种情况下,哪种模式合适?
UpTheCreek 2014年

在脚本中,您可以使用ulimit -n 100000
c4f4t0r 2014年

init.d脚本是否使用su [user] -c命令以另一个用户身份启动脚本,或者您的程序是否以root用户身份运行?如果正在使用su,则将其放入/etc/pam.d/su。如果以as身份运行root,则最好使用c4f4t0r建议ulimit在初始化脚本中添加命令的建议。root允许设置它想要的任何限制,因此您真的不必担心这种情况下的pam。
Omnipresence 2014年

1
谢谢。它使用--chuid redis:redisstart-stop-daemon。我现在已将ulimit添加到启动脚本中。
2014年
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.