在高并发场景下,Redis + MySQL 架构的性能瓶颈常会从应用层下探至操作系统层。合理的 OS 级调优能显著提升 I/O 吞吐、网络响应、内存管理效率及系统稳定性。以下是关键、实用且经生产验证的操作系统级调优建议(以 Linux 为主,适用于主流发行版如 CentOS/RHEL/Ubuntu):
一、网络栈调优(对 Redis 和 MySQL 的客户端连接、主从复制、Proxy 通信至关重要)
| 参数 | 推荐值 | 说明 |
|---|---|---|
net.core.somaxconn |
65535 |
增大 listen backlog,避免 accept queue overflow(Redis/MySQL 启动日志中常见 accept() failed (24: Too many open files) 或 Connection refused) |
net.core.netdev_max_backlog |
5000~10000 |
提升网卡接收队列长度,缓解突发流量丢包(尤其在千兆/万兆网卡+高 QPS 场景) |
net.ipv4.tcp_max_syn_backlog |
65535 |
SYN 半连接队列大小,配合 somaxconn 防止 SYN Flood 或连接拒绝 |
net.ipv4.tcp_tw_reuse |
1(启用) |
关键! 允许 TIME_WAIT socket 重用于新连接(需 net.ipv4.tcp_timestamps=1),大幅提升短连接吞吐(如大量 HTTP/Redis client 短连接) |
net.ipv4.tcp_fin_timeout |
30 |
缩短 FIN_WAIT_2 超时时间(默认 60s),提速连接回收 |
net.ipv4.ip_local_port_range |
"1024 65535" |
扩大本地端口范围,避免 bind: Address already in use(尤其 Redis Cluster 节点多、MySQL Proxy 多实例时) |
net.core.rmem_max, net.core.wmem_max |
16777216(16MB) |
提高 TCP 接收/发送缓冲区上限(需配合应用层 SO_RCVBUF/SO_SNDBUF 设置) |
net.ipv4.tcp_slow_start_after_idle |
0 |
禁用空闲后慢启动,保持高带宽利用率(高并发长连接场景有效) |
✅ 生效方式:
# 临时生效
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
# 永久生效(写入 /etc/sysctl.conf)
echo "net.core.somaxconn = 65535" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
⚠️ 注意:
tcp_tw_reuse仅对客户端发起的连接(即本机作为 client)有效;Redis/MySQL 服务端仍需靠TIME_WAIT复用或连接池规避。
二、文件系统与 I/O 调优(直接影响 MySQL 写入、Redis AOF/RDB、日志落盘)
| 参数 | 推荐值 | 说明 |
|---|---|---|
| I/O Scheduler | none(NVMe) / mq-deadline(SSD) / deadline(HDD) |
避免 cfq(已废弃)带来的额外延迟;NVMe 推荐 none(绕过 kernel scheduler,由设备自身调度) |
vm.swappiness |
1(非 0!) |
强烈建议设为 1:避免 MySQL/Redis 进程因内存压力被 swap(OOM Killer 触发风险),同时保留极低 swap 使用能力(应对极端内存泄漏) |
vm.vfs_cache_pressure |
50(默认 100,可降低) |
减少 inode/dentry 缓存回收频率,提升高频小文件访问(如 MySQL 表文件、Redis RDB)性能 |
fs.file-max |
2097152(2M) |
系统级最大文件句柄数(需同步调整 ulimit -n) |
fs.aio-max-nr |
1048576 |
提升异步 I/O 并发能力(MySQL InnoDB innodb_use_native_aio=ON 依赖) |
✅ 检查与设置:
# 查看当前 scheduler(假设设备为 /dev/nvme0n1)
cat /sys/block/nvme0n1/queue/scheduler
# 设置(临时)
echo 'none' | sudo tee /sys/block/nvme0n1/queue/scheduler
# 持久化(/etc/default/grub 添加内核参数,如:elevator=noop → modern: nvme_core.default_ps_max_latency_us=0)
💡 磁盘挂载优化(ext4/xfs):
# 推荐挂载选项(MySQL 数据目录 & Redis 持久化目录) defaults,noatime,nodiratime,barrier=0,commit=100 # ext4(SSD/NVMe) # 或 xfs:defaults,noatime,logbufs=8,logbsize=256k
三、内存与进程调度调优
| 参数 | 推荐值 | 说明 |
|---|---|---|
vm.overcommit_memory |
2(推荐)或 1 |
2:严格内存检查(overcommit_ratio+swap决定上限),防止 OOM;MySQL 官方推荐1:总是允许 overcommit(高并发下可能引发 OOM Killer 杀死 MySQL/Redis)
|vm.overcommit_ratio|80(当overcommit_memory=2时) | 物理内存可 overcommit 比例(如 128G 内存 → 可分配约 102G + swap) |
|kernel.pid_max|65535| 避免 fork 失败(Redisbgsave、MySQLthread_per_connection高并发时需大量进程/线程) |
| CPU 调度器 |isolcpus=2,3,4,5 nohz_full=2,3,4,5 rcu_nocbs=2,3,4,5| 高级: 将特定 CPU 核心隔离给 Redis/MySQL 绑核使用,关闭 tick 中断,降低延迟抖动(需配合taskset/numactl) |
✅ 绑定 CPU 示例(Redis 实例):
# 启动时绑定到 CPU 2,3
taskset -c 2,3 redis-server /etc/redis.conf
# 或 systemd service 中添加:CPUAffinity=2 3
四、安全与稳定性加固(常被忽视但影响重大)
-
✅ 禁用透明大页(THP):
echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/defrag # 永久:grubby --update-kernel=ALL --args="transparent_hugepage=never"❗ MySQL/Redis 对 THP 敏感:可能导致内存分配延迟飙升(
malloc卡顿达毫秒级)、GC/刷盘抖动。 -
✅ 调整 OOM Killer 优先级:
# 降低 MySQL 进程被 kill 概率(值越小越不易被杀) echo '-1000' | sudo tee /proc/$(pgrep mysqld)/oom_score_adj # Redis 同理(但注意:不要设为 -1000,否则可能影响系统稳定性) -
✅ NTP 时间同步:
使用chrony替代ntpd,配置makestep 1 -1,确保 Redis Cluster、MySQL GTID、分布式锁等依赖时间一致性的功能稳定。
五、配套实践建议(OS 调优 ≠ 孤立操作)
- 监控基线化:
- 使用
sar -n DEV/SOCK/TCP、iostat -x 1、ss -s、cat /proc/net/sockstat建立常态指标基线。
- 使用
- ulimit 细粒度控制:
# /etc/security/limits.conf mysql soft nofile 65535 mysql hard nofile 65535 redis soft nofile 65535 redis hard nofile 65535 - NUMA 优化(多路服务器):
- MySQL:
mysqld_safe --numa-interleave-all或启动参数--innodb_numa_interleave=1 - Redis:
numactl --interleave=all redis-server ...
- MySQL:
- 内核版本:
- 生产建议 ≥
5.4(含更优的 BBR2、io_uring 支持、改进的 slab 分配器),避免4.18之前存在已知 I/O 死锁 bug。
- 生产建议 ≥
🚫 避坑清单(常见误操作)
| 错误做法 | 风险 |
|---|---|
vm.swappiness=0 |
内存不足时触发直接 OOM Kill,无缓冲余地 |
net.ipv4.tcp_tw_recycle=1 |
已废弃且在 NAT 环境下导致连接失败(绝对禁用) |
过度调大 net.core.somaxconn 但未调 ulimit -n |
无效,进程仍受限于打开文件数 |
| 未关闭 THP | Redis bgsave 或 MySQL buffer pool dump 时延迟突增 100ms+ |
在虚拟机中盲目调优 scheduler 或 isolcpus |
可能违反云厂商约束,需先确认宿主机支持 |
✅ 总结:调优优先级(按 ROI 排序)
| 级别 | 措施 | 预期收益 |
|---|---|---|
| 🔴 必须做 | somaxconn/tcp_tw_reuse/swappiness=1/禁用 THP/file-max+ulimit |
解决 80% 连接拒绝、OOM、延迟抖动问题 |
| 🟠 强烈推荐 | I/O Scheduler 优化、vm.vfs_cache_pressure、overcommit_memory=2 |
提升 I/O 吞吐 20~50%,降低毛刺 |
| 🟡 进阶选配 | CPU 绑核、NUMA 优化、nohz_full、io_uring(MySQL 8.0.33+/Redis 7.0+) |
微秒级延迟优化,适合X_X/实时风控场景 |
最后提醒:所有调优必须在预发环境压测验证(如用
redis-benchmark+sysbench模拟真实读写比),并配合perf/ebpf(如bcc工具集)定位真实瓶颈,避免“调优式玄学”。
如需针对具体场景(如 Redis Cluster 10k QPS + MySQL 分库分表写热点)、硬件配置(NVMe RAID0 / Ceph RBD)或容器化(K8s 中的 Pod OS 调优)进一步细化方案,我可为你定制完整 checklist 和 Ansible 自动化脚本。
CLOUD云计算