如何在 Ubuntu 20.04 服务器上通过系统调优提升 Redis 缓存系统的响应速度

在生产环境中,我们经常会遇到 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

说明

  • somaxconntcp_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_ratiodirty_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 调度器改为 noopnone

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 性能瓶颈头疼,不妨按照本文步骤一项项调优,并结合业务的实际指标进行微调,相信会有明显改善。

相关推荐
bing_feilong3 小时前
ubuntu命令总结(1): systemctl篇
ubuntu
杰克崔3 小时前
glibc社区提问
linux·运维·服务器·车载系统
wqdian_com3 小时前
中文域名的准确展示能否堵住网络钓鱼攻击“后门”?
服务器·安全·php
代码游侠3 小时前
应用——Web服务器项目代码解析
运维·服务器·开发语言·前端·笔记·html
yueguangni4 小时前
centos7虚拟机nat模式连接不上xshell方法分享
linux·运维·服务器
萧曵 丶4 小时前
Redis在实际业务中的常见与高级用法详解
数据库·redis·缓存
阿巴~阿巴~4 小时前
TCP性能优化秘籍:延迟应答、捎带确认与粘包破解之道
运维·服务器·网络·网络协议·udp·tcp
HuaYi_Sir4 小时前
i.MX6ULL移植uboot Linux buildroot(二)
linux·运维·服务器
谷新龙0015 小时前
redis扫盲
redis·缓存
java_logo5 小时前
Docker 部署银河麒麟高级服务器操作系统(Kylin Linux)生产级全流程
服务器·docker·kylin·银河麒麟部署·银河麒麟部署文档·银河麒麟linux·银河麒麟linux部署教程