前言

声明:此文为本人历史笔记的整理,文章实际撰写时间为2021年2月份,所以本中所使用的相关组件版本较老。此文是通过压力测试以理解MinIO在当前硬件条件下能提供的性能,以及相关的资源消耗情况。转载请注明出处,谢谢!

前置条件:已有Kubernetes集群,并安装好了MinIO集群。

相关组件版本

组件名

版本

说明

Kubernetes

1.19

运行环境

minio

RELEASE.2020-06-14T18-32-17Z

iozone

3-490

测试磁盘的吞吐量

s3-benchmark

测试MinIO的上传下载性能

Part 1, 测试 8Nodes/32Disks

1 集群介绍

  • 8个节点,每节点4*1TiB的磁盘。磁盘底层为VMware的全SSD vSAN分布式存储。
  • minio集群的节点参数设置如下
# Number of drives attached to a node
drivesPerNode: 4
# Number of MinIO containers running
replicas: 8
# Number of expanded MinIO clusters
zones: 1
  • pod的资源没做限制,内存request为4G
  • Storage class为默认
mc admin config get  minio-test storage_class
storage_class standard= rrs=EC:2 dma=write

2 MinIO磁盘性能评估

2.1 测试单盘性能

  • 参照官方的性能测试报告,对于单盘的性能使用dd测试
  • 在k8s的node节点上找到挂载到minio的磁盘,如下面命令所示,minio使用的磁盘为/dev/sd{c.d.e.f}
kubectl get po -n minio -o wide | grep $(hostname)
minio-4                   1/1     Running   0          31m    10.233.102.21   prod-ops-hy-k8s-27-1-31   <none>           <none>

kubectl exec -it minio-4 -n minio -- df -Th|grep export
/dev/sde             ext4         1006.9G    214.4M    955.5G   0% /export-2
/dev/sdd             ext4         1006.9G    214.4M    955.5G   0% /export-3
/dev/sdc             ext4         1006.9G      2.1G    953.6G   0% /export-0
/dev/sdf             ext4         1006.9G     79.3M    955.6G   0% /export-1
  • 查看本地/dev/sdc的挂载路径
df -Th|grep sdc
/dev/sdc                        ext4     1007G  2.1G  954G   1% /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-b7021959-4a18-42e6-b4c6-10eab427e5cc/globalmount
  • 进入上面查找到的路径,执行dd
## 以16M块连续写入2GB数据
# dd if=/dev/zero of=./test bs=16M count=128 oflag=direct
128+0 records in
128+0 records out
2147483648 bytes (2.1 GB) copied, 2.12772 s, 1.0 GB/s

## 以16M块连续读取2GB数据
#  dd of=/dev/null if=./test bs=16M count=128 iflag=direct
128+0 records in
128+0 records out
2147483648 bytes (2.1 GB) copied, 2.01436 s, 1.1 GB/s
  • 上面结果为,单磁盘以16M块连续写吞吐量为1GB/s;以16M块连续读吞吐量为1.1GB/s。

2.2 测试JBOD性能

  • 下载iozone,并安装
wget http://www.iozone.org/src/current/iozone-3-490.x86_64.rpm

rpm -ivh iozone-3-490.x86_64.rpm

ls -l /opt/iozone/bin/iozone
-rwxr-xr-x 1 root root 336464 Jul 14  2020 /opt/iozone/bin/iozone
  • 在/mnt下面创建挂载目录,并将/dev/sd{c.d.e.f}重新挂载,以方便测试
mkdir /mnt/drive{1..4}
mount /dev/sdc /mnt/drive1
mount /dev/sdd /mnt/drive2
mount /dev/sde /mnt/drive3
mount /dev/sdf /mnt/drive4

df -Th | grep /mnt/drive
/dev/sdd                        ext4     1007G  215M  956G   1% /mnt/drive2
/dev/sdc                        ext4     1007G  2.1G  954G   1% /mnt/drive1
/dev/sde                        ext4     1007G  215M  956G   1% /mnt/drive3
/dev/sdf                        ext4     1007G   80M  956G   1% /mnt/drive4
  • 按照官方性能测试报告的推荐,执行iozone,同样使用32 thread。由于不清楚官方文档中取的读写吞吐量值是Children还是Parent,当前测试出来的取Children的话,4个盘聚合的写吞吐量可达到1.2GB/s,读吞吐量为2.3GB/s。
/opt/iozone/bin/iozone -t 32 -I -r 32K -s 256M -F /mnt/drive{1..4}/tmp{1..8}
        Iozone: Performance Test of File I/O

...

        Children see throughput for 32 initial writers  = 1290740.23 kB/sec
        Parent sees throughput for 32 initial writers   = 1030806.54 kB/sec

...

        Children see throughput for 32 readers          = 2365000.80 kB/sec
        Parent sees throughput for 32 readers           = 2362278.36 kB/sec
  • 4. 这个与dd测试的单盘1.1GB/s没太大的差距,由于上面iozone使用的是32K块,可能存在iops的性能达到了极限,而吞吐量上不去的情况。所以改成16M的块再测试一遍,结果如下所示,写吞吐量达到了2.76GB/s,读吞吐量达到了2.74GB/s。
/opt/iozone/bin/iozone -t 32 -I -r 16M -s 256M -F /mnt/drive{1..4}/tmp{1..8}
        Iozone: Performance Test of File I/O

...

        Children see throughput for 32 initial writers  = 2895796.42 kB/sec
        Parent sees throughput for 32 initial writers   = 2450370.20 kB/sec
        Min throughput per process                      =   79270.73 kB/sec
        Max throughput per process                      =  115852.30 kB/sec
        Avg throughput per process                      =   90493.64 kB/sec
        Min xfer                                        =  180224.00 kB

...

        Children see throughput for 32 readers          = 2874974.30 kB/sec
        Parent sees throughput for 32 readers           = 2793761.68 kB/sec
        Min throughput per process                      =   81235.27 kB/sec
        Max throughput per process                      =  100890.62 kB/sec
        Avg throughput per process                      =   89842.95 kB/sec
        Min xfer                                        =  212992.00 kB

3 MinIO吞吐量Benchmark

3.1 准备客户机

  • 从github上克隆wasabi的s3-benchmark到ansible的主控主机上
git clone https://github.com/wasabi-tech/s3-benchmark.git
Cloning into 's3-benchmark'...
remote: Enumerating objects: 40, done.
remote: Total 40 (delta 0), reused 0 (delta 0), pack-reused 40
Unpacking objects: 100% (40/40), done.
  • 这们使用一个k8s测试集群的8个主机节点来做MinIO benchmark的客户机,在ansibie host中这些主机归属于ops-hy-k8s组
at /etc/ansible/hosts
[ops-hy-k8s]
prod-ops-hy-k8s-27-1-11
prod-ops-hy-k8s-27-1-12
prod-ops-hy-k8s-27-1-13
prod-ops-hy-k8s-27-1-14
prod-ops-hy-k8s-27-1-15
prod-ops-hy-k8s-27-1-16
prod-ops-hy-k8s-27-1-17
prod-ops-hy-k8s-27-1-18
  • 执行如下ansible命令将s3-benchmark复制到客户机
cd s3-benchmark
ansible ops-hy-k8s -m copy -a "src=/tmp/s3-benchmark/s3-benchmark dest=/usr/local/bin/s3-benchmark mode=700"
  • 4. 测试下是否可以批量执行
ansible ops-hy-k8s -m shell -a "/usr/local/bin/s3-benchmark -h"
prod-ops-hy-k8s-27-1-14 | FAILED | rc=2 >>
Wasabi benchmark program v2.0Usage of myflag:
  -a string
        Access key
  -b string
        Bucket for testing (default "wasabi-benchmark-bucket")
  -d int
        Duration of each test in seconds (default 60)
  -l int
        Number of times to repeat test (default 1)
  -r string
        Region for testing (default "us-east-1")
  -s string
        Secret key
  -t int
        Number of threads to run (default 1)
  -u string
        URL for host with method prefix (default "http://s3.wasabisys.com")
  -z string
        Size of objects in bytes with postfix K, M, and G (default "1M")non-zero return code

...

3.2 启动benchmark

  • 先生成一个脚本,用来启动s3-benchmark,并复制到每个客户机。-z 2G意思是使用2G的对象进行上传下载测试,-t 32意思是客户端开启32进程
echo "/usr/local/bin/s3-benchmark -a minio -s minio123 -u https://minio-test.xxx.com -z 2G -t 32 -b s3bench-\$HOSTNAME -d 1" > /tmp/s3-benchmark.sh
ansible ops-hy-k8s -m copy -a "src=/tmp/s3-benchmark.sh dest=/root/s3-benchmark.sh"
  • 启动s3-benchmark,请注意这里一定要带"-f 8",不然ansible只会同样启动5个客户机上的脚本
ansible ops-hy-k8s -f 8 -m shell -a "/root/s3-benchmark.sh"
  • 到任意客户机上查看s3-benchmark是否在运行
ps -ef|grep s3
root      4843  4815  0 22:22 pts/4    00:00:00 /bin/sh -c /root/s3-benchmark.sh
root      4844  4843 85 22:22 pts/4    00:00:02 /usr/local/bin/s3-benchmark -a minio -s minio123 -u https://minio-test.xxx.com -z 2G -t 32 -b s3bench-prod-ops-hy-k8s-27-1-11 -d 1
  • 运行完成后返回结果,有两个客户机因为tcp连接重置而退出了
prod-ops-hy-k8s-27-1-13 | FAILED | rc=1 >>
Wasabi benchmark program v2.0
Parameters: url=https://minio-test.xxx.com, bucket=s3bench-prod-ops-hy-k8s-27-1-13, region=us-east-1, duration=1, threads=32, loops=1, size=2G2021/02/08 23:12:14 FATAL: Error uploading object https://minio-test.xxx.com/s3bench-prod-ops-hy-k8s-27-1-13/Object-27: Put https://minio-test.xxx.com/s3bench-prod-ops-hy-k8s-27-1-13/Object-27: net/http: HTTP/1.x transport connection broken: write tcp 10.27.1.13:40542->10.27.1.31:443: write: connection reset by peernon-zero return code

prod-ops-hy-k8s-27-1-17 | FAILED | rc=1 >>
Wasabi benchmark program v2.0
Parameters: url=https://minio-test.xxx.com, bucket=s3bench-prod-ops-hy-k8s-27-1-17, region=us-east-1, duration=1, threads=32, loops=1, size=2G2021/02/08 23:12:17 FATAL: Error uploading object https://minio-test.xxx.com/s3bench-prod-ops-hy-k8s-27-1-17/Object-15: Put https://minio-test.xxx.com/s3bench-prod-ops-hy-k8s-27-1-17/Object-15: net/http: HTTP/1.x transport connection broken: write tcp 10.27.1.17:35888->10.27.1.31:443: write: connection reset by peernon-zero return code

prod-ops-hy-k8s-27-1-18 | CHANGED | rc=0 >>
Wasabi benchmark program v2.0
Parameters: url=https://minio-test.xxx.com, bucket=s3bench-prod-ops-hy-k8s-27-1-18, region=us-east-1, duration=1, threads=32, loops=1, size=2G
Loop 1: PUT time 231.4 secs, objects = 32, speed = 283.3MB/sec, 0.1 operations/sec. Slowdowns = 0
Loop 1: GET time 83.1 secs, objects = 32, speed = 789MB/sec, 0.4 operations/sec. Slowdowns = 0
Loop 1: DELETE time 0.2 secs, 159.8 deletes/sec. Slowdowns = 0

prod-ops-hy-k8s-27-1-12 | CHANGED | rc=0 >>
Wasabi benchmark program v2.0
Parameters: url=https://minio-test.xxx.com, bucket=s3bench-prod-ops-hy-k8s-27-1-12, region=us-east-1, duration=1, threads=32, loops=1, size=2G
Loop 1: PUT time 366.9 secs, objects = 32, speed = 178.6MB/sec, 0.1 operations/sec. Slowdowns = 0
Loop 1: GET time 115.5 secs, objects = 32, speed = 567.4MB/sec, 0.3 operations/sec. Slowdowns = 0
Loop 1: DELETE time 1.2 secs, 25.9 deletes/sec. Slowdowns = 0

prod-ops-hy-k8s-27-1-11 | CHANGED | rc=0 >>
Wasabi benchmark program v2.0
Parameters: url=https://minio-test.xxx.com, bucket=s3bench-prod-ops-hy-k8s-27-1-11, region=us-east-1, duration=1, threads=32, loops=1, size=2G
Loop 1: PUT time 429.8 secs, objects = 32, speed = 152.5MB/sec, 0.1 operations/sec. Slowdowns = 0
Loop 1: GET time 165.5 secs, objects = 32, speed = 396MB/sec, 0.2 operations/sec. Slowdowns = 0
Loop 1: DELETE time 0.2 secs, 137.0 deletes/sec. Slowdowns = 0

prod-ops-hy-k8s-27-1-16 | CHANGED | rc=0 >>
Wasabi benchmark program v2.0
Parameters: url=https://minio-test.xxx.com, bucket=s3bench-prod-ops-hy-k8s-27-1-16, region=us-east-1, duration=1, threads=32, loops=1, size=2G
Loop 1: PUT time 450.1 secs, objects = 32, speed = 145.6MB/sec, 0.1 operations/sec. Slowdowns = 0
Loop 1: GET time 145.6 secs, objects = 32, speed = 450.1MB/sec, 0.2 operations/sec. Slowdowns = 0
Loop 1: DELETE time 0.2 secs, 160.2 deletes/sec. Slowdowns = 0

prod-ops-hy-k8s-27-1-14 | CHANGED | rc=0 >>
Wasabi benchmark program v2.0
Parameters: url=https://minio-test.xxx.com, bucket=s3bench-prod-ops-hy-k8s-27-1-14, region=us-east-1, duration=1, threads=32, loops=1, size=2G
Loop 1: PUT time 442.7 secs, objects = 32, speed = 148MB/sec, 0.1 operations/sec. Slowdowns = 0
Loop 1: GET time 153.9 secs, objects = 32, speed = 425.7MB/sec, 0.2 operations/sec. Slowdowns = 0
Loop 1: DELETE time 0.3 secs, 110.2 deletes/sec. Slowdowns = 0

prod-ops-hy-k8s-27-1-15 | CHANGED | rc=