温馨提示×

怎样提升Linux Redis性能

小樊
40
2025-12-22 10:14:26
栏目: 云计算

Linux 上提升 Redis 性能的系统与实践要点

一 系统层关键调优

  • 内存分配策略:将 vm.overcommit_memory=1,避免 bgsave/bgrewriteaof 在低内存时因 fork 申请内存失败(出现 “Cannot allocate memory”)。设置方法:echo "vm.overcommit_memory=1" >> /etc/sysctl.conf && sysctl -p
  • 交换倾向:降低 vm.swappiness,减少 swap 对延迟的影响。建议:Linux ≥ 3.5 设为 1(尽量不 swap,避免阻塞),Linux < 3.5 设为 0;也可按业务在 1–10 区间微调。监控:free -hvmstat 1 查看 si/so。
  • 透明大页 THP:Redis 建议禁用。推荐:echo never > /sys/kernel/mm/transparent_hugepage/enabled(部分发行版可用 madvise);修改后需重启 Redis。
  • 文件描述符限制:提升进程可打开文件数,避免 “Too many open files”。临时:ulimit -n 65536;永久:在 /etc/security/limits.conf 增加 * soft nofile 65536* hard nofile 65536
  • TCP 与网络:适度增大 somaxconntcp_max_syn_backlog,并开启 tcp_tw_reuse,降低连接排队与握手开销(需结合业务压测微调)。
  • 持久化磁盘:若有 AOF/RDB 落盘,优先使用 SSD,显著降低持久化与复制延迟。

二 Redis 配置与数据结构

  • 内存上限与淘汰:设置 maxmemory 并选择恰当的 maxmemory-policy(如 allkeys-lruvolatile-lru),避免 OOM 与频繁逐出抖动。
  • 持久化策略:按业务在 RDB(恢复快、吞吐高)与 AOF(数据更安全、写入放大)间取舍;AOF 可配 appendfsync everysec 平衡性能与持久性。
  • 客户端与连接:在客户端使用连接池、复用连接,避免频繁建连/断连;合理控制并发连接数。
  • 批处理与管道:高 QPS 场景使用 Pipeline 合并网络往返,显著降低 P99 延迟。
  • 键与值设计:避免过大的 key/value 与过长 TTL 滥用;按场景选择 Hash/Set/ZSet 等合适结构,减少序列化与网络开销。
  • 热点与倾斜:通过随机化前缀/打散等手段打散热点 key,必要时做本地缓存或分片。

三 硬件与架构扩展

  • 资源配比:为 Redis 预留20%–30% 空闲内存,给持久化、复制与峰值波动留余量;优先充足内存,其次多核 CPU高带宽网络
  • 存储与网络:持久化与复制优先 SSD;跨机房/跨地域部署时关注网络时延与带宽。
  • 扩展方式:数据量大或负载高时采用 Redis Cluster/分片 水平扩展,分散单实例压力。

四 监控与验证

  • 基线指标:持续观测 latency、instantaneous_ops_per_sec、used_memory、used_memory_rss、evicted_keys、aof_delayed_fsync、rejected_connections、sync_full/sync_partial_err 等,结合慢查询日志定位瓶颈。
  • 工具与方法:使用 redis-cli --stat/info、慢查询分析、以及 redis-stat 等第三方工具;任何参数变更前先备份配置并在预发/压测环境验证,观察 P50/P95/P99 与错误率变化。

五 一键检查清单与常用命令

  • 快速检查与设置示例:
    • 内存与 swap:cat /proc/sys/vm/overcommit_memory(期望 1);echo "vm.overcommit_memory=1" >> /etc/sysctl.conf && sysctl -p
    • 交换倾向:cat /proc/sys/vm/swappiness(Linux ≥ 3.5 建议 1;< 3.5 建议 0);echo "vm.swappiness=1" >> /etc/sysctl.conf && sysctl -p
    • THP:cat /sys/kernel/mm/transparent_hugepage/enabled(期望 nevermadvise);echo never > /sys/kernel/mm/transparent_hugepage/enabled
    • 文件描述符:ulimit -n(期望 ≥ 65536);在 /etc/security/limits.conf 增加 soft/hard nofile 配置
    • 持久化磁盘:确认 AOF/RDB 落盘在 SSD 上,IOPS/吞吐满足峰值
    • Redis 配置:设置 maxmemory 与淘汰策略;AOF 使用 everysec;客户端启用连接池Pipeline;避免大 key/大 value 与热点 key 集中
    • 监控:定期查看 redis-cli infoslowlog get、慢查询与 instantaneous_ops_per_sec,压测对比 P50/P95/P99 与 evicted_keys 等指标变化

0