配置 Linux 内核优化 Redis:让 Redis 跑在最佳操作系统上

配置 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
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容