TL;DR
- 场景: 高并发 / 海量小文件(trunk)/ 单盘或 RAID
- 结论: 升级到 v5.04+,增加 max_connections 并对齐 nofile;总线程数 ≈ CPU 核数;减少目录层级;根据延迟目标调 sync 参数。
- 产出: 可部署的参数基线 + 版本说明 + 错误速查卡。
核心内容
1. max_connections 配置
- 文件: tracker.conf, storage.conf
- 默认值: 256
- 关键变更: 自 v5.04 起使用增量预分配(tracker: 1024,storage: 每次 256)
- 建议: 设置为 10240 或更高,与系统 nofile 限制配合
系统限制设置:
vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
2. work_threads 配置
推荐公式:
- Tracker: work_threads + 1 ≈ CPU 核数
- Storage: work_threads + 1 + (disk_reader_threads + disk_writer_threads) × store_path_count ≈ CPU 核数
3. subdir_count_per_path
- 默认值: 256(创建 256 × 256 = 65,536 个目录)
- 建议: trunk 场景下海量小文件,减少到 32(创建 32 × 32 = 1,024 个目录)
4. 磁盘 I/O 线程
| 场景 | 配置 |
|---|---|
| 单盘 | disk_reader_threads = 1, disk_writer_threads = 1 |
| RAID | 启用 disk_rw_separated,适当增加读写线程 |
5. 同步参数
- sync_binlog_buff_interval: 默认 60s,降低到 10-30s 以降低延迟
- sync_wait_msec: 默认 200ms,降低到 50-100ms 以加快任务发现
- sync_interval: 默认 0ms,设置为 1-5ms 以平滑 IO 峰值
优化清单
- ✅ 版本检查: 使用 v5.04+ 避免旧版连接缓冲问题
- ✅ 连接数与 FD 限制: 设置 max_connections (5k-10k+) 和 nofile ≥ max_connections
- ✅ 线程与 CPU: 用上述公式将总线程数匹配 CPU 核数
- ✅ 目录结构: trunk 场景将 subdir_count_per_path 减少到约 32
- ✅ 磁盘 I/O: 单盘 = 1 线程;RAID = 根据 CPU 限制增加线程
- ✅ 同步参数: 根据延迟容忍度调整,用压测验证
错误速查
| 症状 | 根因 | 修复 |
|---|---|---|
| ”Too many open files” 启动错误 | nofile/LimitNOFILE 太小 | 增加 limits.conf,重启 |
| 高峰连接数高,4xx/5xx | max_connections 太小 | 增加 max_connections,对齐 nofile |
| CPU 高但 QPS 低 | work_threads 太多 | 减少到 ≈ CPU 核数 |
| 初始化/遍历慢 | subdir_count_per_path 太大 | 减少到约 32 |
| RAID 空闲但吞吐低 | 读写线程不足 | 启用 disk_rw_separated,增加线程 |
| 跨机器同步延迟高 | sync_binlog_buff_interval 太大 | 减少 binlog 周期到 10-30s |
| 磁盘抖动,延迟飙升 | 同步/写入太激进 | 设置 sync_interval 到 1-5ms |
| 初始内存异常大 | 旧版一次性分配 buffer | 升级到 v5.04+ |