Redis性能分析有几个大的方向。分别是
(1)基准对比
(2)配置优化
(3)数据持久化
(4)键值优化
(5)缓存淘汰
(6)Redis集群
基准对比
在没有业务实例运行的情况下,在服务器上通过测试Redis 实例的基准性能来对比有实例运行情况下的redis性能。通过以下步骤来判断Redis实例是否变慢:
1.为避免业务服务器到 Redis 服务器之间的网络延迟,可以直接在 Redis 服务器测试实例的延迟
redis-cli -h 127.0.0.1 -p 6379 --intrinsic-latency 60
2.测试时间段内Redis的最小、最大和平均时延
redis-cli -h 127.0.0.1 -p 6379 --latency-history -i 1
3.对比实例运行的redis延迟
1Gb/s的网络的延迟差不多是200us,如果指令的响应延迟明显大于200us,可能是请求队列过多导致。此时total_commands_processed增长会很快
如果是个别指令很慢导致的延迟增加,那么可以看到total_commands_processed下降或者不变,而Redis性能却在明显下降
如果实例的延迟时间是Redis基准性能时间的1.5-2倍以上,可以认为这个Redis实例性能比较差
配置优化
linux配置优化
vm.overcommit_memory
Redis是内存数据库,优先使用内存。设置overcommit 为1是为了让 fork 在低内存下也可以执行成功。
0 内存不足时需要检查
1 允许超量使用内存
2 内存使用不能超过swap 50%,50%是overcommit-ration默认值
禁用thp
Linux支持大内存页(2MB)分配,默认开启。开启时可以降低 fork 子进程的速度,但 fork 操作之后,每个内存页从原来 4KB 变为 2MB,会大幅增加内存消耗,同时拖慢写操作时间,产生大量写操作慢查询。因此 Redis 日志中需要禁用此特性
echo never > /sys/kernel/mm/transparent_hugepage/enabled
Redis配置优化
daemonize no
Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程
timeout 300
当客户端闲置多长秒后关闭连接,如果指定为 0 ,表示关闭该功能
loglevel notice
指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice
logfile stdout
日志记录方式,默认为标准输出,如果配置 Redis 为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给 /dev/null
databases 16
设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
#RDB 持久化
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
#AOF持久化配置
appendonly yes #开启AOF持久化,默认为no
appendfilename "appendonly.aof" #指定更新日志文件名
appendfsync always #每次有数据修改发生时都会写入AOF文件
#appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略
#appendfsync no #从不同步。高效但是数据不会被持久化
rdbcompression yes
指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩。如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大
dbfilename dump.rdb
指定本地数据库文件名,默认值为 dump.rdb
requirepass foobared
Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH <password> 命令提供密码,默认关闭
maxclients 128
设置同一时间最大客户端连接数,默认无限制。Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxmemory <bytes>
指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中。达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读操作。
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
指定在hash或者list超过一定的数量或者某一临界值时,采用特殊的算法
tcp-backlog
超过最大连接数时,由backlog持有
slowlog-log-slower-than xxxms
执行时间慢于xxx毫秒的命令计入Slow Log
slowlog-max-len xxx
#Slow Log的长度,即最大纪录多少条Slow Log