Hugo博客公告弹窗

优化宝塔面板Redis内存配置

宝塔面板后台redis莫名停止运作,导致站点打开出现错误,当我重启redis后,系统负载又飙升,解决办法如下

即时配置调整

# 设置内存上限
redis-cli config set maxmemory 1g

# 设置内存淘汰策略
redis-cli config set maxmemory-policy volatile-lru

# 适度提高采样精度
redis-cli config set maxmemory-samples 10

# 永久保存配置
redis-cli config rewrite

或者使用allkeys-lru内存淘汰策略

redis-cli config set maxmemory-policy allkeys-lru

开启 active-defrag 机制

redis-cli CONFIG SET activedefrag yes

确认是否已开启:

redis-cli CONFIG GET activedefrag

找出 Redis 中“最大的键”

redis-cli --bigkeys

批量删除这些大 key(谨慎操作)

redis-cli --scan --pattern "xxxxx.com*" | xargs redis-cli del

脚本删除大 key

curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/clean_bigkeys.sh && chmod +x clean_bigkeys.sh

🧪 用法说明:

  1. 查看前 10 个最大 key(仅分析,不删除):
./clean_bigkeys.sh --top-n 10
  1. 清除所有大于 512KB 的 key(并 dry-run 看看):
./clean_bigkeys.sh --dry-run --threshold 524288
  1. 真正删除大于 500KB 的 key:
./clean_bigkeys.sh --threshold 500000
  1. 把大于 500KB 的 key 设置为 1 小时(3600 秒)后自动过期
./clean_bigkeys.sh --threshold 500000 --expire 3600

内存上限配置说明

推荐将Redis内存上限设置为系统总内存的40-45%。例如:

系统内存推荐Redis内存上限
2GB1g
4GB1.6g
8GB3.2g

内存分配原理

保留足够内存给系统其他组件是必要的,主要考虑:

  • PHP-FPM进程需要足够内存处理并发请求
  • MySQL数据库(尤其是InnoDB缓冲池)需要稳定内存
  • 操作系统文件缓存需求
  • 预防系统内存不足导致的交换(swap)和OOM Killer触发

内存淘汰策略选择

volatile-lru策略适用于大多数Web应用场景:

  • 只淘汰设置了过期时间(TTL)的键
  • 优先淘汰最近最少使用(Least Recently Used)的键
  • 保护未设置TTL的重要数据

采样精度说明

# 提高内存淘汰精度
redis-cli config set maxmemory-samples 10

maxmemory-samples参数控制Redis执行淘汰策略时的采样数量:

  • 默认值:Redis 5.0以前为3,5.0及以后为5
  • 增加至10可提高淘汰精度,但会略微增加CPU开销
  • 适合对缓存命中率要求较高的场景

监控命令

查看内存使用情况

redis-cli info memory

确认内存上限配置

redis-cli config get maxmemory

查看内存淘汰策略

redis-cli config get maxmemory-policy

查看采样设置

redis-cli config get maxmemory-samples

检查缓存命中率

redis-cli info stats | grep -E "keyspace_hits|keyspace_misses"

例如:

keyspace_hits:135433    (缓存命中次数)
keyspace_misses:60863   (缓存未命中次数)

缓存命中率计算

命中率 = 命中次数 / (命中次数 + 未命中次数)

= 135433 / (135433 + 60863) = 135433 / 196296 ≈ 0.69 或 69%

CC BY-NC-SA 4.0 转载请注明
最后更新于 2025-04-25 09:34
clarity统计