为什么在更新到limits.conf之后,redis会报告1024个文件的限制?

我在redis.log文件的顶部看到这个错误:

当前最大打开的文件是1024. maxclients已经减less到4064,以弥补低ulimit

我已经按照这些步骤的信 (并重新启动):

而且,我运行ulimit时看到这个:

 ubuntu@ip-XX-XXX-XXX-XXX:~$ ulimit -n 65535 

这个错误似是而非吗? 如果不是,我还需要执行哪些其他步骤? 我正在Ubuntu LTS 14.04.1上运行Redis 2.8.13(树的顶端)(再次,树的顶端)。

这里是用户信息:

 ubuntu@ip-XX-XXX-XXX-XXX:~$ ps aux | grep redis root 1027 0.0 0.0 66328 2112 ? Ss 20:30 0:00 sudo -u ubuntu /usr/local/bin/redis-server /etc/redis/redis.conf ubuntu 1107 19.2 48.8 7629152 7531552 ? Sl 20:30 2:21 /usr/local/bin/redis-server *:6379 

因此,服务器是作为Ubuntu的运行。

这里是我的limits.conf文件没有评论:

 ubuntu@ip-XX-XXX-XXX-XXX:~$ cat /etc/security/limits.conf | sed '/^#/d;/^$/d' ubuntu soft nofile 65535 ubuntu hard nofile 65535 root soft nofile 65535 root hard nofile 65535 

这里是sysctl fs.file-max的输出:

 ubuntu@ip-XX-XXX-XXX-XXX:~$ sysctl -a| grep fs.file-max sysctl: permission denied on key 'fs.protected_hardlinks' sysctl: permission denied on key 'fs.protected_symlinks' fs.file-max = 1528687 sysctl: permission denied on key 'kernel.cad_pid' sysctl: permission denied on key 'kernel.usermodehelper.bset' sysctl: permission denied on key 'kernel.usermodehelper.inheritable' sysctl: permission denied on key 'net.ipv4.tcp_fastopen_key' 

作为sudo

 ubuntu@ip-10-102-154-226:~$ sudo sysctl -a| grep fs.file-max fs.file-max = 1528687 

另外,我在redis.log文件的顶部看到这个错误,不确定它是否相关。 这是有道理的,Ubuntu的用户不允许更改最大打开文件,但考虑到我试图设置的高ulimits他不应该需要:

 [1050] 23 Aug 21:00:43.572 # You requested maxclients of 10000 requiring at least 10032 max file descriptors. [1050] 23 Aug 21:00:43.572 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted. 

你应该在/etc/pam.d/目录下编辑你的文件。

在你运行sudo -u ubuntu /usr/local/bin/redis-server ,你应该在/etc/pam.d/sudo或者/etc/pam.d/common-session-noninteractive case /etc/pam.d/sudo包括这一个:

 session required pam_limits.so 

这应该有助于设置/etc/security/limits.conf提供的configuration。

用户find这个post的另一个build议,其问题与pam_limits.so无关。 就我而言,Redis是通过supervisord启动的。 在这种情况下,supervisord切换用户上下文导致新会话以系统默认限制运行的方法,而不是为用户configuration的方法。

在这种情况下find解决scheme。 简而言之,您需要通过ulimit -n作为supervisord中的启动命令的一部分来定义限制。

例:

 [program:redis-a] command=bash -c "ulimit -n 32768; exec /usr/local/bin/redis-server /etc/redis/a.conf" 

注意其他Ubuntu用户有类似的问题:

如果您是在启动时启动Redis,通过Upstart启动f.ex,则可以使用“限制”节来设置此限制。

所以对于nofile:

limit nofile 4096 4096