前言
大家都知道mdtest工具一般是用来测试文件系统处理元数据性能的,测试本地文件系统或分布式文件系统都可以。
我们一般在开始测试之前都会设想测试模型,比如:
- 每个文件的大小是多少?4K还是512K或者其他?
- 目录的层次是多少?每个目录下放多少个文件?
上面这些都可以通过mdtest工具参数去指定,mdtest提供了下面几个相关参数:
- -b: 指定非叶子节点的分支个数
- -z: 指定从根到叶子节点的深度
- -I: 每个节点下的文件或目录数
- -np:并发的线程数
但是我们指定完上面的参数之后,并不知道这些参数一共会创建多少个文件、多少个目录。比如下面的命令:
$ mpirun -host ceph01 --allow-run-as-root -np 8 mdtest -I 5000 -b 3 -z 10 -d /mnt/cephfs -C -F
通常只有执行完这条测试命令之后,我们才能知道它创建了多少文件和多少目录。但是我们通常需要预先知道每条测试命令能创建多少文件和目录。
脚本
下面的脚本可以根据mdtest相关的参数,帮我们预测命令最后可以创建的文件数和目录数:
# coding: utf-8
import sys
import argparse
__author__ = 'ypdai'
parser = argparse.ArgumentParser()
parser.add_argument("-b", required=True, type=int, dest="branch", default=1,
help="branching factor of hierarchical directory structure")
parser.add_argument("-z", required=True, type=int, dest="zone", default=1,
help="depth of hierarchical directory structure")
parser.add_argument("-I", required=True, type=int, dest="item", default=10, help="number of items per tree node")
parser.add_argument("--np", required=True, type=int, dest="number", default=1, help=u"number of concurrent threads")
args = parser.parse_args()
n = 0
m = 1
def calc(branch, zone):
global n, m
if zone <= 0:
return
n = n + branch ** m
m += 1
return calc(branch, zone - 1)
calc(args.branch, args.zone)
ds = n + 2
fs = (ds - 1) * args.item
fs = fs * args.number if args.number >= 1 else fs
print("dirs: %s" % ds)
print("files: %s" % fs)
使用示例
就拿我们上给的mdtest命令做测试:
$ python .\caclmdtest.py -b 3 -z 10 -I 5000 --np 8
dirs: 88574
files: 3542920000
这样就可以知道,这组mdtest参数最后创建了3542920000个文件和88574个目录。