MDTest

本文介绍MDTest的应用程序,用于评估文件系统的元数据性能。它适用于任何POSIX兼容的文件系统,尤其适合测试并行文件系统。文章详细介绍了MDTest的安装、编译过程以及如何在Lustre文件系统中进行基准测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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二进制文件,请在合适的机器上运行以下步骤:

  1. 安装必备的开发工具。在RHEL或CentOS系统上,可以通过运行以下命令来完成此操作:

    sudo yum -y install openmpi-devel git
    
  2. 下载mdtest源代码:

    git clone https://github.com/IOR-LANL/ior.git
    
  3. 编译软件:

    cd ior
    module load mpi/openmpi-x86_64
    make clean && make
    
  4. 快速验证程序是否运行:

    ./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 --
    
  5. 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

准备运行时环境

  1. 如果不存在合适的帐户,请创建一个用户帐户,从中运行应用程序。帐户必须传播到将参与基准测试的所有Lustre客户端节点以及文件系统的MDS服务器。在服务器上,建议禁用该帐户,以防止用户登录这些计算机。

  2. 一些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   +        |
    |         .       |
    |                 |
    +-----------------+
    
  3. 将公钥复制到帐户的$HOME/.ssh/authorized_keys 文件。

  4. 如果用户帐户不托管在共享文件系统上(例如,Lustre文件系统),则将生成的公钥和私钥复制到将在基准测试中使用的每个Lustre客户端节点的$HOME/.ssh目录中。通常,用户帐户托管在共享资源上,这使得此步骤不必要。

  5. 考虑放松StrictHostKeyCheckingSSH选项,以便将主机条目自动添加到$HOME/.ssh/known_hosts中,而不是提示用户确认连接。当跨许多节点运行MPI程序时,这可以节省很多不便。如果帐户主目录不在共享存储上,则需要更新所有节点。

    Host *
      StrictHostKeyChecking no
    
  6. 将MPI运行时安装到所有Lustre客户端节点上:

    yum install openmpi
    
  7. 将以下行附加到$HOME/.bashrc(假设BASH是登录shell)在运行基准测试的帐户上:

    module purge
    module load mpi/openmpi-x86_64
    

    这确保了在每次用户登录时(以及每次跨多个节点调用mpirun时),都将打开的MPI库路径和二进制路径添加到用户环境中。当mpirun在远程节点上启动进程时,该文件将不会读取.bash_profile文件,这就是为什么在本例中没有选择它的原因。

基准执行

  1. 作为基准测试用户登录到其中一个计算节点

  2. 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核的数量。
  3. 使用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的注释

  4. 使用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 FAQoversubscription部分。

参考文献

  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值