
在生产环境中,我们经常会遇到 Redis 响应延迟高、吞吐下降的问题。单纯依赖 Redis 配置往往无法满足高并发场景的性能需求。A5数据将结合最新的知识与实战经验,从操作系统层面对 Ubuntu 20.04 服务器进行系统级调优,实打实提升 Redis 响应速度与稳定性。
一、背景与目标
在跨境电商业务中,我们将 Redis 用作热点数据缓存和会话存储。随着访问量增长,Redis 在高并发场景下出现了平均响应延迟升高、偶发峰值延迟的问题。通过系统调优,我们希望达到以下目标:
- 将 99% 响应延迟 (p99) 由 ~5 ms 降至 < 1 ms
- 提升 Redis 的 每秒请求处理数 (QPS)
- 降低系统层面对 Redis 操作的抖动(jitter)
二、实验环境与硬件配置
首先,给出本次调优测试的香港服务器www.a5idc.com硬件和软件环境,以便复现和参考:
| 项目 | 配置说明 |
|---|---|
| 操作系统 | Ubuntu 20.04 LTS (5.4 内核) |
| CPU | 2 x Intel Xeon Silver 4214 (24 核) |
| 内存 | 128 GB DDR4 |
| 存储 | NVMe SSD 1.92 TB (RAID 未启用) |
| 网络 | 25 Gbps 直连 |
| Redis | Redis 6.2.7, no cluster |
| Redis 配置 | maxmemory-policy allkeys-lru |
三、基线测试:调优前性能评估
在未做系统调优之前,我们先通过 redis-benchmark 对 Redis 性能进行基线测试。
bash
redis-benchmark -h 127.0.0.1 -p 6379 -n 500000 -c 200 -q
基线结果如下(调优前):
| 指标 | 结果 |
|---|---|
| 平均 QPS | ~90,000 QPS |
| p50 响应延迟 | ~0.8 ms |
| p95 响应延迟 | ~2.3 ms |
| p99 响应延迟 | ~5.2 ms |
观察发现 p99 延迟相对较高,说明系统在高并发下出现延迟抖动。
四、系统级别调优策略
Redis 对系统环境非常敏感。下面从内核参数、CPU调度、内存策略、网络栈和磁盘 I/O 几个维度进行系统调优。
五、具体实现细节与代码示例
1)优化内核网络参数
我们通过调整 sysctl 参数,优化 Linux 网络栈以减少请求排队和延迟。
创建调优配置文件:
bash
cat <<EOF | sudo tee /etc/sysctl.d/99-redis-performance.conf
# 增加网络监听队列
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 50000
# TCP 调优
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 65535
# 关闭 IPv6(如果不使用)
net.ipv6.conf.all.disable_ipv6 = 1
EOF
sudo sysctl --system
说明:
somaxconn和tcp_max_syn_backlog提高了内核可处理的半连接和全连接队列。tcp_tw_reuse允许重用 TIME_WAIT 套接字,在高并发下降低资源占用。
2)CPU 调度与频率策略
Redis 是单线程模型,依赖高单核性能。因此,将 CPU 调度策略设置为性能优先:
bash
# 设置 CPU 调频为 performance
for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo performance | sudo tee $CPUFREQ
done
效果:减少频率切换延迟,使 Redis 调度的响应更稳定。
3)关闭透明大页(THP)
Redis 官方推荐关闭透明大页,否则可能引发延迟抖动。
bash
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
可在 /etc/rc.local 中添加以上命令实现开机自动执行。
4)调整内存策略
Redis 对内存分配敏感,我们需要禁用交换空间,并调整内存过量提交策略:
bash
cat <<EOF | sudo tee /etc/sysctl.d/99-memory-tuning.conf
vm.overcommit_memory = 1
vm.swappiness = 0
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
EOF
sudo sysctl --system
说明:
overcommit_memory = 1:允许 Redis 分配内存而不受系统限制。swappiness = 0:避免系统使用交换分区。dirty_ratio和dirty_background_ratio使写脏页比例较低,减少写磁盘操作对内存的干扰。
5)文件句柄与限制
Redis 在并发场景下需要大量文件句柄:
bash
sudo mkdir -p /etc/systemd/system/redis.service.d
cat <<EOF | sudo tee /etc/systemd/system/redis.service.d/limits.conf
[Service]
LimitNOFILE=1000000
EOF
sudo systemctl daemon-reload
sudo systemctl restart redis
6)I/O 调度与 NVMe 优化
如果 Redis 使用磁盘持久化,建议将 SSD 调度器改为 noop 或 none:
bash
echo noop | sudo tee /sys/block/nvme0n1/queue/scheduler
六、调优后性能测试
同样使用 redis-benchmark 进行测试:
bash
redis-benchmark -h 127.0.0.1 -p 6379 -n 500000 -c 200 -q
调优后结果:
| 指标 | 调优前 | 调优后 | 提升比例 |
|---|---|---|---|
| 平均 QPS | ~90,000 | ~130,000 | +44% |
| p50 响应延迟 | ~0.8 ms | ~0.6 ms | -25% |
| p95 响应延迟 | ~2.3 ms | ~1.2 ms | -48% |
| p99 响应延迟 | ~5.2 ms | ~1.0 ms | -81% |
调优后 Redis 性能显著提升,特别是在高延迟尾部指标(p99)上改善明显。
七、监控与持续优化建议
系统调优不是一劳永逸的过程。建议结合如下工具进行实时监控:
| 工具 | 用途 |
|---|---|
| Grafana + Prometheus | 可视化 Redis 指标与系统指标 |
| netdata | 实时系统与进程性能监控 |
| iostat / vmstat | I/O 与内存层实时状态 |
八、常见误区
- 误把 Redis 调优等同于系统调优:Redis 配置和系统调优要双管齐下。
- 只调 Redis 不调内核:高并发依赖操作系统底层支持。
- 忽略监控:没有性能数据做对比就无法有效调优。
九、总结
通过系统层面的一系列调优(网络、CPU、内存、I/O、句柄等),我们成功降低了 Redis 的响应延迟并显著提高了吞吐能力。以上步骤经过实测验证,适用于大多数基于 Ubuntu 20.04 的 Redis 生产环境。
如果你正在为 Redis 性能瓶颈头疼,不妨按照本文步骤一项项调优,并结合业务的实际指标进行微调,相信会有明显改善。