脚本化
IOR可以使用-f
选项在命令行中使用输入脚本。在-f
选项之前设置的命令行选项将被视为运行脚本的默认设置。例如:
mpirun ./ior -W -f script
将使用隐式-W
运行脚本中的所有测试。脚本本身可以覆盖这些设置,并且可以设置为在一次执行下运行许多不同的IOR测试,重要的是要注意在-f
之后指定的任何命令行选项都不会应用于脚本指定的运行。例如:
mpirun ./ior -f script -W
将不会运行任何带有隐式-W
的测试,因为该参数直到-f
选项(及其组成运行)完成后才会应用。
输入脚本使用与每个命令行选项对应的长格式选项名来指定。除了长格式的选项,
IOR START
和IOR STOP
(不区分大小写)标记脚本的开始和结束。RUN
(不区分大小写)使用前面指定的所有选项调度测试。- 所有先前设置的参数为下一次测试保持设置。它们不会重置为默认值!默认情况下,必须手动设置剩余部分。
- 空白在脚本中被忽略,以“#”开头的注释也是如此。
- 不是所有的测试参数都需要设置。
一个脚本示例:
IOR STARTapi=[POSIX|MPIIO|HDF5|HDFS|S3|S3_EMC|NCMPI|RADOS]testFile=testFilehintsFileName=hintsFilerepetitions=8multiFile=0interTestDelay=5readFile=1writeFile=1filePerProc=0checkWrite=0checkRead=0keepFile=1quitOnError=0segmentCount=1blockSize=32koutlierThreshold=0setAlignment=1transferSize=32singleXferAttempt=0individualDataSets=0verbose=0numTasks=32collective=1preallocate=0useFileView=0keepFileWithError=0setTimeStampSignature=0useSharedFilePointer=0useStridedDatatype=0uniqueDir=0fsync=0storeFileOffset=0maxTimeDuration=60deadlineForStonewalling=0useExistingTestFile=0useO_DIRECT=0showHints=0showHelp=0
RUN
# additional tests are optionaltransferSize=64blockSize=64ksegmentcount=2
RUNtransferSize=4KblockSize=1Msegmentcount=1024
RUN
IOR STOP
版本兼容性
IOR有很长的历史,目前只支持IOR版本3。但是,有许多基于早期版本的IOR分支,并且已知在主要版本之间存在以下不兼容性。
- IOR版本1(c.1996-2002)和IOR版本2(c.2003至今)不兼容。一个输入面板在另一个上不起作用。由于版本1未包含在此版本中,因此不应引起关注。所有后续的兼容性问题都适用于IOR版本2。
- 发布2.8之前的IOR版本提供了2次幂的数据大小和速率。例如,1MB/sec表示每秒1048576字节。在IOR 2.8及更高版本中,MB现在定义为1000000字节,MiB为1048576字节。
- 在IOR 2.5.3至2.8.7版本中,IOR可以在没有任何命令行选项的情况下运行。这假设如果省略了写和读选项(-w -r),则使用它们的运行都设置为默认值。后来,很明显,在某些情况下(例如数据检查),这会造成困难。在IOR 2.8.8及更高版本中,如果没有设置-w-r-W或-R选项,则隐式设置-w和-r。
- IOR版本3(2012年1月至今)在一定程度上改变了IOR的输出,并且“testNum”选项被重命名为“refNum”。
常见问题解答
如何对现有文件执行多个数据检查?
使用下面的命令行:
IOR -k -E -W -i 5 -o file
-k在访问后保留文件而不是删除它,-E使用现有文件而不是先截断它,-W执行写检查,-i检查迭代次数,-o文件名
在2.8.8之前的IOR版本上,还需要-r标志,否则将首先覆盖现有文件。(在早期的版本中,省略-w和-r意味着同时使用这两个词。这个语义后来被修改为省略-w、-r、-W和-R,意味着使用-w和-r。)
如果正在运行新的测试来创建文件,并希望多次重复此文件的数据检查,则有一个未记录的选项。它是-O multiReRead=1
,需要使用USE_UNDOC_OPT=1
编译IOR版本(在iordef.h
中)。命令行看起来像这样:
IOR -k -E -w -W -i 5 -o file -O multiReRead=1
对于第一次迭代,将写入文件(无数据检查)。然后,对于任何额外的迭代(在本例中为4次),将为使用的任何数据检查选项重新读取文件。
IOR如何计算性能?
IOR执行获取时间戳START,然后让所有参与的任务打开共享的或独立的文件,传输数据,关闭文件,然后获取STOP时间。对文件执行stat()
或MPI_File_get_size()
,并与传输的总数据量进行比较。如果此值不匹配,则发出警告,并使用write()
计算的传输数据量,例如返回代码。计算出的带宽是传输的数据量除以经过的STOP减去START时间。
IOR还可以获得时间戳来报告打开、转移和关闭时间。这些时间中的每一个都基于任何任务的最早开始时间和任何任务的最近停止时间。如果不在这些操作之间使用屏障(-g
),打开、转移和关闭时间的总和可能不等于从第一次打开到最后一次关闭所经过的时间。
如何在IOR中访问多个文件系统?
当使用filePerProc选项时,可以跨多个文件名进行任务循环。与其使用单个文件名-o file
,还不如使用其他文件名-o file1@file2@file3
。在这种情况下,每个进程的文件将有三个不同的文件名(可能是完整的路径名)来访问。@
分隔符是任意的,可以在iordef.h
中的FILENAME_DELIMITER
定义中设置。
注意,这个多文件名选项只适用于filePerProc -F
选项。这对共享文件不起作用。
如何在多个文件系统之间平衡负载?
对于每个文件系统的文件平衡,不同的文件系统提供不同的性能,相同目标路径的附加实例通常可以实现良好的平衡。
例如,如果FS1的性能比FS2好50%,则设置-o
标志,以便有更多的FS1目录实例。在这种情况下,-o
FS1/file@FS1/file@FS1/file@FS2/file@FS2/file应该根据性能差异进行相应的调整和平衡。
我如何使用屏障?
要使用屏障(-D),通常最好将写测试与读测试分开。首先使用-D 0
(禁用屏障)写入文件,以确定写入文件需要多长时间。如果数据传输需要10秒,请以较短的持续时间再次运行,例如-D 7
,以便在文件完成之前停止,而不会造成阻碍。对于读取,最好创建一个完整的文件(而不是从屏障运行中写入不完整的文件),然后在这个预先存在的文件上设置屏障运行。如果使用屏障在同一次运行中执行写和读测试,则读取很可能会在遇到EOF时遇到错误。分开运行可以纠正这一点。例如。,
IOR -w -k -o file -D 10 #记录并保存文件,10秒后停止
IOR -r -E -o file -D 7 # 读取现有文件,7秒后停止
此外,当运行只读屏障测试的多次迭代时,可能需要将-D值设置得足够高,以便每次迭代都不会从缓存中读取。否则,在某些情况下,第一次迭代可能会显示100 MB/s,下一次为200 MB/s,第三次为300 MB/s。这些测试中的每一个实际上都是在分配的时间内从硬盘读取相同的数据量,但它们每次都会从上一次测试中读取缓存数据,以获得更高的性能。将-D设置得足够高,以使缓存溢出,这将防止这种情况发生。
在读回刚写的文件时,如何绕过缓存?
测试文件系统的一个问题是处理缓存数据。当写入文件时,该数据可能会本地存储在写入文件的节点上。当同一节点试图从文件系统读取数据以进行性能或数据完整性检查时,它可能是从自己的缓存中读取数据,而不是从文件系统中读取数据。
reorderTasksConstant -C
选项试图通过让不同的节点读回数据来解决这个问题。例如,节点N将数据写入文件,节点N+1读回数据以提高读取性能,节点N+2读回数据进行写入数据检查,节点N+3读取数据进行读取数据检查,并将其与节点N+4的重读数据进行比较。目标是确保在文件访问时,数据不会从缓存数据中读取。
Node 0: 写数据
Node 1: 读数据
Node 2: 读取已写入的数据进行写检查
Node 3: 读取已写入的数据进行读检查
Node 4:读取已写入的数据进行读检查,与Node 3进行比较
例如,从N跳到N+1的算法期望节点上的连续任务号(块分配),而不是循环分配的任务号(循环分配)。例如,在3个节点上运行6个任务的测试将期望节点0上的任务0,1;节点1上的任务2、3;以及节点2上的任务4、5。如果以循环方式将任务分配给节点,则节点0上将有任务0,3;节点1上的任务1,4;节点2上的任务2,5。在这种情况下,不会期望任务不会从节点上缓存的数据中读取。
如何使用提示?
可以按照以下形式将提示传递给I/O库或文件系统层:
'setenv IOR_HINT__<layer>__<hint> <value>'
-
例如::
setenv IOR_HINT__MPI__IBM_largeblock_io true
setenv IOR_HINT__GPFS__important_hint true
-
或者,在以下格式的文件中:
IOR_HINT__<layer>__<hint>=<value>
-
注意,HDF5或NCMPI层对MPI的提示是这样的:
setenv IOR_HINT__MPI__<hint> <value>
如何显式设置文件数据签名?
传输的数据签名包含MPI任务号、传输缓冲区偏移量以及迭代开始的时间戳。由于IOR使用8字节长的长整数,因此写入的偶数长整数包含32位MPI任务号和32位时间戳。奇数长整型包含一个64位的transferbuffer偏移量(如果使用-l
storeFileOffset选项,则为文件偏移量)。要设置时间戳值,请使用-G
或setTimeStamp签名。
如何方便地检查或更改输出数据文件中的字节?
可以构建一个简单的实用程序IOR/src/C/cbif /cbiff.c。这是一个独立的串行应用程序,称为cbif (Change Byte In File)。该实用程序允许检查文件偏移量,并以IOR的数据检查格式返回该位置的数据。它还允许更改该位置的一个字节。
如何纠正集群中节点之间的时钟偏差?
为了纠正节点之间的时钟偏差,IOR比较节点之间的时间,然后广播根节点的时间戳,以便所有节点都可以根据差异进行调整。要查看异常异常值,请使用-j
选项。请确保将此值设置得足够高,以便仅显示距离平均值特定时间之外的节点。