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 峰值

优化清单

  1. 版本检查: 使用 v5.04+ 避免旧版连接缓冲问题
  2. 连接数与 FD 限制: 设置 max_connections (5k-10k+) 和 nofile ≥ max_connections
  3. 线程与 CPU: 用上述公式将总线程数匹配 CPU 核数
  4. 目录结构: trunk 场景将 subdir_count_per_path 减少到约 32
  5. 磁盘 I/O: 单盘 = 1 线程;RAID = 根据 CPU 限制增加线程
  6. 同步参数: 根据延迟容忍度调整,用压测验证

错误速查

症状根因修复
”Too many open files” 启动错误nofile/LimitNOFILE 太小增加 limits.conf,重启
高峰连接数高,4xx/5xxmax_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+