在高并发场景下,Redis 作为缓存层,MySQL 作为持久化存储层,两者协同工作。操作系统层面的调优旨在最大化 I/O 性能、减少上下文切换、优化内存管理、提升网络吞吐能力,从而支撑高 QPS/TPS 请求。
以下是针对 Redis + MySQL 架构的操作系统级关键调优方向及具体参数建议:
一、文件系统与磁盘 I/O 调优
1. 挂载选项优化(Mount Options)
-
禁用访问时间更新(noatime):
- Linux 默认每次读取文件都会更新
atime,导致大量无意义的写操作。 - 命令:在
/etc/fstab中挂载数据盘时添加noatime,nodiratime。 - 效果:显著减少磁盘写放大,提升随机读性能。
- Linux 默认每次读取文件都会更新
-
使用 ext4/xfs 文件系统:
- 推荐使用
ext4(journal=ordered 或 writeback)或xfs。 - 避免使用
ext3或老旧文件系统。
- 推荐使用
-
JBD2 日志模式优化:
- 对于 SSD 或高性能 HDD,可将
data=writeback以牺牲少量数据一致性换取更高写入性能(需确保 RAID 卡有电池保护)。
- 对于 SSD 或高性能 HDD,可将
2. 预读机制(Readahead)
- 调整块设备预读大小:
# 查看当前预读值 blockdev --getra /dev/sda # 设置为较大值(如 256KB~1MB),适合顺序读多的场景 blockdev --setra 2048 /dev/sda- 注意:Redis 多为随机 I/O,此优化效果有限;但对 MySQL 的批量查询、全表扫描有帮助。
3. 磁盘调度算法(I/O Scheduler)
- SSD 环境:使用
none或mq-deadline(多队列)。 - HDD 环境:使用
deadline或bfq。 - 命令:
echo none > /sys/block/sda/queue/scheduler # 永久生效:在 GRUB_CMDLINE_LINUX 中添加 elevator=none
二、内存管理调优
1. 虚拟内存与 Swap
- 禁止 Swap(Critical for Redis & MySQL):
- Redis 和 MySQL 都依赖内存页映射,Swap 会导致严重延迟抖动。
- 命令:
sysctl vm.swappiness=0 sysctl vm.vfs_cache_pressure=50 - 原因:
swappiness=0表示仅在物理内存耗尽时才考虑 Swap;vfs_cache_pressure=50防止内核过度回收目录/inode 缓存。
2. Huge Pages(大页内存)
- 启用 Transparent Huge Pages (THP):
- Redis:强烈建议禁用 THP,因为 THP 分配延迟不可控,可能导致 Redis 卡顿。
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag - MySQL:InnoDB 引擎支持 huge pages,可配置
innodb_use_large_pages=ON,减少 TLB miss,提升地址转换效率。
- Redis:强烈建议禁用 THP,因为 THP 分配延迟不可控,可能导致 Redis 卡顿。
3. NUMA 感知优化
- 绑定 CPU 与内存节点:
- 在多路服务器中,跨 NUMA 节点访问内存延迟高。
- 使用
numactl启动 Redis/MySQL 进程,绑定到本地 NUMA 节点。numactl --interleave=all redis-server ... # 或更精细地绑定 CPU 核心和内存节点
三、网络栈调优(TCP/IP Stack)
1. TCP 连接管理
-
快速回收 TIME_WAIT 连接:
sysctl net.ipv4.tcp_tw_reuse=1 sysctl net.ipv4.tcp_fin_timeout=30tcp_tw_reuse=1允许将处于 TIME_WAIT 状态的 socket 用于新连接(需谨慎评估安全风险)。
-
增大端口范围:
sysctl net.ipv4.ip_local_port_range="1024 65535"- 支持更多并发短连接(如 MySQL 客户端连接池)。
2. 缓冲区与队列深度
-
TCP 接收/发送窗口:
sysctl net.core.rmem_max=16777216 sysctl net.core.wmem_max=16777216 sysctl net.ipv4.tcp_rmem="4096 87380 16777216" sysctl net.ipv4.tcp_wmem="4096 65536 16777216"- 增大缓冲区以适应高带宽、高延迟网络(如跨机房 Redis 同步)。
-
监听队列长度:
sysctl net.core.somaxconn=65535 sysctl net.ipv4.tcp_max_syn_backlog=65535- 防止在高并发 SYN 请求下丢包,尤其对 Nginx/Proxy 后端的 Redis 集群重要。
3. 内核协议栈优化
- 禁用 IPv6(若未使用):
sysctl net.ipv6.conf.all.disable_ipv6=1- 减少不必要的协议处理开销。
四、CPU 与中断处理调优
1. IRQ Affinity(中断亲和性)
- 将网卡中断绑定到空闲 CPU 核:
- 避免业务线程与中断处理竞争 CPU 资源。
- 工具:
irqbalance(自动均衡)或手动设置/proc/irq/*/smp_affinity。
2. CPU 频率 governors
- 设置为 performance 模式:
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor- 防止 CPU 降频导致响应延迟波动。
3. 隔离核心(Isolcpus)
- 为 Redis/MySQL 分配专用 CPU 核:
- 在 GRUB 中添加
isolcpus=2,3,4,5,然后将对应进程绑定到这些核心。 - 减少其他系统服务(如 cron、logging)对关键进程的干扰。
- 在 GRUB 中添加
五、文件描述符与进程限制
1. 增加最大文件打开数
- Redis 和 MySQL 在高并发下会打开大量 socket 文件和临时文件。
- 修改
/etc/security/limits.conf:* soft nofile 65535 * hard nofile 65535 redis soft nofile 65535 mysql soft nofile 65535 - 修改
/etc/sysctl.conf:fs.file-max = 1000000
2. 用户级别 ulimit
- 确保启动脚本中设置:
ulimit -n 65535
六、监控与诊断工具推荐
| 工具 | 用途 |
|---|---|
iostat -dx 1 |
监控磁盘 IOPS、await、util |
vmstat 1 |
监控上下文切换、swap、CPU 空闲 |
netstat -an | grep TIME_WAIT |
检查网络连接状态分布 |
sar -n DEV 1 |
监控网络接口吞吐量 |
perf top |
分析内核热点函数 |
bpftrace |
高级追踪系统调用延迟 |
七、注意事项与最佳实践
- 不要盲目调优:所有参数应根据实际压测结果调整,不同硬件(SSD vs HDD)、不同负载类型(读多 vs 写多)最优参数不同。
- Redis 特殊要求:
- 禁用 THP 是重中之重。
- 使用
overcommit_memory=1允许内核在内存不足时继续分配(配合 OOM Killer 策略)。
- MySQL 特殊要求:
- 确保 InnoDB Buffer Pool 大小不超过物理内存的 70%~80%,留出空间给 OS 和其他进程。
- 使用
O_DIRECT绕过 OS Page Cache,由 InnoDB 自行管理缓存(避免双重缓存)。
- 安全权衡:某些网络参数(如
tcp_tw_reuse)可能带来安全风险,需在测试环境中验证后再上线。
通过以上操作系统级调优,可以显著提升 Redis + MySQL 架构在高并发场景下的稳定性与吞吐量。
云知识CLOUD