Redis服务器高cpu调试策略

Redis服务器高cpu调试策略

最近,我们注意到生产环境中的 CPU 峰值是由 redis 引起的,如下所示:

在此处输入图片描述

为了解决这个问题,我每天大约重新启动两次 redis 服务器 :( 这显然远非理想。我想找出根本原因。

以下是我目前调查过的一些事项:
1) 查看 redis 日志文件中的任何异常。以下内容似乎很可疑:

在此处输入图片描述

2) 研究了 nginx 访问日志,看看我们是否遇到了异常高的流量。答案是否定的。

3) New Relic 透露该问题始于 16 年 11 月 21 日(大约一个月前),但当时没有发布任何代码。

以下是有关我们设置的一些详细信息:

Redis 服务器: Redis server v=2.8.17 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=64a9cf396cbcc4c7

PHP的: 5.3.27使用 fpm

Redis 配置:

daemonize yes
pidfile /var/run/redis/redis.pid
port 6379
timeout 0
tcp-keepalive 0
loglevel notice
logfile /var/log/redis/redis.log
syslog-enabled yes
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename redis.rdb
dir /var/lib/redis/
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
maxmemory 15GB
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
include /etc/redis/conf.d/local.conf

框架:Magento 1.7.2 和 Cm_Cache_Backend_Redis

根据以上信息,请让我知道我可以采取什么措施来缓解高 CPU 使用率。

答案1

非常重要的更新

您的服务器可能已被黑客入侵。造成高 CPU 使用率的不是 Redis,而是一个单独的命令 yam(请查看 htop 的最右侧,我第一次没注意到)。yam 命令用于 Redis 的一个著名漏洞,通常会导致高 CPU 使用率。您需要仔细检查以确保您的服务器是安全的。

如果您想了解有关此漏洞的更多信息以及如何保护自己,可以参考以下一些文章和链接:


以下是我针对 magento/redis 性能问题的清单:

  1. 确保您使用的是较新的 Redis 版本,例如 3.2,如果在 CentOS 上,我个人更喜欢来自 IUS 存储库的 redis32u。
  2. 检查你的 Redis 数据库的大小,它应该在/var/lib/redis,并确保它相对较小。
  3. 验证您是否有足够的内存用于 Redis。您指定的内存maxmemory为 15GB,这对于 magento 来说实在是太大了。我通常使用更接近 的值256mb。如果您使用 Redis 的次数如此之多(!!!!!!),那么您的 magento 堆栈中可能存在其他问题。
  4. 确保已在 syscntl 中设置 vm overcommit 设置。 https://redis.io/topics/admin(有关您所需的更多详细信息,请参阅此链接)
  5. 确保您有足够的打开文件限制来处理与 Redis 的连接数量。

一般来说,日志文件并不可疑,因为您的 Redis 保存设置会告诉 Redis,如果写入次数超过 10000 次,则每分钟保存一次;如果写入次数超过 10 次,则每五分钟保存一次;如果写入次数超过 1 次,则每 15 分钟保存一次。因此,它实际上是每分钟将信息保存回磁盘,这应该不会太麻烦。

相关内容