持久化性能优化
持久化操作消耗CPU、内存、磁盘资源,合理优化可减少对Redis性能的影响。
fork优化
fork性能影响因素
Bash
1. 内存大小
- 内存越大,fork耗时越长
- 4GB内存:fork约几十毫秒
- 32GB内存:fork可能几百毫秒
2. THP(透明大页)
- THP导致fork复制内存页
- 显著增加fork时间
- 必须禁用
3. 内存碎片
- 碎片率高时fork开销增加
禁用THP
Bash
# 临时禁用
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 永久禁用(写入rc.local)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 验证
cat /sys/kernel/mm/transparent_hugepage/enabled
# 输出:always madvise [never]
THP禁用是Redis持久化优化的必要步骤。
内存参数优化
Bash
# 允许内存过量分配
sysctl -w vm.overcommit_memory=1
# 永久配置(写入/etc/sysctl.conf)
vm.overcommit_memory=1
# 验证
sysctl vm.overcommit_memory
内存控制
Bash
# 控制Redis内存使用
maxmemory 4gb
# 减少内存碎片
# 使用合适的数据结构
# 定期清理无用数据
fork监控
Bash
INFO stats
# fork相关指标
total_forks: fork总次数
fork_rate: fork频率(秒)
# 监控fork耗时
INFO persistence
rdb_last_bgsave_time_sec: 上次BGSAVE耗时
fsync优化
fsync策略选择
Bash
# always:每次写入同步(性能最差)
appendfsync always
# everysec:每秒同步(推荐)
appendfsync everysec
# no:系统决定(性能最好)
appendfsync no
重写期间fsync
Bash
# 重写时禁用fsync(避免阻塞)
no-appendfsync-on-rewrite yes
# 注意:可能导致数据丢失
# 仅在磁盘性能足够时使用
fsync时机优化
Bash
# 减少fsync调用
appendfsync everysec
# 系统层优化
# 使用高性能磁盘(SSD)
# 避免磁盘IO竞争
AOF重写优化
重写触发条件调整
Bash
# 默认配置
auto-aof-rewrite-percentage 100 # 增长100%触发
auto-aof-rewrite-min-size 64mb # 最小64MB
# 大数据量场景:增大阈值
auto-aof-rewrite-percentage 200 # 增长200%触发
auto-aof-rewrite-min-size 512mb # 最小512MB
# 减少重写频率,减少fork次数
重写时机选择
Bash
最佳重写时机:
- 业务低峰期
- 写入量较少时
- 系统负载较低时
避免:
- 流量高峰期
- 大量写入时
- 主从同步时
手动触发重写
Bash
# 定时任务在低峰期触发重写
# 每日凌晨3点重写
0 3 * * * redis-cli BGREWRITEAOF
重写过程监控
Bash
INFO persistence
# 重写状态
aof_rewrite_in_progress: 是否正在重写
aof_rewrite_scheduled: 是否有待执行的重写
aof_last_rewrite_time_sec: 上次重写耗时
aof_current_size: 当前文件大小
aof_base_size: 上次重写后大小
RDB保存优化
save规则调整
Bash
# 默认配置
save 900 1
save 300 10
save 60 10000
# 低写入场景:延长间隔
save 1800 1 # 30分钟1次修改
# 高写入场景:适当缩短
save 60 1000 # 1分钟1000次修改
# 禁用自动保存(手动控制)
save ""
手动控制保存
Bash
# 定时任务在低峰期保存
0 3 * * * redis-cli BGSAVE
# 避免高峰期自动保存
BGSAVE时机
Bash
最佳保存时机:
- 业务低峰期
- 写入量较少时
- 主从复制已完成时
磁盘优化
使用SSD
Bash
SSD优势:
- 写入速度快
- fsync延迟低
- 减少IO阻塞
推荐:
- AOF文件使用SSD存储
- RDB备份可使用HDD
磁盘空间管理
Bash
# 监控磁盘空间
df -h /var/lib/redis
# 告警阈值
if disk_usage > 80%:
alert("磁盘空间不足")
独立磁盘
Bash
- Redis数据目录使用独立磁盘
- 避免与其他IO密集服务竞争
- 减少磁盘IO冲突
IO调度优化
Bash
# 使用noop或deadline调度器(SSD)
echo noop > /sys/block/sda/queue/scheduler
# 或deadline
echo deadline > /sys/block/sda/queue/scheduler
系统参数优化
内核参数
Bash
# /etc/sysctl.conf
# 内存过量分配
vm.overcommit_memory=1
# 脏页比例
vm.dirty_ratio=10
vm.dirty_background_ratio=5
# 文件描述符限制
fs.file-max=65535
进程限制
Bash
# /etc/security/limits.conf
redis soft nofile 65535
redis hard nofile 65535
redis soft nproc 65535
redis hard nproc 65535
应用参数
Bash
# ulimit设置
ulimit -n 65535
ulimit -u 65535
监控与告警
关键监控指标
text
INFO persistence
# RDB指标
rdb_last_bgsave_status: BGSAVE状态
rdb_last_bgsave_time_sec: BGSAVE耗时
rdb_changes_since_last_save: 待保存的修改数
# AOF指标
aof_enabled: AOF是否开启
aof_current_size: AOF文件大小
aof_rewrite_in_progress: 是否正在重写
aof_last_rewrite_time_sec: 重写耗时
# fork指标
total_forks: fork总次数
fork_rate: fork频率
INFO stats指标
text
INFO stats
# fork相关
total_forks: fork次数
fork_rate: 每秒fork次数
# 同步相关
sync_full: 全量同步次数
sync_partial_ok: 部分同步成功次数
告警规则
text
RDB告警:
- BGSAVE失败告警
- BGSAVE耗时>60秒告警
- 待保存修改数>100000告警
AOF告警:
- 重写失败告警
- 重写耗时>60秒告警
- 文件大小>1GB告警
磁盘告警:
- 磁盘使用率>80%告警
- 磁盘IO延迟>100ms告警
性能问题排查
fork慢排查
text
# 检查THP状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 检查内存使用
INFO memory
# 检查fork频率
INFO stats | grep fork
fsync阻塞排查
text
# 检查AOF配置
CONFIG GET appendfsync
CONFIG GET no-appendfsync-on-rewrite
# 检查磁盘IO
iostat -x 1
重写慢排查
text
# 检查文件大小
ls -lh appendonly.aof
# 检查内存大小
INFO memory | grep used_memory
# 检查磁盘性能
dd if=/dev/zero of=/var/lib/redis/test bs=1M count=1000
性能优化检查清单
必做项
text
1. 禁用THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
2. 设置vm.overcommit_memory=1
sysctl -w vm.overcommit_memory=1
3. 使用SSD存储AOF
确保磁盘性能足够
4. 合理设置save规则
根据业务特点调整
建议项
text
1. 控制内存使用
maxmemory设置合理值
2. 增大重写阈值
减少fork频率
3. 重写时禁用fsync
no-appendfsync-on-rewrite yes
4. 定期清理磁盘空间
备份文件定期清理
5. 监控磁盘IO
设置告警阈值
要点总结
- 禁用THP是fork优化的必要步骤
- vm.overcommit_memory=1允许内存过量分配
- appendfsync everysec平衡性能和数据安全
- no-appendfsync-on-rewrite yes避免重写时阻塞
- 大数据量增大重写阈值,减少fork频率
- 使用SSD存储AOF文件,提高fsync性能
- 业务低峰期执行重写和保存
- 监控fork频率、重写耗时、磁盘IO
- 控制内存使用,减少fork开销
- 设置合理告警阈值,及时发现性能问题
📝 发现内容有误?点击此处直接编辑