为啥redis不能设置最大打开文件

Posted

技术标签:

【中文标题】为啥redis不能设置最大打开文件【英文标题】:Why redis can not set maximum open file为什么redis不能设置最大打开文件 【发布时间】:2016-08-21 04:34:05 【问题描述】: 1167:M 26 Apr 13:00:34.666 # 您请求的 maxclients 为 10000,需要至少 10032 个最大文件描述符。 1167:M 26 Apr 13:00:34.667 # Redis 无法将最大打开文件数设置为 10032,因为操作系统错误:不允许操作。 1167:M 26 Apr 13:00:34.667 # 当前最大打开文件数为 4096。maxclients 已减少到 4064 以补偿低 ulimit。如果您需要更高的 maxclients,请增加“ulimit -n”。 1167:M 26 Apr 13:00:34.685 # 创建服务器 TCP 侦听套接字 192.34.62.56​​:6379:名称或服务未知 1135:M 26 Apr 20:34:24.308 # 您请求的 maxclients 为 10000,需要至少 10032 个最大文件描述符。 1135:M 26 Apr 20:34:24.309 # Redis 无法将最大打开文件数设置为 10032,因为操作系统错误:不允许操作。 1135:M 26 Apr 20:34:24.309 # 当前最大打开文件数为 4096。maxclients 已减少到 4064 以补偿低 ulimit。如果您需要更高的 maxclients,请增加“ulimit -n”。 1135:M 26 Apr 20:34:24.330 # 创建服务器 TCP 侦听套接字 192.34.62.56​​​:6379:名称或服务未知

【问题讨论】:

【参考方案1】:

好吧,这篇文章有点晚了,但是因为我刚刚花了很多时间(整个晚上)在 ubuntu 16.04 上配置一个新的 redis 服务器 3.0.6。我想我应该写下我是如何做到的,这样其他人就不必浪费时间了……

对于新安装的 redis 服务器,您可能会在 redis 日志文件中看到以下问题,即 /var/log/redis/redis-server.log

最大打开文件数

3917:M 16 Sep 21:59:47.834 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
3917:M 16 Sep 21:59:47.834 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
3917:M 16 Sep 21:59:47.834 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.

我看到很多帖子告诉你修改

/etc/security/limits.conf
redis soft nofile 10000
redis hard nofile 10000

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

这可能在 ubuntu 14.04 中有效,但在 ubuntu 16.04 中肯定无效。 我想这与从 upstart 到 systemd 的转变有关,但我不是 linux 内核专家!

要解决此问题,您必须使用 systemd 方式

/etc/systemd/system/redis.service
[Service]
...
User=redis
Group=redis
# should be fine as long as you add it under [Service] block
LimitNOFILE=65536
...

那么你必须重新加载守护进程并重启服务

sudo systemctl daemon-reload
sudo systemctl restart redis.service

要检查它是否有效,请尝试 cat proc 限制

cat /run/redis/redis-server.pid
cat /proc/PID/limits

你会看到

Max open files            65536                65536                files     
Max locked memory         65536                65536                bytes   

这个阶段解决了最大打开文件数。

套接字最大连接数

2222:M 16 Sep 20:38:44.637 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

内存过量使用

2222:M 16 Sep 20:38:44.637 # Server started, Redis version 3.0.6
2222:M 16 Sep 20:38:44.637 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

由于这两个是相关的,我们马上解决。

sudo vi /etc/sysctl.conf

# Add at the bottom of file
vm.overcommit_memory = 1
net.core.somaxconn=1024

现在要让这些配置生效,您需要重新加载配置

sudo sysctl -p

透明的大页面

1565:M 16 Sep 22:48:00.993 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

要永久解决这个问题,请按照日志的建议,修改 rc.local

sudo vi /etc/rc.local

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

这需要您重新启动、备份您的数据或执行任何您需要的操作!!

sudo reboot

现在再次检查你的 redis 日志,你应该有一个没有任何错误或警告的 redis 服务器。

【讨论】:

非常感谢~我找到并尝试了同样的旧解决方案,但整晚都徒劳无功~你节省了我的另一个晚上 关于 THP,如果你在 Centos 7 上,你可以按照这个指南:thegeekdiary.com/…【参考方案2】:

Redis 永远不会更改最大打开文件数。

这是一个操作系统配置,也可以基于每个用户进行配置。该错误是描述性的并告诉您:“增加'ulimit -n'”

您可以参考这篇博文了解如何增加最大打开文件描述符: http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/

【讨论】:

【参考方案3】:

你只需要控制台中的这个命令:

sudo ulimit -n 65535

【讨论】:

尝试编辑 .bashrc 文件 vi /root/.bashrc 并添加以下行:# vi /root/.bashrc ulimit -u unlimited 你也可以阅读这个页面:***.com/questions/34588/… 这不会在重启后持续存在。

以上是关于为啥redis不能设置最大打开文件的主要内容,如果未能解决你的问题,请参考以下文章

xmind文件为啥不能默认xmind打开?

为啥html文件的默认打开方式是edge还没法改

电脑文件夹双击为啥老是用ACD打开?

◆为啥电脑一打开浏览器页面就变暗了

设置Redis最大占用内存

为啥在arcgis10中mxd格式不能打开