温馨提示×

如何优化Ubuntu上的Redis性能

小樊
39
2025-12-24 14:49:57
栏目: 云计算

Ubuntu 上 Redis 性能优化实操指南

一 系统层优化

  • 关闭透明大页 THP:Redis 的 fork 与后台重写对 THP 敏感,建议禁用。执行:echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled,并在 /etc/rc.local 追加同命令以持久化。
  • 合理设置 vm.swappiness:降低换页倾向,避免请求被 swap 拖慢。建议值:10–30;如 echo vm.swappiness=10 | sudo tee -a /etc/sysctl.conf
  • 内存过量使用策略:设置 vm.overcommit_memory=1,提升 fork 成功率与稳定性:echo vm.overcommit_memory=1 | sudo tee -a /etc/sysctl.conf
  • 文件描述符与最大连接:确保系统 ulimit -n 足够大(Redis 提示通常为 maxclients + 32),并在 systemd 服务中设置 LimitNOFILE=65536(或更高)。
  • 存储与网络:优先使用 SSD;隔离 Redis 到独立网卡/网段;仅开放必要端口并用 UFW/firewalld 限制来源 IP。

二 Redis 配置优化

  • 内存与淘汰策略:设置 maxmemory(如物理内存的 60–70%),策略优先 allkeys-lruvolatile-lru;开启惰性释放:lazyfree-lazy-eviction yeslazyfree-lazy-expire yeslazyfree-lazy-server-del yesreplica-lazy-flush yes
  • 持久化取舍:RDB 适合备份与恢复速度;AOF 提升数据安全。推荐组合:appendonly yesappendfsync everysecauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb;RDB 可按业务设置 save 900 1 300 10 60 10000
  • 网络与连接:绑定内网地址(如 bind 10.0.0.10),开启 protected-mode yestcp-backlog 511tcp-keepalive 300;按需设置 timeout(0 表示不超时)、maxclients 10000
  • 客户端输出缓冲:限制复制与发布订阅缓冲,防止慢客户端拖垮服务:
    • client-output-buffer-limit replica 256mb 64mb 60
    • client-output-buffer-limit pubsub 32mb 8mb 60
  • 慢查询与调度:开启慢查询日志(如 slowlog-log-slower-than 10000,单位微秒),必要时将事件循环频率 hz 提升到 100 以更快处理定时任务。

三 客户端与访问模式优化

  • 使用连接池:复用连接,减少握手与销毁开销;设置合理的最小/最大连接数与超时。
  • 批量与管道:对多键操作使用 Pipeline 合并往返,显著降低网络延迟。
  • 减少阻塞与热键:避免大 Key 的 KEYS、全量 LRANGE/HGETALL;对大 Value 进行拆分或压缩;热点 Key 采用本地缓存或分片打散。
  • 使用 Lua 脚本:将多个命令原子化,减少网络往返与竞争。

四 架构与扩展

  • 读写分离与复制:主库专注写,从库承担读;合理设置复制积压缓冲区:repl-backlog-size 1gbrepl-backlog-ttl 3600,缩短故障恢复时间。
  • 数据分片与集群:数据量大或并发高时采用 Redis Cluster 水平扩展,分散热点与容量瓶颈。
  • 限流与熔断:在客户端或服务网关层对 QPS/并发进行限流,避免突发流量压垮 Redis。

五 监控验证与上线流程

  • 监控与告警:使用 redis-cli --stat 观察实时指标;配置慢查询日志定位问题命令;结合 RedisInsight 等可视化工具做容量与热点分析。
  • 基准测试:上线前用压测工具(如 redis-benchmark 或业务侧脚本)验证 P95/P99 延迟、吞吐、命中率 与持久化对性能的影响。
  • 变更与回滚:先在测试环境验证配置;使用 systemd 管理进程(sudo systemctl restart redis),变更失败可快速回滚;通过 sudo journalctl -u redis.service 查看启动与运行日志。

0