为什么即使更新 limits.conf 后,redis 仍会报告 1024 个文件的限制?

为什么即使更新 limits.conf 后,redis 仍会报告 1024 个文件的限制?

我在 redis.log 文件顶部看到此错误:

当前最大打开文件数为 1024。maxclients 已减少至 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 用户不允许更改最大打开文件数是有道理的,但考虑到我尝试设置的较高 ulimit,他应该不需要这样做:

[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.

答案1

您应该编辑目录内的文件/etc/pam.d/

在您运行的情况下sudo -u ubuntu /usr/local/bin/redis-server,您应该将以下行添加到/etc/pam.d/sudo或添加到,/etc/pam.d/common-session-noninteractive以防/etc/pam.d/sudo包含这一行:

session required pam_limits.so

这应该有助于设置内部提供的配置/etc/security/limits.conf

答案2

对于发现此帖子但问题与 pam_limits.so 无关的用户,还有另一个建议。在我的例子中,Redis 是通过 Supervisord 启动的。在本例中,Supervisord 切换用户上下文的方法导致新会话以系统默认限制运行,而不是我为用户配置的限制。

在这种情况下找到了解决方案这里简而言之,您需要通过 ulimit -n 作为 Supervisord 中的启动命令的一部分来定义限制。

例子:

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

答案3

以及增加打开文件限制。您需要在 redis.conf 中增加 maxclients。默认情况下,它只有 10000。

# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
maxclients 1024000

答案4

对于遇到类似问题的其他 Ubuntu 用户请注意:

如果您在启动时启动 Redis,例如通过 Upstart,您可以使用“limit”节设置此限制。

因此对于 nofile:

limit nofile 4096 4096

相关内容