温馨提示×

Linux环境下Redis如何进行性能调优

小樊
38
2025-12-16 12:21:27
栏目: 云计算

Linux环境下 Redis 性能调优实战

一 系统层面关键调优

  • 内存分配策略
    • 设置 vm.overcommit_memory=1,避免 fork 持久化时因内存超卖导致分配失败(Redis 日志常见告警)。临时生效:sysctl vm.overcommit_memory=1;永久生效:写入 /etc/sysctl.conf
  • 透明大页 THP
    • THP 会放大写时复制的单位,引发 写放大与延迟抖动。建议禁用:临时 echo never > /sys/kernel/mm/transparent_hugepage/enabled;持久化到 /etc/rc.local 或 systemd 启动项,重启 Redis 生效。
  • 交换分区倾向
    • 降低 vm.swappiness,减少 swap 触发,避免磁盘 IO 拖慢 Redis。建议:Linux ≥ 3.5 设为 1< 3.5 设为 0;临时 sysctl vm.swappiness=1;永久写入 /etc/sysctl.conf
  • 文件描述符与连接队列
    • 提升进程可打开文件数,避免 maxclients 受限。临时 ulimit -n 65535;systemd 服务加:LimitNOFILE=65535。同步提升 TCP 全连接队列net.core.somaxconn(如 4096/65535),并确保 Redis 配置 tcp-backlog 不大于该值。
  • OOM 防护
    • 必要时降低 Redis 被 OOM Killer 选中的概率(仅作兜底):echo -17 > /proc/${redis_pid}/oom_adj,更关键的是合理规划内存与持久化策略。

二 Redis 配置与数据结构优化

  • 内存上限与淘汰
    • 设置 maxmemory(如物理内存的 70%~80%),并选择匹配业务的 maxmemory-policy:热点数据优先 allkeys-lru,均匀访问可用 allkeys-random,带 TTL 的数据可用 volatile-ttl
  • 持久化策略取舍
    • 仅缓存、可丢少量数据:可关闭持久化或降低 RDB 频率;高可靠:启用 AOF everysec;兼顾恢复速度与可靠性:启用 混合持久化 aof-use-rdb-preamble yes。RDB 典型 save 900 1 300 10 60 10000;AOF 常用 appendfsync everysec 并配置重写阈值。
  • 避免阻塞与慢查询
    • 严禁使用 **KEYS ***,改用 SCAN;大对象操作分批/分页(如 LRANGE start stop 替代 0 -1);删除大键用 UNLINK 异步释放;减少高成本命令如 SORT
  • 批处理与并发
    • 客户端使用 Pipeline 合并请求,显著降低 RTT 与系统调用;Redis 6+ 可开启 IO 多线程分担网络读写:io-threads 4io-threads-do-reads yes(需压测找最优线程数)。
  • 键与值设计
    • 缩短键名、精简 value;对象序列化前压缩;合理选择 Hash/List/Set/ZSet 等结构,避免 big key(大 String 或超大集合)引发单次操作长阻塞与网络拥塞。

三 网络与高可用扩展

  • 本机访问优先
    • 同机服务可用 UNIX Socket 替代 TCP,降低协议栈开销:unixsocket /var/run/redis.sockunixsocketperm 700
  • 连接健康与队列
    • 开启 tcp-keepalive 60,回收异常连接;高并发场景适当增大 tcp-backlogsomaxconn,避免握手队列溢出与连接超时。
  • 读扩展与高可用
    • 读多写少场景配置 replicaof 做读写分离;用 Redis Sentinel 做故障自动切换;容量/并发再上探时采用 Redis Cluster 分片横向扩展。

四 监控验证与容量规划

  • 基线观测
    • 关注 latency、instantaneous_ops_per_sec、used_memory、used_memory_rss、evicted_keys、blocked_clients、rejected_connections、aof_last_rewrite_time、rdb_last_bgsave_status 等关键指标,结合 slowlog 定位慢命令与 big key。
  • 持久化与 fork 健康
    • 监控 fork 耗时与失败告警;RDB/AOF 期间关注 aof_rewrite_in_progress、rdb_bgsave_in_progress 与磁盘 IO(如 iostat -x 1)是否成为瓶颈;必要时错峰触发、降低频率或迁移至更快存储(SSD/NVMe)。
  • 渐进式调参与压测
    • 任何内核与配置变更先在 预发/压测环境验证,采用分批次、可回滚策略;容量规划上为 RDB/AOF、复制、客户端连接、慢查询缓冲预留 20%~30% 内存余量,避免峰值期触发淘汰/阻塞/掉线。

0