在构建高并发场景下的 Redis + MySQL 架构时,操作系统(OS)层面的调优是决定系统能否扛住峰值流量的“底座”。很多开发者只关注代码和数据库配置,却忽略了 Linux 内核参数对网络 I/O、内存管理和进程调度的直接影响。
以下是针对 Linux 系统(国内主流云服务器如阿里云 ECS、腾讯云 CVM 均基于此)的核心调优项,分为 网络层、内存层、文件描述符层、CPU/调度层 四个维度进行解析。
一、网络层调优(核心瓶颈所在)
Redis 和 MySQL 都是典型的网络密集型应用,高并发下 TCP 连接数会激增,网络栈的延迟和吞吐量直接决定性能。
1. TCP 连接复用与回收
# 启用 TIME_WAIT 快速回收,避免端口耗尽
net.ipv4.tcp_tw_reuse = 1
# 缩短 TIME_WAIT 状态的时间(默认 60s,可调小但需谨慎)
net.ipv4.tcp_fin_timeout = 30
# 允许重用处于 TIME_WAIT 状态的 socket 用于新连接
net.ipv4.tcp_max_tw_buckets = 20000
注意:
tcp_tw_reuse=1对于客户端(如 Java 应用连接 MySQL/Redis)非常有用,但对于服务端(如 Nginx 反向X_X后连接后端)需结合tcp_tw_recycle使用。注:较新的内核版本中tcp_tw_recycle已被移除,因其与 NAT 环境兼容性差,建议仅依赖reuse和合理的连接池配置。
2. 增大本地端口范围
高并发下,服务器作为客户端发起大量短连接时,容易耗尽 ephemeral ports(临时端口)。
# 扩大可用端口范围(默认 32768-60999,可调整为 1024-65535)
net.ipv4.ip_local_port_range = 1024 65535
3. 优化 TCP 缓冲区与拥塞控制
# 启用 BBR 拥塞控制算法(推荐 Linux 4.9+ 内核)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 增大 TCP 接收/发送窗口,提升吞吐率
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 65536 6291456
BBR 优势:在高丢包或高延迟的网络环境下,BBR 比传统的 CUBIC 算法能更好地利用带宽,显著降低 Redis 主从同步或跨 AZ 访问的延迟。
4. 增加 backlog 队列长度
防止突发流量导致 SYN 包被丢弃。
# 半连接队列长度
net.ipv4.tcp_max_syn_backlog = 65536
# 全连接队列长度(socket 的 listen backlog)
net.core.somaxconn = 65535
关键联动:Nginx、Tomcat、Spring Boot 等中间件的
listen配置必须大于等于somaxconn,否则该参数无效。
二、文件描述符与资源限制
每个 TCP 连接、打开的文件都占用一个文件描述符(FD)。高并发下 FD 耗尽会导致服务崩溃。
1. 提高系统级 FD 上限
# 全局最大文件描述符数
fs.file-max = 1000000
2. 用户级 FD 限制
在 /etc/security/limits.conf 中设置:
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
验证方法:执行
ulimit -n查看当前 shell 的限制值,确保重启服务后生效。
3. 减少 inode 消耗
如果大量使用短生命周期的临时文件或日志轮转频繁,需注意 inode 数量。一般无需特殊调优,但建议使用 ext4/xfs 文件系统并启用 dax(若支持持久内存)。
三、内存层调优(Redis 特别敏感)
Redis 依赖内存,MySQL InnoDB 也重度依赖缓冲池。OS 层的内存管理策略直接影响页面缓存效率和 OOM 风险。
1. 禁用 Swap(强烈建议)
Swap 会导致 Redis 数据落盘到磁盘,造成毫秒级延迟飙升为秒级;MySQL 也可能因 swap 抖动导致查询超时。
# 永久禁用 swap
swapoff -a
# 注释掉 /etc/fstab 中的 swap 行
2. 调整 NUMA 策略
多核服务器上,NUMA 非统一内存访问可能导致跨节点内存访问延迟。
# 设置为 bind,将进程绑定到本地 NUMA 节点
numactl --interleave=all ./redis-server ...
# 或在 sysctl 中设置
vm.zone_reclaim_mode = 0
3. 透明大页(THP)优化
THP 可能增加内存分配延迟,对 Redis 这种低延迟场景不利。
# 检查当前状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 输出应为 [never]
# 若为 always/madvise,需改为 never
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
注意:MySQL 官方建议在某些版本中保留 THP,但 Redis 社区普遍建议关闭。请根据具体业务压测结果决定。
4. 内核内存碎片整理
# 允许内核释放未使用的 slab 缓存
vm.vfs_cache_pressure = 100
# 减少匿名页交换倾向
vm.swappiness = 0
四、CPU 与中断处理(高性能网络 I/O)
1. IRQ 亲和性(IRQ Affinity)
将网卡中断绑定到特定 CPU 核心,避免上下文切换开销。
# 示例:将 eth0 的中断绑定到 core 0 和 core 1
echo 3 > /proc/irq/<irq_number>/smp_affinity_list
工具辅助:可使用
irqbalance服务自动平衡,但在极端高并发下,手动绑定更可控。
2. 禁用 CPU 频率缩放(Power Saving)
高负载下,CPU 降频会导致响应时间波动。
# 设置 governor 为 performance
cpupower frequency-set -g performance
3. 隔离专用 CPU 核心
为 Redis 和 MySQL 分配独占 CPU 核心,避免与其他无关进程争抢。
# 在 grub 中添加 isolcpus 参数
# 例如:isolcpus=2,3
# 然后将 redis-server 绑定到 core 2,3
taskset -c 2,3 ./redis-server ...
五、监控与验证建议
调优不是设完参数就结束,必须通过监控验证效果:
-
关键指标监控:
ss -s:查看 TCP 连接统计,关注Time-Wait数量。vmstat 1:观察si/so(swap in/out),应接近 0。iostat -x 1:检查%util和await,判断是否 IO 瓶颈。top -H -p <pid>:查看 Redis/MySQL 进程的 CPU 软中断(%sy)占比,过高说明网络中断处理压力大。
-
压力测试验证:
- 使用
wrk或ab测试 Nginx → Redis 链路。 - 使用
sysbench测试 MySQL 写入性能。 - 对比调优前后的 P99 延迟和 QPS。
- 使用
-
云厂商注意事项:
- 阿里云/腾讯云等云平台通常已预置部分优化内核参数(如 BBR 默认开启)。
- 使用 弹性网卡 ENI 时,注意 MTU 设置(建议 9000 jumbo frames 以提升内网传输效率,但需交换机支持)。
- 避免在内核层面修改过于激进的值,优先通过云控制台提供的“实例规格”和“安全组”功能进行基础隔离。
总结 checklist
| 类别 | 关键参数 | 目的 |
|---|---|---|
| 网络 | tcp_tw_reuse=1, ip_local_port_range |
防止端口耗尽,提速连接复用 |
| 网络 | somaxconn=65535, tcp_max_syn_backlog |
防止突发流量丢包 |
| 网络 | tcp_congestion_control=bbr |
提升带宽利用率,降低延迟 |
| 文件 | fs.file-max, nofile=65535 |
防止 FD 耗尽 |
| 内存 | swapoff, vm.swappiness=0 |
避免内存交换导致的延迟尖峰 |
| 内存 | transparent_hugepage=never |
降低 Redis 内存分配延迟 |
| CPU | performance governor, isolcpus |
保证 CPU 频率稳定,减少干扰 |
这些调优项需要根据你的具体硬件配置(CPU 核心数、内存大小)、网络拓扑(同 VPC 还是跨地域)以及业务特征(读多写少还是写多读少)进行微调。没有银弹,只有持续压测后的最优解。
CLOUD云枢