MDTest
描述
MDtest是一个基于mpi的应用程序,用于评估文件系统的元数据性能,设计用于测试并行文件系统。MDTest不是一个特定于Lustre的基准测试,可以在任何符合posix的文件系统上运行,但它确实需要完全安装和配置的文件系统实现才能运行。 对于Lustre,这意味着必须安装、配置和运行MGS、MDS和OSS服务,并且必须有一个挂载Lustre文件系统的Lustre客户端。
mdtest
应用程序运行在一个完整配置的Lustre文件系统中的Lustre客户端上。使用MPI在多个节点上并行运行多个mdtest
进程,以饱和文件系统I/O。该程序可以创建任意深度的目录树,并可以直接创建混合工作负载,包括仅文件的测试。
描述
MDTest测量给定文件系统实现的元数据性能,并将在任何符合POSIX的文件系统上运行。该程序通过在一组机器(通常是HPC集群中的计算节点)上并行创建、统计和删除目录树和文件来工作。在Lustre的情况下,机器是Lustre客户端。虽然mdtest
可以独立运行以测量本地文件系统性能,但它实际上是在并行和共享文件系统上运行的。
元数据性能是对文件系统能力的一个关键度量,通常与并行文件系统工作负载越来越相关。因此,能够证明Lustre能够匹配甚至超过文件系统应用程序需求的能力是很重要的。MDTest提供了一种定义标准测试的方法,该测试可用于评估文件系统的基线性能,并提供与存储平台的比较度量。
准备工作
mdtest
应用程序是作为源代码分发的,必须在目标环境中进行编译才能使用。作为IOR项目的一部分,mdtest
的首选发行版可以在GitHub上的IOR上获得。LANL添加了LLNL版本中没有的特性,其中最值得注意的是一些支持跨多个mdt的Lustre感知功能和AWS S3支持。实际上,甚至还有第三种选择,隐藏在Lustre JIRA问题跟踪系统的深处LU-56中,增加了针对单个客户机上的多个挂载点运行的能力。
本文档的其余部分将使用OpenMPI作为示例。未讨论与作业调度程序的集成–示例将直接调用“mpirun”命令。
下载并编译MDTest
要编译mdtest
二进制文件,请在合适的机器上运行以下步骤:
-
安装必备的开发工具。在RHEL或CentOS系统上,可以通过运行以下命令来完成此操作:
sudo yum -y install openmpi-devel git
-
下载
mdtest
源代码:git clone https://github.com/IOR-LANL/ior.git
-
编译软件:
cd ior module load mpi/openmpi-x86_64 make clean && make
-
快速验证程序是否运行:
./src/mdtest
例如:
[mduser@ct7-c1 mdtest]$ ./src/mdtest -- started at 06/28/2017 03:07:55 -- mdtest-1.9.4-rc1 was launched with 1 total task(s) on 1 node(s) Command line used: ./src/mdtest Path: /lustre/demo/mdtest FS: 58.0 GiB Used FS: 1.1% Inodes: 5.0 Mi Used Inodes: 0.0% 1 tasks, 0 files/directories SUMMARY: (of 1 iterations) Operation Max Min Mean Std Dev --------- --- --- ---- ------- Directory creation: 0.000 0.000 0.000 0.000 Directory stat : 0.000 0.000 0.000 0.000 Directory removal : 0.000 0.000 0.000 0.000 File creation : 0.000 0.000 0.000 0.000 File stat : 0.000 0.000 0.000 0.000 File read : 0.000 0.000 0.000 0.000 File removal : 0.000 0.000 0.000 0.000 Tree creation : 461.255 461.255 461.255 0.000 Tree removal : 497.512 497.512 497.512 0.000 -- finished at 06/28/2017 03:07:55 --
-
将
mdtest
命令复制到将用于运行基准测试的所有Lustre客户端节点上。或者,复制到Lustre文件系统本身,以便应用程序自动在所有节点上可用。
说明: 目前在一些版本的libfabric库中有一个bug,尤其是1.3.0版本,会导致启动MPI应用程序的延迟。当出现这种情况时,命令输出中将出现以下警告:
hfi_wait_for_device: The /dev/hfi1_0 device failed to appear after 15.0 seconds: Connection timed out
此问题影响RHEL和CentOS 7.3,并在RHEL/CentOS 7.4+和上游项目中解决。详细信息可在此处找到:
https://bugzilla.redhat.com/show_bug.cgi?id=1408316
准备运行时环境
-
如果不存在合适的帐户,请创建一个用户帐户,从中运行应用程序。帐户必须传播到将参与基准测试的所有Lustre客户端节点以及文件系统的MDS服务器。在服务器上,建议禁用该帐户,以防止用户登录这些计算机。
-
一些MPI实现依赖于无密码的SSH密钥。作为基准用户登录到其中一个节点,并创建一个无密码的SSH密钥。这将使
mpirun
命令能够在运行基准测试的每个客户端节点上启动进程。例如:[mjcowe@ct7-c1 ~]$ ssh-keygen -t rsa -N "" -f $HOME/.ssh/id_rsa Generating public/private rsa key pair. Created directory '/home/mjcowe/.ssh'. Your identification has been saved in /home/mjcowe/.ssh/id_rsa. Your public key has been saved in /home/mjcowe/.ssh/id_rsa.pub. The key fingerprint is: e4:b1:10:a2:7f:e8:b1:74:f3:c3:24:76:46:3d:4d:91 mjcowe@ct7-c1 The key's randomart image is: +--[ RSA 2048]----+ | . . oo | | . . . . oE | | . . + o . | | . . = o . | | = * S | | o * O | | o + | | . | | | +-----------------+
-
将公钥复制到帐户的
$HOME/.ssh/authorized_keys
文件。 -
如果用户帐户不托管在共享文件系统上(例如,Lustre文件系统),则将生成的公钥和私钥复制到将在基准测试中使用的每个Lustre客户端节点的
$HOME/.ssh
目录中。通常,用户帐户托管在共享资源上,这使得此步骤不必要。 -
考虑放松
StrictHostKeyChecking
SSH选项,以便将主机条目自动添加到$HOME/.ssh/known_hosts
中,而不是提示用户确认连接。当跨许多节点运行MPI程序时,这可以节省很多不便。如果帐户主目录不在共享存储上,则需要更新所有节点。Host * StrictHostKeyChecking no
-
将MPI运行时安装到所有Lustre客户端节点上:
yum install openmpi
-
将以下行附加到
$HOME/.bashrc
(假设BASH是登录shell)在运行基准测试的帐户上:module purge module load mpi/openmpi-x86_64
这确保了在每次用户登录时(以及每次跨多个节点调用
mpirun
时),都将打开的MPI库路径和二进制路径添加到用户环境中。当mpirun
在远程节点上启动进程时,该文件将不会读取.bash_profile
文件,这就是为什么在本例中没有选择它的原因。
基准执行
-
作为基准测试用户登录到其中一个计算节点
-
为
mpirun
命令创建一个主机文件,其中包含将用于基准测试的Lustre客户端的列表。文件中的每一行表示一台机器和插槽的数量(通常等于CPU核的数量)。例如:for i in `seq -f "%03g" 1 32`; do echo "n"$i" slots=16" done > $HOME/hfile # Result: n001 slots=16 n002 slots=16 n003 slots=16 n004 slots=16 ...
- 主机文件的第一列包含这些节点的名称。如果未设置
/etc/hosts
文件或DNS的话,这也可以是一个IP地址。 - 第二列用于表示CPU核的数量。
- 主机文件的第一列包含这些节点的名称。如果未设置
-
使用
mpirun
运行快速测试以启动基准测试并验证环境是否正确。例如:mpirun --hostfile $HOME/hfile --map-by node -np `cat $HOME/hfile|wc -l` hostname
这将返回测试环境中所有计算机的主机名。结果按完成顺序返回,不排序。
说明: 如果
--map-by node
不起作用,并且输出中只有一个或极少数唯一的主机名重复出现,则为主机文件中的每个主机设置slots=1
。否则,在后续节点上启动进程之前,mpirun
将填满第一个节点上的插槽。这对于多进程测试可能是可取的,但对于每个客户端的单个任务测试则不可取。请勿将插槽计数设置为高于存在的核心数。如果需要过度订阅,请将-np标志设置为大于物理核心的数量。这将通知OpenMPI任务将被超额订阅,并将以将处理器交给对等方的模式运行。
请参阅: OpenMPI FAQ—过度订阅Nodes,以及本文档末尾关于OpenMPI的注释。
-
使用
mpirun
启动mdtest
基准测试。例如:mpirun --hostfile $HOME/hfile -np 48 ./mdtest -n 20840 -i 10 -u -d /lustre/demo/mdtest-scratch
在上面的示例中,48个进程(
-np 48
)将分布在主机文件(--hostfile hfile
)中列出的节点上,每个进程创建20,840个目录和文件(-n 20480
),总共为1,000,320个文件/目录。测试将执行10次迭代(-i 10
),并使用/lustre/demo/mdtest-scratch
作为目标基目录(-d <path>
)。-u
标志告诉程序为每个任务分配一个唯一的工作目录。当第一次在一个新系统上运行测试时,测试的大小应该为10,000个文件/目录。这将使您了解系统将如何处理测试。逐渐增加文件/目录的数量,直到您对所看到的结果感到满意,最多达到1,000,000个文件/目录,如果有特定的需求超过这个值,则可以增加更多。注意,100000个文件/目录可能是交付有意义结果的最小值(这样MDS缓存不会影响结果)。
从少量线程开始,每次运行时使用从1开始的加倍顺序(1、2、4、8、16)增加,使创建的文件总数尽可能接近目标文件/目录。这意味着,随着线程数的增加,
-n
参数的值应该减少。
关于OpenMPI的说明
在准备基准时,请注意跨节点进程的分布。默认情况下,mpirun
在向列表中的下一个节点分配进程之前,将填充一个节点的插槽。也就是说,在将进程分配给第二个节点,然后是第三个节点,依此类推之前,文件中第一个节点上的所有槽位都将被占用。如果请求的槽位数低于主机文件中的槽位总数,则利用率将不会均匀分布,一些节点可能根本不会被使用。
如果进程数大于可用插槽数,则mpirun
将超额订阅一个或多个节点,直到启动所有进程为止。这可以通过将每个主机的槽数设置为1来创建更均匀的节点进程分布。但是,请注意,mpirun
将决定附加进程将运行的位置,这可能会导致作业的不同运行之间的性能差异。
--map-by node
选项在节点之间均匀分布进程,在将进程分配给列表中的下一个节点之前,不会尝试消耗一个节点的所有插槽。例如,如果有4个节点,每个节点有16个插槽(总共64个插槽),并且提交的作业只需要24个插槽,那么每个节点将分配6个进程。
尝试使用hostname
命令作为目标应用程序的选项。例如:
[mduser@ct7-c1 ~]$ cat $HOME/hfile
ct7-c1 slots=16
ct7-c2 slots=16
ct7-c3 slots=16
ct7-c4 slots=16
# By default, mpirun will fill slots on one node before allocating slots from the next:
[mduser@ct7-c1 ~]$ mpirun --hostfile $HOME/hfile -np `cat $HOME/hfile|wc -l` hostname
ct7-c1
ct7-c1
ct7-c1
ct7-c1
# The --map-by node option distributes the processes evenly:
[mduser@ct7-c1 ~]$ mpirun --hostfile $HOME/hfile --map-by node -np `cat $HOME/hfile|wc -l` hostname
ct7-c2
ct7-c1
ct7-c3
ct7-c4
-np
参数是线程的总数。如果主机文件有16个节点,但-np
的值为1,则一个节点上只有一个线程用于完成操作。
mpirun(1)
手册页提供了对可用选项的全面描述。
参见OpenMPI FAQ和oversubscription部分。
参考文献
- https://github.com/MDTEST-LANL/mdtest
- https://github.com/LLNL/mdtest
- https://jira.hpdd.intel.com/browse/LU-56
- https://www.open-mpi.org/faq