MinIO增加NVMe驱动器数量后性能不升反降的技术咨询
我们计划采用MinIO作为二进制存储方案,但测试中发现异常:增加磁盘数量后性能反而大幅下降,具体细节如下:
环境配置
- 3台Ubuntu 22.04服务器,每台配置:32核CPU、192GB内存、4块NVMe磁盘
- 所有磁盘已禁用写缓存,执行命令:
sudo echo "write through" | sudo tee /sys/block/<disk>/queue/write_cache
测试场景与结果
场景1:单服务器启用4块NVMe磁盘
使用1个warp客户端发起PUT请求,命令:
warp put --duration=3m --warp-client=localhost:7761 --host=test0{1...3}.ddc.lan:9000 --obj.size=8192 --concurrent=256
测试结果:
Throughput by host: * http://test01.ddc.lan:9000: Avg: 30.85 MiB/s, 3948.59 obj/s * http://test02.ddc.lan:9000: Avg: 30.75 MiB/s, 3936.18 obj/s * http://test03.ddc.lan:9000: Avg: 29.41 MiB/s, 3764.50 obj/s PUT Average: 11369 Obj/s, 88.8MiB/s;
场景2:单服务器仅启用1块NVMe磁盘
重复相同测试命令,结果:
Throughput by host: * http://test01.ddc.lan:9000: Avg: 74.20 MiB/s, 9498.18 obj/s * http://test02.ddc.lan:9000: Avg: 73.76 MiB/s, 9440.70 obj/s * http://test03.ddc.lan:9000: Avg: 72.48 MiB/s, 9278.03 obj/s PUT Average: 27570 Obj/s, 215.4MiB/s;
按文档预期,增加驱动器数量应提升性能,但实际磁盘数增至4倍后,性能反而下降约2.5倍,求排查方向和解决方案。
可能的原因与排查方向
1. MinIO部署模式配置错误
如果是把4块磁盘作为独立的单盘实例(而非纠删码池或分布式池的一部分),MinIO会为每个磁盘启动单独的进程/线程,反而会引发CPU/内存上下文切换开销,尤其是8KB小对象场景下,调度成本会远超磁盘并行收益。
2. 磁盘IO调度器不匹配
NVMe磁盘默认可能使用mq-deadline或kyber调度器,但如果系统默认调度器不适合多盘并行场景,会导致IO队列阻塞,抵消多盘并行的优势。
3. 小对象的元数据瓶颈
8KB属于极小对象,MinIO的元数据操作(本地磁盘存储或etcd)会成为核心瓶颈。多盘场景下,元数据的同步、写入开销会被放大,反而拖累整体性能。
4. 网络并发限制
虽然客户端设置了256并发,但多盘场景下MinIO的网络线程池可能未充分利用,或者服务器TCP参数未优化,导致请求排队阻塞。
解决方案步骤
1. 修正MinIO部署模式
确保4块磁盘被配置为单个纠删码集,启动命令示例:
minio server /data{1...4}
这种模式下MinIO会合理分配对象到不同磁盘,真正利用多盘并行IO能力,而非启动多个独立实例。
2. 优化磁盘IO调度器
NVMe磁盘推荐使用none调度器(无调度,直接透传IO),执行命令:
echo none | sudo tee /sys/block/<disk>/queue/scheduler
验证当前调度器:
cat /sys/block/<disk>/queue/scheduler
3. 调整MinIO小对象优化参数
针对8KB小对象场景,修改MinIO启动参数:
- 启用
--etcd集群存储元数据,减少本地磁盘元数据IO竞争 - 设置
--batch参数合并小对象写入,降低磁盘IO次数 - 调整
--disk-cache-threshold至大于8KB,让小对象先写入内存缓存再批量落盘
4. 优化系统与网络参数
- 调整TCP参数,提升并发处理能力:
echo 1024 | sudo tee /proc/sys/net/core/somaxconn echo 4096 | sudo tee /proc/sys/net/ipv4/tcp_max_syn_backlog - 关闭服务器swap分区,避免内存交换导致的性能波动:
sudo swapoff -a
5. 调整warp测试参数
尝试增加客户端并发数(如--concurrent=512),或者使用多客户端分布式测试,避免单客户端成为性能瓶颈。
内容的提问来源于stack exchange,提问作者Andrey Yesyev

