redis-server.service:失败,结果为“超时”。- 里面列出了更多错误

redis-server.service:失败,结果为“超时”。- 里面列出了更多错误

更新:这个问题似乎基本已经修复。我不确定我做了什么,但它正在运行,我的网站也加载正常。但是,我仍然遇到错误 #1,PID 不可读。

我希望能得到一些帮助,弄清楚为什么 Redis-Server 无法运行。大约 3 天前,我让它完全运行,但当我尝试从我的 WordPress 安装中删除其他缓存程序时。不知何故,我破坏了 Redis。接下来,我列出了错误,然后我尝试如何纠正它们。请让我知道你的想法以及我如何尝试修复它。

我最初从 redis.io 的源代码安装了 Redis-Server,但是一旦它坏了,我最终尝试从源代码重新安装,也尝试从 重新安装apt。我在两种类型的安装中都遇到了相同的错误。

uname -a:Linux 服务器名称.tld 4.4.0-97-generic #120-Ubuntu SMP 2017 年 9 月 19 日星期二 17:28:18 UTC x86_64 x86_64 x86_64 GNU/Linux
Ubuntu 16.04
Redis 服务器 4.0.2

我使用以下教程来安装 Redis-Server:在 Ubuntu 16.04 上为 WordPress PHP 7 安装 Redis 对象缓存

错误:

  1. redis-server.service:启动后 PID 文件 /var/run/redis/redis.pid 无法读取(目前?):没有此文件或目录

    • 我尝试通过确保 /var/run/redis/ 已创建来更正此问题。我还确保(在不同时间)/var/run/redis/ 由 redis:redis 和 redis:www-data(我的 apache2 组)拥有。我还尝试了 777、755、775、007、770 等多种权限方案。
      在所有这些情况下,我偶尔仍会收到错误。
    • 我还手动创建了具有上面提到的相同类型权限的 /var/run/redis/redis.pid 文件。
    • 最后,根据网站上的一些建议,我还将 PIDFile 更改为 redis-server.pid ...
    • 对于此错误信息,这些更改似乎都无法真正持久并持续起作用。
  2. 您请求的 maxclients 为 20000,这需要至少 20032 个最大文件描述符。服务器无法将最大打开文件数设置为 20032,因为操作系统错误:操作不允许。当前最大打开文件数为 4096。maxclients 已减少到 4064,以补偿较低的 ulimit。如果您需要更高的 maxclients,请增加“ulimit -n”。

    • 这似乎受到 redis.conf 文件中“MaxClients”部分的影响...我试图通过注释掉来更改 MaxClients 选项,但它将其设置为默认值 10000...我也在 redis.conf 中将其更改为 20000,这个数字上升到 20032...所以它似乎总是需要比我允许的多 32 个文件。
    • 我已将 /etc/systemd/system/redis-server.service 文件更改为包含“LimitNOFILE=64000”... 这没有什么不同。我已重新启动服务器 - 没有任何变化。
    • 我已经更改了 /etc/default/redis-server 并取消注释了“ULIMIT=65536”...重新启动,仍然没有变化。
  3. 警告:您的内核已启用透明大页面 (THP) 支持。这将导致 Redis 出现延迟和内存使用问题。要解决此问题,请以 root 身份运行命令“echo never > /sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的 /etc/rc.local,以便在重启后保留设置。禁用 THP 后必须重新启动 Redis

    • 我发出以下命令后,这个问题得到了纠正:
      echo never > /sys/kernel/mm/transparent_hugepage/enabled
      • 我还将上述命令添加到 /etc/rc.local,以便在重启后继续使用。同样,这个问题似乎已经解决了。
  4. 警告 overcommit_memory 设置为 0!内存不足时后台保存可能会失败。要解决此问题,请将“vm.overcommit_memory = 1”添加到 /etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overcommit_memory=1”以使此操作生效。

    • 我发出了以下命令来尝试解决此错误...它似乎只会有时出现:

      echo "vm.overcommit_memory=1" >> /etc/sysctl.conf;  sysctl -p 
      

    此错误偶尔会发生

  5. 警告:无法强制执行 511 的 TCP 积压设置,因为 /proc/sys/net/core/somaxconn 设置为较低的值 o

    • 我通过执行以下命令添加了以下内容:

      echo "net.core.somaxconn=65536" >> /etc/sysctl.conf    
      echo "net.ipv4.tcp_max_syn_backlog=8192" >> /etc/sysctl.conf    
      

    为了验证它们是否已被添加... sysctl -p

下面是我的整个 /etc/systemd/system/redis-server.service 文件。

[单元]  
描述=Redis 数据存储服务器  
之后=网络.目标  

[服务]  
类型=分叉  
PID文件=/var/run/redis/redis.pid  
用户=redis  
组=www-data  
限制NOFILE=64000  
权限启动仅=true  

\# 创建并设置 PIDFile 目录的权限  
ExecStartPre=/bin/mkdir -p /var/run/redis  
ExecStartPre=/bin/chown redis:www-data /var/run/redis  
ExecStartPre=/bin/chmod 775 -R /var/run/redis  

\# 创建并设置日志目录的权限  
\# 将此内容注释掉是因为我收到操作不被允许的错误。  
\#ExecStartPre=/bin/mkdir -p /var/log/redis  
\#ExecStartPre=/bin/chown redis -R /var/log/redis  
\#ExecStartPre=/bin/chmod 775 -R /var/log/redis  

\# 创建并设置日志文件的权限  
ExecStartPre=/bin/touch /var/log/redis/redis-server.log  
ExecStartPre=/bin/chown redis /var/log/redis/redis-server.log  
ExecStartPre=/bin/chmod 775 /var/log/redis/redis-server.log  

ExecStart=/sbin/start-stop-daemon --start --pidfile /var/run/redis/redis.pid --umask 007 --exec /usr/bin/redis-server -- /etc/redis/redis.conf  
ExecReload=/bin/kill -USR2 $MAINPID  
ExecStop=/usr/bin/redis-cli 关闭  
重启=总是  

[安装]  
WantedBy=多用户.目标

我已经束手无策了。在努力让 memcached 工作不起来之后,我转而使用 Redis-Server。memcached 唯一一次工作成功,是我在我的 WordPress 网站上试用的,速度超级快。我非常印象深刻非常对性能很满意。但显然我无法让它工作,这就是我寻求帮助的原因。

答案1

由于您没有提到其他变化,因此可能不太可能,但无论如何我都会发布。

这可能是 IPv6 / IPv4 问题。如果您在任何时候禁用 IPv6,您将得到您描述的结果。

查看 /var/log/redis/redis-server.log。这是我在我的系统中发现的内容:

17008:C 24 Aug 07:17:45.193 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
17008:C 24 Aug 07:17:45.193 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=17008, just started
17008:C 24 Aug 07:17:45.193 # Configuration loaded
17009:M 24 Aug 07:17:45.195 # Creating Server TCP listening socket ::1:6379: 
bind: Cannot assign requested address

Redis 尝试使用 IPv6 (::1:6379:)。我已在此系统上禁用 IPv6(出于某些原因),但默认 redis-cache 配置同时启用 IPv4 和 v6。如果您在该日志中看到“无法分配”错误,请查看 /etc/redis/redis.conf。“开箱即用”配置启用 IPv6 (::1):

bind 127.0.0.1 ::1

所以我删除了它,并将其改为:

bind 127.0.0.1

此后,Redis 就立即启动了。

希望有帮助!

答案2

尝试一下这个(测试过 Ubuntu 18.04):

sudo sh -c 'echo "httpd soft nofile 4096" >> /etc/security/limits.conf'
sudo sh -c 'echo "httpd hard nofile 10240" >> /etc/security/limits.conf'
sudo sh -c 'echo "fs.file-max = 100000" >> /etc/sysctl.conf'
sudo sh -c 'echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf'
sudo sh -c 'echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf'
sudo apt -y install redis-server redis-tools
sudo service redis-server stop
sudo sed -i '/^bind/s/bind.*/bind 0.0.0.0/' /etc/redis/redis.conf
if [ ! -d /var/run/redis ]; then sudo mkdir -p /var/run/redis && sudo chown redis /var/run/redis; fi
sudo service redis-server start

来源:Ntopng maravento.com

答案3

这是 @Chris 答案的补充,但来自另一个方面。有一个启用了 IPv6 的 Ubuntu 服务器,但redis-server尝试绑定到 IPv4...

11558:C 16 Mar 21:09:24.694 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11558:C 16 Mar 21:09:24.694 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=11558, just started
11558:C 16 Mar 21:09:24.694 # Configuration loaded
11569:M 16 Mar 21:09:24.709 # Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already in use

解决方案是将 redis.conf 从:

bind 127.0.0.1

...成为:

bind 127.0.0.1 ::1

之后工作正常...不过,请确保在任何与 IP 相关的更改之后重新启动服务器。

相关内容