配置 Linux 内核优化 Redis:让 Redis 跑在最佳操作系统上
为什么要优化内核
Redis 是单线程模型,对 CPU、内存、网络都非常敏感。默认的 Linux 内核参数是为通用服务器设计的,针对 Redis 需要做一些针对性优化——尤其是在高并发场景下,优化前后的 QPS 差距可达 30-50%。
网络层优化
1. 修改 socket 缓冲区大小
# /etc/sysctl.conf
# 发送缓冲区(默认 16KB → 256KB)
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
# 接收缓冲区(默认 16KB → 256KB)
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
# TCP 自动调整缓冲区(适用于高带宽场景)
net.ipv4.tcp_wmem = 4096 65536 4194304
net.ipv4.tcp_rmem = 4096 87380 4194304
2. 优化 TCP 连接
# 快速回收 TIME_WAIT 连接(高并发短连接场景)
net.ipv4.tcp_tw_reuse = 1
# 注意:Redis 使用长连接,此项影响有限
# 开启 TCP 快速打开(减少握手延迟)
net.ipv4.tcp_fastopen = 3
# 增大 TCP 最大连接数
net.core.somaxconn = 1024
# 同时修改 redis.conf 中的 tcp-backlog 一致
3. 开启 TCP keepalive
# 加快死亡连接的检测
net.ipv4.tcp_keepalive_time = 60 # 60 秒后开始探测
net.ipv4.tcp_keepalive_intvl = 10 # 10 秒探测一次
net.ipv4.tcp_keepalive_probes = 3 # 3 次失败断开
内存层优化
1. 关闭透明大页(THP)
这是最重要的优化之一!
# 查看透明大页状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# [always] madvise never
# 如果显示 always 或 [always],说明开启了 THP
# 临时关闭
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 永久关闭
# 写入 /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
为什么关闭 THP? Redis 大量使用 fork() 进行持久化,开启 THP 后 fork 页面复制开销剧增,延迟可能从微秒级跳到毫秒级。
2. 调整内存 Overcommit
# 允许超额分配内存(避免 fork 失败)
vm.overcommit_memory = 1
# 减少 swap 使用
vm.swappiness = 1
# 或完全关闭 swap
# /etc/fstab 中注释掉 swap 行
3. 设置 vm.max_map_count
# 增大内存映射区数量(避免内存不足错误)
vm.max_map_count = 262144
CPU 层优化
1. CPU 亲和性绑定
# 将 Redis 进程绑定到指定的 CPU 核心
# 避免上下文切换引起的延迟抖动
# 启动时绑定
taskset -c 0,1 redis-server /etc/redis/redis.conf
# 或运行时绑定
# 先找到 PID
PID=$(pgrep -x redis-server)
# 绑定到 CPU 0,1,2,3
taskset -cp $PID
2. 设置进程调度策略
# 使用实时调度策略(需要 root)
chrt -f -p 50 $(pgrep -x redis-server)
# -f 表示 FIFO 调度策略
# 50 是优先级(1-99)
注意:使用实时调度需要谨慎,可能导致系统不稳定。建议仅在低延迟要求的场景使用。
3. 关闭 NUMA 权衡
# 检查 NUMA 配置
numactl --hardware
# 设置内存分配策略(建议在启动时指定)
numactl --interleave=all redis-server /etc/redis/redis.conf
文件系统优化
1. 为 AOF 优化文件系统
# 使用 noatime 挂载(减少磁盘写入)
# /etc/fstab
/dev/sdb /data ext4 defaults,noatime,nodiratime 0 0
# 使用 SSD 并挂载独立磁盘
# AOF 文件和 RDB 文件放在不同磁盘时性能更佳
2. 调整文件描述符限制
# 增大进程可以打开的文件数
# /etc/security/limits.conf
redis soft nofile 65536
redis hard nofile 65536
# 系统层面
fs.file-max = 100000
3. 禁用 atime 更新
# 在 /etc/fstab 中添加 noatime
# 减少不需要的磁盘写操作
全部优化一键脚本
#!/bin/bash
# redis_sysctl_optimize.sh
echo "正在优化内核参数..."
cat >> /etc/sysctl.conf << 'EOF'
# Network
net.core.somaxconn = 1024
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.ipv4.tcp_wmem = 4096 65536 4194304
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fastopen = 3
# Memory
vm.overcommit_memory = 1
vm.swappiness = 1
vm.max_map_count = 262144
# File
fs.file-max = 100000
EOF
sysctl -p
# 关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo "优化完成!"
安全相关的内核参数
# 防止 SYN 攻击
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
# 限制连接数
net.ipv4.ip_local_port_range = 1024 65535
验证优化效果
# 优化前
redis-cli --intrinsic-latency 100
# Max latency so far: 18 microseconds.
# 应用优化后
redis-cli --intrinsic-latency 100
# Max latency so far: 2 microseconds. (关闭 THP 后)
# 延迟测试
redis-cli --latency
# 优化前 avg: 0.35ms
# 优化后 avg: 0.12ms
面试要点
- 关闭透明大页(THP)是最重要的优化,可显著减少 fork 延迟
- vm.overcommit_memory = 1 防止 BGSAVE 时的 fork 失败
- vm.swappiness = 1 尽量减少 swap 使用
- CPU 亲和性绑定可以减少上下文切换
- 以上优化需重启后持久化到 /etc/sysctl.conf
- 在容器化环境中(Docker/K8s),部分内核参数无法修改,需要宿主机层面配置
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容