走啊走
加油

高并发场景下,Redis+MySQL架构需要哪些操作系统级调优?

服务器价格表

在高并发场景下,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 失败(Redis bgsave、MySQL thread_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 调优 ≠ 孤立操作)

  1. 监控基线化:
    • 使用 sar -n DEV/SOCK/TCPiostat -x 1ss -scat /proc/net/sockstat 建立常态指标基线。
  2. ulimit 细粒度控制:
    # /etc/security/limits.conf
    mysql soft nofile 65535
    mysql hard nofile 65535
    redis soft nofile 65535
    redis hard nofile 65535
  3. NUMA 优化(多路服务器):
    • MySQL:mysqld_safe --numa-interleave-all 或启动参数 --innodb_numa_interleave=1
    • Redis:numactl --interleave=all redis-server ...
  4. 内核版本:
    • 生产建议 ≥ 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+
在虚拟机中盲目调优 schedulerisolcpus 可能违反云厂商约束,需先确认宿主机支持

✅ 总结:调优优先级(按 ROI 排序)

级别 措施 预期收益
🔴 必须做 somaxconn/tcp_tw_reuse/swappiness=1/禁用 THP/file-max+ulimit 解决 80% 连接拒绝、OOM、延迟抖动问题
🟠 强烈推荐 I/O Scheduler 优化、vm.vfs_cache_pressureovercommit_memory=2 提升 I/O 吞吐 20~50%,降低毛刺
🟡 进阶选配 CPU 绑核、NUMA 优化、nohz_fullio_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 自动化脚本。