在 CentOS 上优化 Redis,通常从 操作系统层面、Redis 配置、内存/持久化策略、网络与客户端 几个方面入手。下面给你一套比较系统、可落地的优化方案(适用于 CentOS 7/8、Rocky Linux 等)。
Redis 官方强烈建议关闭 THP,否则会导致延迟抖动。
# 临时关闭
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 永久关闭(CentOS 7)
cat >> /etc/rc.d/rc.local <<EOF
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
EOF
chmod +x /etc/rc.d/rc.local
Redis 连接数多时需要。
# 临时
ulimit -n 65535
# 永久
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
编辑 /etc/sysctl.conf:
vm.overcommit_memory = 1
net.core.somaxconn = 2048
net.ipv4.tcp_max_syn_backlog = 2048
vm.swappiness = 1
生效:
sysctl -p
overcommit_memory=1对 Redis 非常重要,避免 fork 失败
yum install -y tuned
tuned-adm profile latency-performance
bind 0.0.0.0
port 6379
生产环境建议:
maxmemory 8gb
maxmemory-policy allkeys-lru
常用策略:
allkeys-lru:推荐volatile-lru:仅过期 keynoeviction:写满报错(不推荐)save ""
appendonly no
appendonly yes
appendfsync everysec
不建议
appendfsync always(性能差)
如果只用 AOF:
save ""
tcp-backlog 2048
timeout 0
tcp-keepalive 60
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command SHUTDOWN ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
redis-cli --bigkeys 检查taskset -c 0,1 redis-server /etc/redis.conf
io-threads 4
io-threads-do-reads yes
仅适用于高 QPS 场景
redis-cli info memory
redis-cli info stats
redis-cli info cpu
redis-cli --latency
redis-cli --latency-history
redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000
| 现象 | 原因 | 解决 |
|---|---|---|
| 延迟抖动 | THP | 关闭 THP |
| OOM | maxmemory 未设置 | 设置 maxmemory |
| fork 失败 | overcommit_memory | 设为 1 |
| CPU 高 | 大 key / Lua | 拆分 key |
| 连接数不够 | somaxconn | 调大 |
bind 0.0.0.0
port 6379
maxmemory 8gb
maxmemory-policy allkeys-lru
appendonly yes
appendfsync everysec
tcp-backlog 2048
timeout 0
tcp-keepalive 60
如果你愿意,可以告诉我:
我可以 直接给你一份针对你环境的 redis.conf 完整优化配置。