8.7. I/Oのプロファイリング¶
I/Oプロファイリングデータの取得例を示します。
本項と合わせて、取得したプロファイリングデータの活用例 I/Oの最適化をご参照ください。
8.7.1. LLIO性能情報¶
ジョブ投入時に--llio perf
オプションを指定すると、LLIO性能情報をジョブの出力結果として得ることができます。これを参照することで、ジョブに関する第1階層ストレージへのアクセス状況を後から分析できます。
LLIO性能情報に関する詳細は、LLIOユーザーズガイドの「2.7.2 LLIO性能情報」を参照ください。
また、次の方法で容易にLLIO領域別のI/O状況を確認することができます。
ジョブ投入時に
--llio perf
オプションを指定してジョブ実行します。- ジョブ終了後、LLIO性能情報が出力されていることを確認します。
例) <jobname>.<jobid>.llio_perf
LLIO性能情報から各領域の状況を確認します。
以下のような集計スクリプトを用意します。
[_LNIlogin]$ cat sample.awk /^SIO Infomation/,/END/ { sumflg=1 } /^I\/O 2ndLayerCache NodeTotal/,/^I\/O 2ndLayerCache ComputeNode/ { if($3 == "Sum" && sumflg == 1){sum1 += $6} } /^I\/O SharedTmp NodeTotal/,/^I\/O SharedTmp ComputeNode/ { if($3 == "Sum" && sumflg == 1){sum2 += $6} } /^I\/O LocalTmp NodeTotal/,/^I\/O LocalTmp ComputeNode/ { if($3 == "Sum" && sumflg == 1){sum3 += $6} } /^Meta 2ndLayerCache NodeTotal/,/^Meta SharedTmp NodeTotal/ { if(NF == 3 && sumflg == 1){sum4 += $3} } /^Meta SharedTmp NodeTotal/,/^Meta LocalTmp NodeTotal/ { if(NF == 3 && sumflg == 1){sum5 += $3} } /^Meta LocalTmp NodeTotal/,/^Resource 2ndLayerCache CacheOperation/ { if(NF == 3 && sumflg == 1){sum6 += $3} } END { total = sum1+sum2+sum3+sum4+sum5+sum6; printf("%-20s %20s %15s\n", " Area","Time(us)", "% of Time"); printf("%-20s %20d %15.1f\n", "Meta 2ndLayerCache", sum4, (sum4/total)*100); printf("%-20s %20d %15.1f\n", " SharedTmp", sum5, (sum5/total)*100); printf("%-20s %20d %15.1f\n", " LocalTmp", sum6,(sum6/total)*100); printf("%-20s %20d %15.1f\n", "I/O 2ndLayerCache", sum1,(sum1/total)*100); printf("%-20s %20d %15.1f\n", " SharedTmp", sum2,(sum2/total)*100); printf("%-20s %20d %15.1f\n", " LocalTmp", sum3,(sum3/total)*100); }
引数にLLIO性能情報を指定して実行します。
[_LNIlogin]$ awk -f sample.awk <jobname>.<jobid>.llio_perf
出力された内訳を確認します。
Area Time(us) % of Time Meta 2ndLayerCache 670517500351 4.0 SharedTmp 15490822246315 92.7 LocalTmp 32396742469 0.2 I/O 2ndLayerCache 357836957071 2.1 SharedTmp 108339293976 0.6 LocalTmp 50591120306 0.3
この例では、共有テンポラリ領域へのメタアクセスが全体の90%以上を占めていると判断できます。
8.7.2. Darshan¶
Darshanは、スケーラブルなHPC向けのI/O評価ツールです。 Spackによりツールが提供されており、ジョブのI/O解析として利用できます。 Darshanの詳細については、以下の URL を参照してください。
https://www.mcs.anl.gov/research/projects/darshan/
プロファイルデータの取得
取得例を示します。SpackからDarshanを読み込み、mpiexecで実行されるプログラムのI/Oプロファイリングデータを取得します。読み込むdarshan-runtimeは、ジョブID情報が残る
scheduler=fj
を推奨します。[_LNIlogin]$ spack find -lv darshan-runtime -- linux-rhel8-a64fx / fj@4.10.0 -------------------------------- kkioahn darshan-runtime@3.4.0~apmpi~apmpi_sync~apxc~hdf5+mpi build_system=autotools scheduler=NONE czlow63 darshan-runtime@3.4.0~apmpi~apmpi_sync~apxc~hdf5+mpi build_system=autotools scheduler=fj ==> 2 installed packages
ジョブスクリプトの記載例
. /vol0004/apps/oss/spack/share/spack/setup-env.sh spack load /czlow63 export DARSHAN_LOG_DIR_PATH=/2ndfs/group/your_dir/ # a # export DARSHAN_ENABLE_NONMPI=1 # b export LD_LIBRARY_PATH=`/home/system/tool/sort_libp` # c /home/system/tool/sort_libp -s -a # mpiexec -stdout-proc ./%n.output.%j/%/1000r/stdout \ -stderr-proc ./%n.output.%j/%/1000r/stderr \ -x LD_PRELOAD=libdarshan.so ./a.out
注釈
- プロファイリングデータの出力先は、2ndfs領域を推奨します。プロファイリングデータはデフォルトで代表1プロセスが書き込みますが、全ての計算ノードからアクセスされます。数千ノード以上で利用しデータ領域に出力した場合、LLIOの制限を超過しノードがスローダウンする可能性があります。
- non-MPI の場合、
export DARSHAN_ENABLE_NONMPI=1
を追加してからLD_PRELOADを有効にしてください。 - 動的ライブラリの検索負荷を削減する目的で、/lib64の追加やパスの重複排除、2ndfsや第2階層ストレージのキャッシュ領域のパスを後ろへ並び変えを行っています。また、コマンドの内部で
llio_transfer
を実行しDarshanのライブラリを共通ファイルとして転送しています。詳細はsort_libpを参照ください。
データの確認
ジョブ実行後に、環境変数DARSHAN_LOG_DIR_PATHに指定したディレクトリにプロファイリングデータが出力されていることを確認します。
[_LNIlogin]$ ls -l /2ndfs/group/your_dir/ -r-------- 1 usr group 13701394 Nov 18 08:08 usr_a.out_JOBID.darshan
ログインノードからプロファイリングデータを展開できることを確認します。
[_LNIlogin]$ spack find -lv darshan-util -- linux-rhel8-cascadelake / gcc@13.2.0 ------------------------- dnpyrbu darshan-util@3.4.0~apmpi~apxc~bzip2 build_system=autotools euiezk6 darshan-util@3.4.4~apmpi~apxc~bzip2 build_system=autotools ==> 2 installed packages [_LNIlogin]$ spack load /euiezk6 [_LNIlogin]$ darshan-parser usr_a.out_JOBID.darshan | less
出力例
... # description of columns: # <module>: module responsible for this I/O record. # <rank>: MPI rank. -1 indicates that the file is shared # across all processes and statistics are aggregated. # <record id>: hash of the record's file path # <counter name> and <counter value>: statistical counters. # A value of -1 indicates that Darshan could not monitor # that counter, and its value should be ignored. # <file name>: full file path for the record. ... #<module> <rank> <record id> <counter> <value> <file name> ... POSIX -1 0123456789123 POSIX_OPENS 18432 /vol0n0m/data/group/config POSIX -1 0123456789123 POSIX_F_FASTEST_RANK_TIME 0.019958 /vol0n0m/data/group/config POSIX -1 0123456789123 POSIX_F_SLOWEST_RANK_TIME 52.856744 /vol0n0m/data/group/config ... POSIX 0 1234567891234 POSIX_OPENS 1 /vol0n0m/data/group/tmp.00000 ... POSIX 1 1234567891234 POSIX_OPENS 1 /vol0n0m/data/group/dat.00001 POSIX 1 1234567891234 POSIX_F_READ_TIME 32.124292 /vol0n0m/data/group/dat.00001
注意
LLIOの非同期クローズオプションが有効な場合、ファイルが第2階層ストレージに未書き出しの場合でもcloseが即時に復帰する可能性があるため、正確なI/O時間を確認できない場合があります。