CentOS 上 Redis 性能优化要点
一 系统层优化
- 文件描述符与进程限制
- 提升 Redis 可用文件句柄,避免“max number of clients reached”。在 /etc/security/limits.conf 增加:redis soft nofile 65535;redis hard nofile 65535。必要时提高系统级 fs.file-max。并确保 systemd 服务段包含 LimitNOFILE=65535,执行
systemctl daemon-reexec 后重启服务生效。
- TCP 连接队列
- 提高已完成连接队列长度,避免高并发握手拥塞。设置内核 net.core.somaxconn=2048(或更高),Redis 配置 tcp-backlog 2048(必须 ≤ somaxconn)。
- 内存与交换策略
- 避免 swap 对延迟的影响:设置 vm.swappiness=1(或 0,视内核版本而定)。为支持后台持久化与复制的大页分配,设置 vm.overcommit_memory=1,降低 fork/快照失败风险。
- 透明大页 THP
- 关闭 THP 以减少 fork 与写放大带来的延迟抖动:执行
echo never > /sys/kernel/mm/transparent_hugepage/enabled,并在 /etc/rc.local 或 systemd-tmpfiles 中持久化。
- OOM 防护
- 降低 Redis 被 OOM Killer 终止的概率:写入 /proc/<redis_pid>/oom_score_adj -1000(或在 systemd 服务中设置 OOMScoreAdjust=-1000)。
二 Redis 配置优化
- 内存与淘汰
- 设置 maxmemory <可用物理内存的70%~80%>,保留 20%~30% 给系统与其他进程;根据业务选择淘汰策略:allkeys-lru / volatile-lru / allkeys-lfu 等。
- 持久化策略
- 通用平衡方案:RDB 使用默认快照策略(如 save 900 1;save 300 10;save 60 10000),AOF 开启并设为 appendfsync everysec;AOF 重写阈值 auto-aof-rewrite-percentage 100、auto-aof-rewrite-min-size 64mb;启用 aof-use-rdb-preamble yes 提升重写效率。
- 复制与输出缓冲
- 主从复制场景适当调大复制缓冲,避免链路抖动时断链重传:设置 client-output-buffer-limit replica 256mb 64mb 60(单位分别为硬限/软限/秒)。
- 网络与超时
- 开启 tcp-keepalive 300,减少长连接空闲被网络设备回收;按需调整 timeout。
- 慢查询与事件循环
- 打开慢查询日志定位性能瓶颈:slowlog-log-slower-than 10000(微秒)、slowlog-max-len 128;适度提高 hz 10~20 提升键空间维护与过期清理频率(注意 CPU 使用率)。
- 惰性释放
- 启用惰性删除减轻阻塞:lazyfree-lazy-eviction yes;lazyfree-lazy-expire yes;lazyfree-lazy-server-del yes(Redis 4.0+)。
- 内存分配器
- 使用 jemalloc 并开启后台线程(Redis 6+):jemalloc-bg-thread yes,降低内存碎片与分配抖动。
三 典型配置片段
# 内存与淘汰
maxmemory 8gb
maxmemory-policy allkeys-lru
# 持久化(RDB + AOF 平衡)
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes
# 网络与超时
bind 0.0.0.0
port 6379
tcp-backlog 2048
timeout 0
tcp-keepalive 300
protected-mode yes
requirepass YourStrongPass
# 复制缓冲(主从)
client-output-buffer-limit replica 256mb 64mb 60
# 慢查询与维护
slowlog-log-slower-than 10000
slowlog-max-len 128
hz 10
dynamic-hz yes
# 惰性释放
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
# 碎片整理(可选,低峰时执行)
activedefrag yes
active-defrag-ignore-bytes 100mb
active-defrag-threshold-lower 10
active-defrag-cycle-min 5
active-defrag-cycle-max 75
提示:bind 与 protected-mode 的组合需兼顾安全与可达性;公网暴露务必配合 密码 + 防火墙/安全组 与最小权限原则。
四 验证与监控
- 基线压测
- 使用 redis-benchmark 建立基线:
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -t set,get,在变更前后对比 P95/P99 延迟 与 QPS。
- 运行时观测
- 关注 INFO 关键项:
used_memory_rss、mem_fragmentation_ratio、instantaneous_ops_per_sec、blocked_clients、rejected_connections、sync_partial_err;慢查询日志定位热点命令与不合理调用模式。
- 连接与队列
- 监控 ESTABLISHED 连接数与内核队列溢出(
netstat -s | grep -i listen);若 rejected_connections 增长,优先检查 maxclients 与 somaxconn/tcp-backlog 是否匹配。
- 持久化与复制
- 观察 aof_last_rewrite_time_sec、last_save_time、复制积压与复制延迟;AOF 重写期间关注 aof_rewrite_in_progress 与 used_memory_rss 的波动。
五 安全与高可用建议
- 安全加固
- 仅在内网开放或使用 TLS/ACL;设置 requirepass、限制 bind 与 防火墙 来源;禁用危险命令(如 FLUSHALL/FLUSHDB)或重命名。
- 高可用与扩展
- 读写分离与连接池化;数据量大或吞吐高时采用 Redis Cluster 或 主从 + 哨兵 架构,结合分片/就近路由降低单实例压力。