Comments
Description
Transcript
スライド 1
2012/5/10 スパコン利用者説明会 -UGEでジョブを投入する ノウハウ- この講習の目的 数百・数千のジョブを円滑に実行する方 法を知る 1 Univa Grid Engine(UGE)とは グリッドコンピューティングシステムを 構築するソフトウェア。バッチジョブシ ステムとして機能する Sun Grid Engine6.2U5(オープンソー ス版としては最後のバージョン)から派生 した商用製品。開発にはGrid Engineの 主要な開発メンバーが参加している ジョブ投入時のコマンド等はSGEと同じ 2 UGEを利用する利点 大量のジョブを逐次、円滑に実行できる 複数のユーザが同時に大量のジョブを投入し ても、UGEがスケジューリングを行う ジョブが求めるメモリ、CPU等に応じて、 適切なスケジューリングを行う UGEを利用するうえでの注意点 ジョブの並列化などは行わない ジョブ投入時のリソース要求宣言を適切に行 わない場合、大規模な計算機のハングアップ を招く場合がある 3 目次 2. スパコンシステムの構成・特性 3. 投入するジョブの負荷特性を知る 4. ジョブの実行状況を管理する方法を知る 4 ジョブを大量に投入する前に1 数百~数千のジョブを一度に投入すると、 普段は問題にならない点が問題になる 1ジョブの負荷は僅かでも、同時実行数が多くなると莫大な負荷に なる。CPU負荷、メモリ消費量、I/Oに注意する。 特にI/Oに注意。 ジョブの負荷を把握していないと、百台単位のノードのハングアッ プやファイルシステムの障害等、大規模な問題に発展する。 ジョブの数が多くなると、結果の確認等、ジョブを適切に管理する 仕組みが必要になる 5 ジョブを大量に投入する前に2 ジョブを大量に投入するには準備が必要 適切な準備が行われれば、ジョブは最速で実行される 準備を怠ると、ジョブの実行速度が数倍~数十倍遅延 する。過剰な負荷で他のユーザに迷惑をかけ、最悪、 システムを停止させる ジョブを大量に投入するために システムの構成・特性を知る ジョブの負荷特性(CPU・メモリ・I/O)を知る ジョブの実行状況を管理する方法を知る 6 目次 1. ジョブを大量に投入する前に 3. 投入するジョブの負荷特性を知る 4. ジョブの実行状況を管理する方法を知る 7 スパコンシステム概要 Fatノード Thinノード Mediumノード InfiniBand 高速領域 (Lustre) 省電力領域(NFS) 8 目次 2.2 ファイルシステムの特徴 2.3 UGEジョブ投入時の上限値 9 各計算ノードの特徴1 Thinノード (162台) Thinノード(SSD搭載) (76台) Thinノード(SSD, GPU搭載)(64台) 搭載メモリ量:64GB CPU:Xeon E5-2670(SandyBridge-EP) 2.6GHz 8コア x 2ソケット(16コア) ノードによってはSSD, GPUを搭載している 1CPUコアの処理能力は3種類のノードの中で最も高性能。 1ジョブあたりの要求メモリ量が搭載メモリ量(64GB) に収まる処理であれば、このノードを積極的に使用する。 10 各計算ノードの特徴2 Mediumノード(2台) 搭載メモリ量:2TB CPU: Xeon E7-4870(Westmere EX) 2.4GHz 10コア x 8ソケット(80コア) 1ジョブあたりの要求メモリ量が64GB以上~2TB未満 の処理であれば、このノードを使用する Fatノード(1台) 搭載メモリ量:10TB CPU:Xeon E7-8837(Westmere EX) 2.67GHz 8コア x 96ソケット(768コア) 2TB以上の共有メモリが必要な処理を実行したい場合、 このノードを使用する 11 目次 2.1 各計算ノードの特徴 2.3 UGEジョブ投入時の上限値 12 ファイルシステムの概要 /lustre1,/lustre2は 共有ファイルシステムで、 全計算ノードから参照できる 各ユーザのホームディレクトリは /lustre1,/lustre2に分散配置されている。 自分のホームの場所は、以下のコマンド で確認できる $ ls –l /home/lect01 lrwxrwxrwx 1 root root 20 /lustre1/home/lect01 $ 3月 18 15:35 2012 /home/lect01 -> 13 ファイルシステムの詳細 /lustre1, /lustre2はLustreファイルシステムによ り構成されている OSS (Object Storage Server) 特徴 分散ファイルシステム MDSがメタデータを、OSSが実体を 分散管理する データの実体は複数のOSSにストライピン グすることもできる データ 実体 MDS (Meta Data Server) メタデータ 数GBの少数ファイルに高速アクセス 多数のファイル操作はext4より遅い 14 ストライプサイズの変更1 ファイルを配置するOSSの数を変更できる (Object Storage Targetの数を変更する) ストライプサイズ1の場合 ストライプサイズが1(デフォルト) の場合、そのファイルの内容は 1つのOSS上に存在する ストライプサイズが2以上の場合、 そのファイルの内容は指定した数の OSS上に分散して存在する ストライプサイズ12の場合 15 ストライプサイズの変更2 ストライプサイズの変更はlfsコマンドで行う lfs setstripe –c ストライプ数 対象ディレクトリ -c:ストライプ数を指定する。自由に指定できる。 $ mkdir stripe1 $ lfs getstripe stripe1 stripe1 stripe_count: 1 stripe_size: $ mkdir stripe12 $ lfs setstripe -c 12 stripe12 $ lfs getstripe stripe12 stripe12 stripe_count: 12 stripe_size: 1048576 stripe_offset: 0 stripe_offset: -1 -1 通常はストライプサイズは1。400MB/sec程度でアクセス ストライプサイズを12にすると、1GB/sec程度でアクセス 16 ストライプサイズの変更基準 変更が有効である場合 数GB以上のファイルを配置するとき 数MBのファイルを数百個配置するとき ただし数千個配置するときは、ディレクトリによりファイルを 分散させる必要あり → 2倍程度高速化 OSSの負荷を軽減 変更が有効でない場合 数千個の数B~数KBのファイルを配置するとき → 2倍程度遅延 MDS, OSSの負荷が増加 17 数千個のファイルの取り扱い Lustreが苦手な処理。特に“ls -l”が苦手 touchコマンドで空のファイルをループで連続して作成 作成後、“ls -l”を実行 ファイル数 作成時間(sec) “ls –l”実行時間(sec) 1,000 1.2 0.2 10,000 12.8 1.9 100,000 148.6 19.3 118.8 0.9 ※HDD(ext4)の場合 100,000 1プロセスでは問題にならないが、多数のプロセスがアクセスす ると、I/O waitが増え、MDSが過負荷となる ファイル過多によるMDS遅延は、他ユーザにも影響する → 1ディレクトリ内のファイル数を5,000程度とし、ディレク トリを分割し管理する 18 目次 2.1 各計算ノードの特徴 2.2 ファイルシステムの特徴 19 UGEのジョブ投入数の上限 以下の場合、qsub時にエラーとなる 全ユーザの実行中, 実行待ちジョブ合計数が50,000ジョブを超 過した場合 1ユーザの実行中, 実行待ちジョブ合計数が5,000ジョブを超過 した場合 特殊なジョブを投入した場合の数え方 MPIジョブは並列度にかかわらず1ジョブとしてカウントされる アレイジョブはタスク数にかかわらず1ジョブとしてカウントさ れる アレイジョブのタスク数は75,000タスクが上限 → 数千ジョブ投入の際は、必ずアレイジョブとして投入する 20 ジョブの同時実行数上限1 一般研究用アカウントのユーザは、ジョ ブスロットを同時に100スロットまで使 用可能(※現在は緩和されている) 大規模利用アカウントのユーザは、ジョ ブスロットを同時に500スロットまで使 用可能(※現在は緩和されている) qsubによるジョブ投入は投入数の上限値 まで正常にできるが、ジョブは上記制限 の範囲でジョブスロットを使用しつつ進 行する 21 ジョブの同時実行数上限2 制限状況はqquotaコマンドで確認可能 複数の制限に該当する場合、より厳しい制限が優先 される 以下の例では、100が適用される $ qquota resource quota rule limit filter ------------------------------------------------------------------------------general_limit/1 slots=2/100 users lect01 large_limit/1 slots=2/500 users lect01 $ 22 目次 1. ジョブを大量に投入する前に 2. スパコンシステムの構成・特性 4. ジョブの実行状況を管理する方法を知る 23 目次 3.2 ジョブ群の負荷を予測する 3.3 I/O負荷を軽減する 3.4 qsubオプションの検討 3.5 ジョブ実行時のお願い 24 ジョブ単体の負荷を計測する1 計測は、qlogin先のノードでインタラクティブにジョブを 実行する, もしくはdebug.qにジョブを投入して計測する CPU マルチスレッドの動作の有無を確認 複数プロセスの起動の有無を確認 → topコマンドで確認 メモリ 利用する最大の仮想メモリサイズを計測 → ジョブをdebug.qに投入後、qreportコマンドで確認 I/O 入出力量(Byte/sec)、ファイル操作回数を確認 → ラッパーを使用して確認 25 ジョブ単体の負荷を計測する2 CPUの計測 qlogin先で、ジョブをバックグラウンドで実行中に、 topコマンドで確認する top –u uid -H -u uid :指定したユーザIDのプロセスのみ表示する -H :個々のスレッドを別々に表示する $ ./job01.sh & $ top –u lect01 –H (job01.sh内で起動しているコマンドが複数確認できる場合、それはマルチスレッドもし くはマルチプロセスと判定する) 初めて実行するジョブは、特に慎重に確認する 26 ジョブ単体の負荷を計測する3 メモリの計測 小規模なジョブをdebug.qに投入する。 その際のジョブIDを記録する $ qsub –l debug job01.sh Your job 1905176 (“job01.sh") has been submitted ジョブ終了後、qreportコマンドで確認する(ジョブ終 了後、qreportで確認できるまで最大5分の時差がある) $ qreport -j 1905176|grep maxvmem maxvmem 2.1G 計測用のジョブは、可能な限り少ないデータで実施する 測定できた場合、データ量を増やしつつ複数回計測する データ量の変化と消費メモリ量の相関を確認し、実際の処 理対象データでの消費メモリ量予測の参考とする 27 ジョブ単体の負荷を計測する4 I/Oの計測 ラッパーで計測する lustre_analyzer.rb “command arg1 arg2 …” “command”で指定したコマンドが終了するまでにlustreに発生した各種 ファイル操作の回数・入出力量を計測する。計測内容は以下の表の通り。 同ホストで同じタイミングで他のプロセスがlustreにアクセスした場合、 その合算値が表示される 計測結果は標準エラー出力に出力する open 開いたファイルの数 close 閉じたファイルの数 getattr ファイル属性の取得数 setattr ファイル属性の設定数 write_bytes 書き込み量(Bytes) read_bytes 読み込み量(Bytes) 28 ジョブ単体の負荷を計測する5 実行例 $ lustre_analyzer.rb “ls -l /usr/local/seq/blast/ncbi/” > /dev/null -------------The number of Lustre file operations------------fs open close getattr setattr write_bytes read_bytes lustre1 1.0 1.0 2241.0 0.0 726.0 67169280.0 lustre2 0.0 0.0 1.0 0.0 0.0 0.0 -------------------------------------------------------------INFO: Execute time is 0.4 seconds. NOTICE: This infomation includes whole operation in this host -------------------------------------------------------------$ 29 ジョブ単体の負荷を計測する6 ラッパー実行時の注意 ラッパーの動作の概要は以下の通り 1.引数で与えられたコマンドを実行する前に/proc以下のlustre関連情 報を取得 2.引数で与えられたコマンドを実行 3./proc以下のlustre関連情報を再度取得し、1で取得した情報との差分 を出力 このような動きであるため、qlogin先のノードでは測定に他ユーザの影 響を受ける可能性が高い。また、時間がかかるジョブであるほど、他 ユーザの影響を受ける可能性が高い 以下のようにdebug.qに投入して測定するという方法もある $ qsub –cwd –l debug –S /usr/local/bin/ruby (その他必要なオプション) /usr/local/bin/lustre_analyzer.rb “./job01.sh” 30 目次 3.1 ジョブ単体の負荷を計測する 3.3 I/O負荷を軽減する 3.4 qsubオプションの検討 3.5 ジョブ実行時のお願い 31 ジョブ群の負荷を予測する1 I/O負荷は、単体ジョブテストで計測した 値に同時実行数を乗じる必要がある 1ジョブの負荷は僅かでも、100倍、 1,000倍では莫大な負荷になる lustre lustre 32 ジョブ群の負荷を予測する2 前述のlustre_analyzer.rb実行例を ベースに試算 種別 単体計測値 同時実行数 10 同時実行数 100 同時実行数 1000 open 1 10 100 1000 close 1 10 100 1000 getattr 2,241 22,410 224,100 2,241,000 setattr 0 0 0 0 write_bytes 726B 7KB 70KB 700KB read_bytes 64MB 640MB 6.4GB 64GB 33 I/O負荷の許容値 ファイルシステムごとのI/O負荷の許容値は以下の通り open 1秒あたりのopen総数 30,000で危険な状態 close 1秒あたりのclose総数 30,000で危険な状態 getattr 1秒あたりのgetattr総数 8,000で危険な状態 setattr 1秒あたりのsetattr総数 1,600で危険な状態 この値は 「ファイルシステム全体での負荷の許容値」 であることに注意。 「自分」+「他の人すべて」で上記の値に収まること 34 目次 3.1 ジョブ単体の負荷を計測する 3.2 ジョブ群の負荷を予測する 3.4 qsubオプションの検討 3.5 ジョブ実行時のお願い 35 I/O負荷を軽減する1 I/O量が多い場合、まず、アルゴリズム修正を検討する。 以下に、同じ操作を異なる方法で実装した処理の計測結果を示す。 ※実装例1(good) $ ./lustre_analyzer.rb "./sample_good.pl" -------------The number of Lustre file operations------------fs open close getattr setattr write_bytes read_bytes lustre1 0.0 0.0 8.0 0.0 363.0 24312832.0 lustre2 4.0 4.0 3.0 0.0 2450000.0 4178048.0 -------------------------------------------------------------INFO: Execute time is 0.1 seconds. NOTICE: This infomation includes whole operation in this host -------------------------------------------------------------- open 4 close 4 getattr 3 setattr 0 write_bytes 2.4MB read_bytes 4.0MB ※実装例2(bad) $ ./lustre_analyzer.rb "./sample_bad.pl" -------------The number of Lustre file operations------------fs open close getattr setattr write_bytes read_bytes lustre1 1.0 1.0 9.0 0.0 124726.0 8288446464.0 lustre2 250003.0 250003.0 250002.0 0.0 2450000.0 4178048.0 -------------------------------------------------------------INFO: Execute time is 44.3 seconds. NOTICE: This infomation includes whole operation in this host -------------------------------------------------------------- open 250,003 close 250,003 getattr 250,002 setattr 0 write_bytes 2.4MB read_bytes 4.0MB 36 I/O負荷を軽減する2 実装例1,2の違いは、openがループの内か外にあるか、のみ。 ファイルのopen, closeは比較的コストの高い処理であるため、 これだけ大きな差として現れる。 ※実装例1(good) sub do_good{ open(INPUT,“<$IN”); open(OUTPUT,“>>$OUT”); while($line=<INPUT>){ if($line =~ /foo/){ print OUTPUT $line; } } close(OUTPUT); close(INPUT); } #入力用ファイルハンドル作成 #出力用ファイルハンドル作成 #一行づつ処理を行う #fooを含んでいたら #データ書き込み #ファイルハンドルを閉じる #ファイルハンドルを閉じる ※実装例2(bad) sub do_bad{ open(INPUT,“<$IN”); while($line=<INPUT>){ if($line =~ /foo/){ open(OUTPUT,“>>$OUT”); print OUTPUT $line; close (OUTPUT); } } close(INPUT); } #入力用ファイルハンドル作成 #一行づつ処理を行う #fooを含んでいたら #出力用ファイルハンドル作成 #データ書き込み #ファイルハンドルを閉じる #ファイルハンドルを閉じる 「コストの高い処理」をループ内で実行していないか必ず チェックする ループ内で実行する必要のない「コストの高い処理」は、ルー プの外に出す 37 I/O負荷を軽減する3 SSDの活用を検討する “-l ssd”指定時に使用できる実行ホストには、 SSDがディレクトリ/ssdにマウントされている /tmp, /lustre1,2と比較して高速にアクセスで きる。容量は約350GB(実効容量) 計算ノード上のローカル領域であるため、ジョ ブを実行したホストからのみ参照可能 以下のケースで効果が期待できる 中間ファイルを大量に作成する場合 入力ファイルが多数の小さいファイルである場合 38 I/O負荷を軽減する4 SSD使用時の約束事 ディレクトリ/ssd/ユーザID/を作成して、その中にファイル等 を配置する(例:/ssd/lect01/foo) 使用量の制限はないが、他ユーザとの同時使用の可能性も考慮 し、使用は100GB程度までに抑える ジョブの終了処理に、作成したファイルを削除する処理を必ず 入れる あくまで一時的なファイルを配置するために使うため、永続性 は保障されない。メンテナンス等でサーバを再起動した場合、 ファイルは削除される(※検討中) 最終アクセス時間から一定時間(month系キュー:1か月 week系キュー:2週間)経過した場合、ファイルは削除対象と なる(※検討中) 39 同時実行数を制限する1 それでもI/O量が多い場合は、同時実行数を抑制する。 この方法が総I/O量を抑制する最も効果的な方法 ※アレイジョブの場合 qsub –tc 同時実行数 –t 1-X:Y ジョブ -tc 同時実行数:アレイジョブの同時実行数の上限を指定する -t:通常のアレイジョブの指定 以下の指定では500のタスクが動作するが、 同時に進行するタスクは最大で100となる。 $ qsub –tc 100 –t 1-1000:2 job01.sh 40 同時実行数を制限する2 ※非アレイジョブの場合 一度にqsubする回数を抑える ジョブに順序をつける qsub –N ジョブ名 –hold_jid 投入済みジョブのジョブ名 job02.sh -N ジョブ名: 今回投入するジョブのジョブ名を指定する -hold_jid 投入済みジョブのジョブIDまたはジョブ名: 指定したジョブIDまたはジョブ名のジョブが終了するまで、今回投入 するジョブをhold状態にする。指定したジョブが終了すると、自動的 にhold状態は解除され、実行可能な状態となる。 以下の場合、job1 → job2 → job3の順に実行される $ qsub –N job1 job01.sh $ qsub –N job2 –hold_jid job1 job02.sh $ qsub –N job3 –hold_jid job2 job03.sh 41 目次 3.1 ジョブ単体の負荷を計測する 3.2 ジョブ群の負荷を予測する 3.3 I/O負荷を軽減する 3.5 ジョブ実行時のお願い 42 CPU・メモリ関連のqsubオプション 検討 CPU利用量、メモリ利用量は単体ジョブでの計測結果を そのまま使用して実行計画を作成する ※CPU マルチスレッドで動作するか? Yes “-pe def_slot スレッド数”を付与する No 特に追加するオプションはない ※メモリ 最大仮想メモリサイズの大きさは? 4GB未満 s_vmem, mem_reqの指定を必要量に変更する 4GB 特に追加するオプションはない 4GB以上 s_vmem, mem_reqの指定を必要量に変更する 64GB以上 2TB未満 s_vmem, mem_reqの指定を必要量に変更する mediumノードを使用する 2TB以上 s_vmem, mem_reqの指定を必要量に変更する fatノードを使用する 43 def_slot利用時のリソース要求 def_slotで利用するスロット数を指定すると、その 分リソース要求量が増える def_slot s_vmem, mem_req 実際のリソース要求量 なし なし(デフォルトの4Gが適用される) 4GB -pe def_slot 2 なし(デフォルトの4Gが適用される) 8GB -pe def_slot 4 なし(デフォルトの4Gが適用される) 16GB なし -l s_vmem=8G, mem_req=8G 8GB -pe def_slot 4 -l s_vmem=8G, mem_req=8G 32GB 実際のリソース要求が、使用対象ノードのメモリ量を 超過しないよう注意する。超過した場合、ジョブはサブミット されても実行されない。 GPUはGPUノードあたり1個であるため、 def_slotと“-l gpu”は組み合わせて指定しない。 44 目次 3.1 ジョブ単体の負荷を計測する 3.2 ジョブ群の負荷を予測する 3.3 I/O負荷を軽減する 3.4 qsubオプションの検討 3.5 ジョブ実行時のお願い 45 ジョブ実行時のお願い いきなり大量のジョブを実行しないこと 負荷の計測およびdebug.qでの小規模のテストを 実施し、問題なく動作することを確認する。 確認できたら本番のキューに投入し、徐々に投入 数を増やしていく 46 目次 1. ジョブを大量に投入する前に 2. スパコンシステムの構成・特性 3. 投入するジョブの負荷特性を知る 47 目次 4.2 ジョブの実行結果を管理する 48 実行状況を確認する1 ジョブの実行状況はqstatコマンドで確認する 計算ノードの負荷状況はqhostコマンドで確認 する(“qstat -f”より詳細に確認可能) qhost –u ユーザID -u:指定したユーザのジョブを表示する $ qhost -u lect01 HOSTNAME ARCH NCPU NSOC NCOR NTHR LOAD MEMTOT MEMUSE SWAPTO SWAPUS ---------------------------------------------------------------------------------------------global fi00 lx-amd64 736 92 736 736 0.02 9590.6G 72.9G 8.0G 0.0 m1i lx-amd64 80 8 80 80 1.00 2019.8G 333.4G 20.0G 0.0 (略) t292i lx-amd64 16 2 16 16 0.45 62.9G 3.6G 8.0G 43.3M job-ID prior name user state submit/start at queue master ja-task-ID ---------------------------------------------------------------------------------------------2160251 0.50000 job01 lect01 r 05/02/2012 10:46:57 week_hdd.q MASTER t293i lx-amd64 16 2 16 16 0.48 62.9G 2.3G 8.0G 40.5M (略) ※LOAD(ロードアベレージ)とSWAPUS(スワップ使用量)に注目 49 実行状況を確認する2 LOADがNCPU(CPUコア数)を超過している 場合 → ジョブが意図せずにマルチスレッドで動作 している可能性 → MPIジョブでmachinefile指定をミスしてい る可能性 SWAPUSがGB単位になっている場合 → s_vmem, mem_req指定ミスの可能性 50 実行状況を確認する3 スパコンの負荷はDDBJのWebページ 「スパコン稼働状況」からも確認可能 http://www.ddbj.nig.ac.jp/system/superco m/supercom-util.html 51 目次 4.1 ジョブの実行状況を確認する 52 ジョブの実行結果を管理する1 大量のジョブを実行すると、正常に完了したか否か の確認に手間がかかる。 qreportコマンドで一括確認可能 qreport –o ユーザID –N ジョブ名 –b YYYYMMDDhhmm -l -o:指定したユーザIDのジョブのみ表示する -N:完全一致するジョブ名のジョブのみ表示する -l:一覧表示モードで表示する -b:指定した日時以降のジョブのみ表示する -e:指定した日時以前のジョブのみ表示する。指定方法は”-b”と同じ qreportコマンドを使用することで 実行中に問題が発生したジョブのリストを簡単に作成できる 再投入時の推奨オプションを得られる (※ジョブを再投入する機能はない) 53 ジョブの実行結果を管理する2 qreport出力結果の主な項目は以下の通り task MPIジョブ, アレイジョブのタスクID ext ジョブのexit statusコード。0以外は異常終了を示す fail UGEの終了コード。0以外は異常終了を示す clock 実行時間(ジョブ開始~終了までの所要時間) mmem 実際に使用した仮想メモリの最大値 Rq, Rm ジョブ再投入時に推奨されるキュー(ジョブ失敗時のみ表示) Rm ジョブ再投入時に推奨されるメモリ要求量(ジョブ失敗時のみ表示) Ropt ジョブ再投入時に推奨されるqsubオプション(ジョブ失敗時のみ表示) 54 問い合わせ先 不明点またはご意見等があれば下記にお問い合わせ 下さい。 遺伝研スパコンSEチーム Mail:[email protected] 居室:w202 内線:9461 http://www.ddbj.nig.ac.jp/system/supercom/s upercom-intro.html 55 変更履歴 変更日付 2012/05/10 変更内容 新規作成 56