8.4. ノード内テンポラリ領域

同一ジョブ内の同一ジョブプロセス内でローカルに使用するファイルの一時領域として、ノード内テンポラリ領域を提供します。この領域は1つの計算ノードの中だけで参照できます。

  1. ノード内テンポラリ領域は、複数の計算ノードから共有できません。

  2. ノード内テンポラリ領域は、ジョブ開始時に使用可能になり、ジョブ終了時に消去されます。ジョブ実行結果ファイルなど退避は第2階層ストレージのキャッシュ領域(または2ndfs領域)に配置する必要があります。

  3. ノード内テンポラリ領域を使用するには、ジョブ投入時にpjsubコマンドのオプションで、--llio localtmp-sizeで任意の領域サイズを指定する必要があります。

  4. ノード内テンポラリ領域のパス名は、ジョブ内で環境変数${PJM_LOCALTMP}により参照できます。

../_images/TemporaryAreaInNode_01.png
  1. ノード内テンポラリ領域の仕様を以下に説明します。

    ノード内テンポラリ領域の仕様

    項目

    特性

    参照範囲

    ジョブに割り当てられた計算ノードの中で、その計算ノードで動作する同一ジョブからのみ参照できます。

    生存期間

    ジョブ起動前に初期化され、ジョブ終了時に削除されます。

8.4.1. ノード内テンポラリ領域の容量

ノード内テンポラリ領域を使う場合、そのサイズはジョブ投入時に指定できます。 pjsubコマンドの--llioオプションのパラメーターlocaltmp-sizeで1ノード当たりのノード内テンポラリ領域のサイズを指定します。サイズを指定しない場合は、ジョブACL機能で設定されているデフォルト値(0MiB)になります。

領域名

オプション

指定値

ノード内テンポラリ領域

--llio localtmp-size

1ノード当たりのノード内テンポラリ領域サイズ

サイズの指定は次を満たすようにしてください。第2階層ストレージのキャッシュの容量に128MiB以上を割り当てる必要があります。:

128MiB <= 87GiB - (localtmp-size + sharedtmp-size)

8.4.2. 利用方法

ジョブ投入時にオプションを指定することで、ノード内テンポラリ領域を利用できます。

  1. ジョブを投入します。
$ pjsub --llio localtmp-size=30Gi jobscript.sh

別の指定方法として、ジョブスクリプトにノード内テンポラリ領域のサイズを指定することもできます。

#!/bin/bash
#PJM --llio localtmp-size=30Gi
  1. ノード内テンポラリ領域のパス名(ディレクトリ名)は、環境変数PJM_LOCALTMPに設定されます。ジョブ内で設定されている環境変数PJM_LOCALTMPで知ることができます。以下は、ノード内テンポラリ領域を一時的なデータの格納先として利用する簡単なジョブの例です。

    prog1 -o ${PJM_LOCALTMP}/out.data
    
  2. ファイルout.dataをプログラムprog2が読み込んで、ディレクトリ${PJM_LOCALTMP}に最終的な計算結果result.dataを出力します。

    prog2 -i ${PJM_LOCALTMP}/out.data -o ${PJM_LOCALTMP}/result.data
    
  3. ジョブの終了前にファイルresult.dataをジョブ実行時のディレクトリ${PJM_JOBDIR}(グローバルファイルシステム上)に、ジョブID${PJM_JOBID}をつけた名前に変えて退避します。

    cp ${PJM_LOCALTMP}/result.data ${PJM_JOBDIR}/result_${PJM_JOBID}.data
    
  4. ノード内テンポラリ領域に第2階層ストレージからファイルをコピーする場合は、ノード内の1プロセスのみを利用してコピーを行います。コピーする例を示します。

    mpiexec sh -c 'if [ ${PLE_RANK_ON_NODE} -eq 0 ]; then  \
                       cp -rf ./data/   ${PJM_LOCALTMP} ; \
                   fi'
    

並列プロセス毎に異なる出力ファイルをノード内テンポラリ領域に作成することができます。mpiexecで実行したプログラム内のランク番号は、環境変数PMIX_RANKに設定されます。touchコマンドを用いた例を示します。

  1. プロセス毎にファイルを作成します。
mpiexec sh -c 'touch ${PJM_LOCALTMP}/result_${PMIX_RANK}.data'
  1. 並列プロセス毎に異なる出力ファイルをノード内テンポラリ領域から第2階層ストレージ領域に退避します。

mpiexec sh -c 'cp ${PJM_LOCALTMP}/result_${PMIX_RANK}.data ${PJM_JOBDIR}/result_${PMIX_RANK}_${PJM_JOBID}.data'

8.4.3. ジョブ投入時(pjsub --llio)のオプション

ノード内テンポラリ領域に関連するオプションを示します。

pjsubオプション

説明

localtmp-size=size

ノード内テンポラリ領域のサイズを指定します。
ノード内テンポラリ領域のパス名は、ジョブ内で環境変数PJM_LOCALTMPに設定されます。

async-close={on|off}

ノード内テンポラリ領域↑のファイルのクローズを非同期クローズにするか否かの動作を指定します。
計算ノード内のキャッシュからノード内テンポラリ領域に対する同期/非同期クローズ指定します。

on: 非同期クローズ
off: 同期クローズ(デフォルト値)

perf[,perf-path=path]

LLIO性能情報をファイルに出力します。
出力先はジョブ投入時のカレントディレクトリ配下で、ファイル名はジョブACL機能で定義されている名前です。なお、パラメーターperf-pathで出力先のファイルを指定できます。

8.4.4. 計算ノード内のキャッシュに関連するオプション

ジョブに割り当てられた計算ノードのメモリに余裕がある場合は、空いたメモリを計算ノード内キャッシュとして使用することにより高速なファイル入出力が期待できます。

指定方法として、計算ノード内のキャッシュに関連するジョブ投入時(pjsub)のオプションを示します。
pjsub --llioオプションで指定します。指定されたオプションは、説明の下段に記載する環境変数をジョブ内から参照できます。

pjsubオプション

説明

auto-readahead={on|off}

ジョブが複数回続けて第1階層ストレージまたは第2階層ストレージ上の連続した領域を読み込もうとした場合に、自動的に計算ノード内のキャッシュに先読みをするか否かの動作を指定します。
auto-readaheadを有効(on)にするには、cn-read-cacheを有効(on)にする必要があります。

on: 先読みをします。(デフォルト値)
off: 先読みをしません。
環境変数PJM_LLIO_AUTO_READAHEAD

cn-cache-size=size

計算ノード内キャッシュのサイズを指定します。ジョブに割り当てられたメモリから確保されます。
環境変数PJM_LLIO_CN_CACHE_SIZE

cn-cached-write-size=size

第1階層ストレージへの書込み時にキャッシュするか否かのしきい値を指定します。
第1階層ストレージへの書込みの際に、書込みサイズが指定した値以下の場合は、すぐにはストレージに書き出さず、一時的に計算ノード内キャッシュにキャッシュします。小さなサイズについてはまとめて書き出すことで、第1階層ストレージへの転送回数を減らし、性能を向上させるためのパラメーターです。
環境変数PJM_LLIO_CN_CACHED_WRITE_SIZE

8.4.5. ノード内テンポラリ領域の活用例

8.4.5.1. TMPDIR

環境変数TMPDIRに、ノード内テンポラリ領域を指定することによりプログラムのファイルアクセスの性能改善を期待できます。例として、Fortranプログラムでスクラッチファイルを利用する場合が挙げられます。システムの/etc/profileで、TMPDIRに環境変数 HOMEを設定しています。プログラムのIO先を、第2階層ストレージ領域からノード内テンポラリ領域に変更することにより、スクラッチ・ファイルのアクセス時間が短縮され、性能の改善が見込めます。

TMPDIRの設定例を示します。

export TMPDIR=$PJM_LOCALTMP

使用するノード内テンポラリ領域の容量を指定して、ジョブを投入してください。

#!/bin/bash
#PJM --llio localtmp-size=5Gi

8.4.5.2. アーカイブファイルの展開

アーカイブファイルをノード内テンポラリ領域へ展開する場合、共通ファイル配布機能 (llio_transfer)と組み合わせて利用することによりファイルアクセスの性能改善を期待できます。 多数の計算ノードから第2階層ストレージ上のアーカイブファイルを展開する場合はアクセスが集中しIO性能が極端に劣化します。そのため、アーカイブファイルを共通ファイルとして配布し、アクセスを分散させることで性能の改善が見込めます。

アーカイブファイルの展開例を示します。

llio_transfer ./archive.tar

mpiexec sh -c 'if [ ${PLE_RANK_ON_NODE} -eq 0 ]; then \
                   tar xf ./archive.tar -C $PJM_LOCALTMP; \
               fi'

llio_transfer --purge ./archive.tar