我最近检查了我们的一个redis进程,以便在使用的地方限制哪些内容:
cat /proc/<redis-pid>/limits
并惊讶地发现,这是在默认值低:
Limit Soft Limit Hard Limit Max open files 4016 4016
我很惊讶,因为我们有以下configuration:
# /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挤压。
在Linux中,可以根据需求types在不同的位置设置资源限制。
/etc/security/limits.conf文件。 /etc/sysctl.conf文件。 ulimit命令 /etc/security/limits.conf是pam_limits的一部分,因此在login会话期间,pam_limits模块会读取此文件中设置的限制。 login会话可以通过ssh或通过terminal 。 而pam_limits不会影响这里提到的守护进程。
/etc/sysctl.conf是系统全局configuration,我们不能在这里设置用户特定的configuration。 它将所有用户/进程可以使用的最大资源量设置在一起。
ulimit命令用于设置shell的限制。 所以当在shell上设置了ulimit的限制时,由于child processinheritanceparent processes属性的规则,从shell派生的进程也会获取该值。
因此,对于你的情况,由于redis是作为init一部分启动的,以上都不会直接帮助你。 这样做的正确方法是,您必须使用ulimit命令在init脚本本身中设置新值。 如下面的脚本,
ulimit -n 100000 if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.
在wishlist中已经有一个bug,可以将ulimitfunction添加到start-stop-daemon 。
如果有任何提供限制的方法,请检查redisconfiguration。
sysctl fs.file-max参数是全局的系统限制,我不认为设置ulimit是一个好主意。
如果你在ulimit 100000和sysctl.conf 100000中设置,一个用户可以阻塞系统
任何方式,谈论你的问题,你可以肯定,你的系统使用pam_limits
man pam_limits grep -i limit /etc/pam.d/*
你已经为sshd启用了pam_limits,但是这个命令是从SSH会话执行的吗? 您可能需要将同一行添加到/etc/pam.d/login和/或/etc/pam.d/su和/或/etc/pam.d/sudo 。