並列計算機の製作
クラスタマシン構築ポリシー
運用していた5ノードの並列計算機が混んできて、2014年秋頃に新しい計算機が 欲しくなりました。地方国立大の性なのか数百万払って外注でワークステーショ ンを買う予算もないので、並列計算機を新しく自作しました。以下は構築する 時に決めたポリシー。
- 予算は100万円以下。
- よく出回っているPCパーツで可能な限り低コスト・高パフォーマンスを目指 す。なのでサーバーラックとかXeonとかWindowsとか使わない。メモリのECC 機能も気にしない。サーバーラックはアングルで自作してCPUはCore i5を使 う。
- 1コアの消費電力は100W弱なので、標準的な15Aの電源容量を考えると最大15ノードくらい が妥当であろう。
- 親ノードはNISを2枚指して、千葉大ネット用(10.0.0.0/8)と子ノード用(192.168.1.0/24)とする。
- 子ノードはすべてdiskless化し, 親ノードからpxe bootしてnfsとnisで運用 する。
- Debian GNU/Linuxで構築する。(本当はBSDにしたい…)
- job管理はtorqueを使う
- 適当なプログラムはdebianのpackageを利用する。計算に必要なプログラムは マニュアルコンパイルして/usr/local以下に配置する。
購入費用
掛売り対応してくれるTSUKUMOからPCパーツを購入した。子ノードのパーツ構成 は以下のとおり。なお親ノードは2013年夏にかった3TbyteのHDDを積んだ10万く らいのCore i7のマシン。
パーツ | 品名 | 型番 | 単価 |
---|---|---|---|
マザーボード | ASUS INTEL H97 MicroATX | H97MPLUS | 8,400円 |
CPU | Intel Core i5-4690 BOX | BX80646I54690 | 21,080円 |
メモリー | CFD PC3-12800 8GB×2 | W3U1600HQ8G | 15,850円 |
電源 | 玄人指向 電源80PLUS GOLD | KRPWGP550W90+ | 6,150円 |
LANケーブル | エレコムLANケーブル 1m | LDGPY/BK1 | 240円 |
子ノードのCore i5は3.5GHzの4cpu、メモリは16Gbyteにしました。1ノードの合 計は51,720円。15ノードで775,800円です。15ノードあるので、60cpuで 240Gbyteメモリーの計算機資源になります。Xeonで構成した場合の1/5くらいの 価格でしょうか。ECC付きのメモリーじゃないので、数週間の長期計算は止めた 方が良さそうです。ラック用のアングルは1本1,300円くらい。
マザーボードを吊るす棚やフック等は、合計1,000円くらいで100円ショップで すませた。親ノードに追加したNIS(外側用)もアキバで500円くらいで買ったジャ ンク品です。アングルの下につけたタイヤやアングルの上に乗っかているモニ ターは研究室に転がっていたものを流用した。16ポートハブは以前に買ってい たもので、20,000円くらいだったと思います。6口のOAタップは1,300円くらい のものを4つ買いました。
外観図は以下のとおり。LANやVGA, USBの口を外側に向けるようぶらさげて配置 し必要に応じて接続します。ラックがやや細身になってしまい安定感がイマイチ です。地震で倒れて終了しないようにどこかにくくりつけておく必要がありそ うです。起動する時はむき出しになっているマザーボードのパワーボタンをド ライバ等でショートしてます。
親機にLinuxのインストール
Linuxはいくつかのディストリビューションがあります。計算コードをリモート
から実行するだけなので、なるべく無駄なプログラムが入っていない最小構成
にします。最小構成のLinuxをセットアップするためにはDebianが最適でしょう
(たぶん?)。メモリーが4Gbyte以上だと64bit版をインストールしないと認識し
ません。以下のURLからnetinstイメージをダウンロードしてbootable CDもしく
はUSBスティックを作成してbootします。
http://www.debian.or.jp/
bootしたら適当に進んで最小構成でdebianをインストールします。
macでUSBブートスティックを作る
macでisoイメージからboot用のusbスティックを作る方法。
diskutil unmountDisk /dev/disk1 dd bs=8192 if=usb.img of=/dev/disk1
networkの設定
外側はdhcpで取得して、ノード側はstaticに割り当てます。
vi /etc/network/interface ----- auto lo iface lo inet loopback # outside auto eth0 iface eth0 inet dhcp # inside auto eth1 iface eth1 inet static address 192.168.1.100 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255
hostファイルを以下のように設定します。192.168.1.xxxはノードの数だけならべます。
127.0.0.1 localhost.localdomain localhost 192.168.1.100 host000 host000.lab10.tf.chiba-u.jp 192.168.1.101 host001 host001.lab10.tf.chiba-u.jp 192.168.1.102 host002 host002.lab10.tf.chiba-u.jp
必要最低限のプログラムのインストール
Linuxの運用に必要な最低限のプログラムをインストールします。なお計算に 用いるコアのプログラムは自分でソースコードからIntelコンパイラを使って コンパイルします。プログラムのインストールはaptitudeコマンドで行います。
aptitude install program-name
計算を行う上で必要プログラムは以下のとおりです。
- ssh (セキュアシェル)
- less (ファイルviewer)
- screen (端末の切り離し)
- rsync (ネットワーク越しのファイルのコピー)
- make (コンパイルのため)
- tcsh (wien2kがcshスクリプトを使うため)
- bc (電卓です。wien2kが呼び出します)
- psmisc (killallが含まれています)
- g++ (Intelコンパイラのインストールに必要)
- default-jre (Intelコンパイラのインストールに必要)
- lib32stdc++6 (Intelコンパイラのインストールに必要)
- libssl-dev (torqueで必要)
- libxml2-dev (torqueで必要)
- lm-sensors (sensorsでcpu温度を監視できる)
vi, less
日本語ファイルの編集のため、/etc/vim/vimrc.tinyに以下の設定を加える。
set encoding=utf-8 set fileencodings=utf-8,iso-2022-jp,ucs2le,ucs-2,cp932,euc-jp,latin1
lessのエンコードをutf-8にする。
export LESSCHARSET=utf-8
Intelコンパイラのインストール
@<font color="red">現在、intelはnon-commercial版の無料配布は行っていな いようです。@</font>
依存プログラム
Intelのコンパイラをインストールするために、いくつかのプログラムが必要 になります。Intelコンパイラをインストールする前にaptitudeコマンドを使っ プログラムを上で示したプログラムをインストールしておきます。
Intelコンパイラ
Intelがnon-profit目的で利用するユーザのために無料で配布しているコンパ イラをインストールします。ダウンロードサイトのURLが時々変更するので、 googleで「noncommercial intel compiler」をキーワードで検索すると該当サ イトを簡単に見つけることができます。
インテルのサイトで配布しているものがいくつかありますが、必要なものは fortranとc++コンパイラ、それからMKLライブラリ(数値計算用の高速ライブラ リ)です。2013-04-27の時点で以下のバージョンが手に入ります。なおMKLライ ブラリはコンパイラに同封されているので、別途インストールする必要はあり ません。以下の2つをダウンロードします。
- Intel Fortran Composer XE 2013 for Linux
- Intel C++ Composer XE 2013 for Linux
該当するプログラムをクリックして進んでユーザー情報を入力します。入力が 完了すると登録したメールアドレスにメールが飛んできて、ダウンロードサイ トを教えてくれます。またメールアドレスにライセンスIDが記載されています。 このライセンスIDはコンパイラのインストール時に必要になります。
ダウンロードしたfortranとc++のtgzファイルを展開して、install.shを走ら せればコンパイラをインストールできます。全てデフォルトで大丈夫です。途 中でライセンス番号を聞いてくるので、Intelから送られてきたメールに書い ているライセンス番号を入力します。デフォルトで/opt/intel以下にファイル がインストールされます。
インストール後の設定
インストールの最後に指示がありますが、ライブラリのパス等を設定するため に、シェルの初期ファイル(~/.bashrc)に以下の行を加えます。
source /opt/intel/bin/compilervars.sh intel64
設定が完了したらicc -v やifort -vコマンドが実行できか確認してみます。
takahiro@silicon:~$ icc -v icc バージョン 13.1.1 (gcc バージョン 4.4.5 互換) takahiro@silicon:~$ ifort -v ifort バージョン 13.1.1
おまけ
openmpi
並列計算用のライブラリをインストールします。以下のURLから最新のソース
コードをダウンロードします。
http://www.open-mpi.org/
rootになってファイルを展開したらiccとifortでコンパイルするよう
configureします。rootでも以下のコマンドでiccとifortを使えるようにしな
いといけません。
source /opt/intel/bin/compilervars.sh intel64
ソースコードからライブラリをstaticでコンパイル、インストールは次の流れです。MAKE=makeは Makefileのミスのため追加しています。
# ./configure CC=icc CXX=icpc F77=ifort FC=ifort # make MAKE=make # make install
/usr/local/libにライブラリ、/usr/local/binに実行ファイルがインストー ルされます。各ユーザにシェルファイルにライブラリのパスと実行ファイル のパスを加えます。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib export PATH=/usr/local/bin:$PATH
これでmpic++やmpif90等が/usr/local/binにlibmpi*.aが/usr/local/libにイ ンストールされます。 デフォルトのホストを追加します。(torqueのみで制御する場合、このファイルは不要)
vi openmpi-default-hostfile --- host000 cpu=4 host001 cpu=4 host002 cpu=4 ---
fftw3
高速フーリエ変換用のライブラリのfftw3をインストールします。以下のURLか
らソースコードを入手します。
http://www.fftw.org/
mpiを有効にしてifrotとiccでコンパイルします。2Gbyte以上のメモリを使う
場合、"ifort -mcmodel=large -i-dynamic"でコンパイルします。(デフォルト
は2Gbyte)
./configure CC=icc CXX=icpc F77="ifort -mcmodel=large -shared-intel -i-dynamic" FC=ifort --enable-mpi --enable-threads make make install
これで/usr/local/lib以下にfftw3のライブラリ(libfftw3.a等)がインストールされます。
torque
ジョブスケジュラーです。個人のPCを占有して計算コードを走らせる場合は必
要ないでしょう。インストールはマニュアルに従います。
http://docs.adaptivecomputing.com/torque/help.htm#topics/1-installConfig/customizingTheInstall.htm
コンパイル
ソースコードをダウンロードして展開します。
http://www.adaptivecomputing.com/support/download-center/torque-download/
./configure --with-sendmail=/usr/sbin/sendmail make -j4 make install
クライアント用のtorque-package-mom-linux-x86_64.shと torque-package-clients-linux-x86_64.shの生成
make packages
インストール
自動起動(pbs\_server, pbs\_mom, pbs\_sched, trqauthd)するよう設定します。 なおクライアントはtorque-momおよびtorque-clientだけ
for f in trqauthd pbs_mom pbs_sched pbs_server; do cp contrib/init.d/debian.${f} /etc/init.d/${f} update-rc.d $f defaults done echo '/usr/local/lib' > /etc/ld.so.conf.d/torque.conf ldconfig echo "host000" > /var/spool/torque/server_name ./torque.setup root@host000 echo "host000 np=4" > /var/spool/torque/server_priv/nodes (nodeの数だけ追加) qterm /etc/init.d/pbs_server start /etc/init.d/pbs_mom start /etc/init.d/pbs_sched start pbsnode -a
サーバーの設定
torqueが送信するFromのドメインがchiba-u.jpじゃないとメールサーバに蹴ら れるので、Fromの設定をします。またqstatでユーザー全てのqueueを表示する よう設定します。
qmgr -c "set server mail_from=user@chiba-u.jp.test" qmgr -c "set server query_other_jobs = true"
キューの作成
無制限に資源を使えて制限時間も課さないキューを作ります。
qmgr -c "create queue workq" qmgr -c 'set queue workq resources_max.ncpus=4' qmgr -c 'set queue sdpa resources_max.nodes=16' qmgr -c "set queue workq queue_type = Execution" qmgr -c "set queue workq enabled = True" qmgr -c "set queue workq started = True" qmgr -c "set server default_queue = workq" qmgr -c 'set server node_pack=true' qmgr -c "p s"
キューの削除
作成したキュー(batch)を削除する。
qmgr -c "delete queue batch" qmgr -c "p s"
exim
torqueからのお知らせをメールで連絡するよう送信サーバの設定します。外 部のsmtpサーバを経由してメールを送信する(smart smtp)ようにします。
dpkg-reconfigure exim4-config /etc/init.d/exim4 restart
ssl認証経由で送信する場合
vi /etc/exim4/passwd.client /etc/init.d/exim4 reload
送信テスト
fromをsrc@hoge.jp.exampleでdist@hoge.jp.exampleにメールを出す。
mail -r src@hoge.jp.example -s "mail test" dist@hoge.jp.example test
wien2k
コンパイル
ソースコードをダウンロードします。
http://www.wien2k.at/reg_user/wien2k_download
user: xxxxx pass: xxxxx
ダウンロードしたtarファイルを展開して、gzを解きます。
# gunzip *gz
gzを解いたらexpand_lapwを実行します。
# ./expand_lapw
siteconfig\_lapwを実行します。 実行したら、current systemは以下のを選択します。
Linux (Intel ifort 12.0 compiler + mkl )
コンパイラはifort, iccを選択する。コンパイラフラグはデフォルトで大丈 夫。マルチコアの単独マシンで並列計算を行うのでShared Memory ArchitectureはYを選択。
- Do you know/need a command to bind your jobs to specific nodes ? N
- Set MPI\_REMOTE to 0 / 1: 0
- Do you have MPI and Scalapack installed and intend to run finegrained parallel? Y
- Your compier: mpif90
RP\_LIBから-lmkl\_solve\_lp64を削除し て、-L/opt/intel/mkl/lib/intel64を追加します。
-L/opt/intel/mkl/lib/intel64 -lmkl_scalapack_lp64 -lmkl_blacs_lp64 -L/opt/local/fftw3/lib/ -lfftw3_mpi -lfftw3 $(R_LIBS)
さいごに/etc/bash.bashrcで環境変数等をセットする。
# WIEN2k setting # -------------------------------------------------------- alias lsi="ls -aslp *.in*" alias lso="ls -aslp *.ou*" alias lsd="ls -aslp *.def" alias lsc="ls -aslp *.cl*" alias lss="ls -aslp *.sc*" alias lse="ls -aslp *.error" alias pslapw="ps -ef |grep "lapw"" export OMP_NUM_THREADS=1 #export LD_LIBRARY_PATH=..... export EDITOR="vi" export SCRATCH=./ export WIENROOT=/usr/local/src/wien2k export W2WEB_CASE_BASEDIR=$HOME/w2web export STRUCTEDIT_PATH=$WIENROOT/SRC_structeditor/bin export PDFREADER=xpdf export PATH=$PATH:$WIENROOT:$STRUCTEDIT_PATH:. export OCTAVE_EXEC_PATH=${PATH}:: export OCTAVE_PATH=${STRUCTEDIT_PATH}:: export PATH=$PATH:$WIENROOT:. ulimit -s unlimited alias octave="octave -p $OCTAVE_PATH" # added by Miniconda2 4.2.12 export PATH="/usr/local/miniconda2/bin:$PATH"
ジョブ投入
k点で並列計算を行うためのジョブの導入は、.machinesを自動生成するスクリプトを使います。
files/wien2k.sh
lammps
インストール
最新のコードを手に入れて展開します。
http://lammps.sandia.gov/download.html#tar
openmpiでfftw3をリンクします。mklのfftwをリンクするより早かった。makeファイルは、これを使いました。
files/Makefile.silicon
ジョブ投入
ジョブの導入は、コア数をmpirunに自動で渡すスクリプトを使います。2ノー ド8並列の場合です。必ずmpiruに「-machinefile $PBS\_NODEFILE」を指定し てください。そうしないと、全部host001でjobが走ります。lammps.sh
cpmd
ソースコードをhttp://www.cpmd.org/ からダウンロードします。non-profitな団体にはアカウント登録すると無料で配布してくれます。アカウント情報は以下のとおり。
user: xxxxx pass: xxxxx
ソースコードを展開したら、mkconfigを走らせてMakefileを作ります。
CPPFLAG="-DINTEL_MKL -DFFT_FFTW -DPARALLEL" CPP=icpc FC=ifort ./mkconfig.sh TSUBAME-INTEL-MPI > Makefile
Makefileの中のmklのライブラリの場所がem64tですが、ifort13からintel64に変更になっているので修正します。
vi Makefile
これでmakeします。
make -j4
xcrysden
いくつかxcrysdenを動かすためにインストールする必要があるパッケージがあります。。
aptitude install libxmu6 libxss1
libquadmathがなくてエラー…。debian7からlibquadmath.soとlibgfortran.soをコピー。files/xcrysden_lib.tgz
tar cvzf xcrysden_lib.tgz -C /
http://www.xcrysden.org/Download.html からxcrysden-1.5.53-linux\_x86\_64-semishared.tar.gzをダウンロードして展開。展開した中のxcrysdenで実行できます。
quantum espresso
./configure \ make
install/config.logを見てmklがlinkされているか確認。mklのSCALAPACKは intelのmpiじゃないと使えないようです。
gulp
disklessクラスタ(親ノードの設定)
/nfsrootに子ノード用のシステムを構築する。また/tftboot以下にカーネル imgを置いてpxeブートさせます。子ノードは親ノードからdhcpでアドレスを受 け取ってbootします。
tftpd-hpa
tftpd-hpaのインストール
aptitude install tftpd-hpa
/etc/default/tftpd-hpaを編集して/tftpbootにブートイメージを置ように設定する。
TFTP_USERNAME="tftp" TFTP_DIRECTORY="/tftpboot" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure"
/tftpbootに後述する以下のファイルを配置
/tftpboot/initrd.img /tftpboot/pxelinux.0 /tftpboot/vmlinuz
/tftpboot/pxelinux.cfg/defaultを以下のように編集する。
LABEL linux DEFAULT vmlinuz root=/dev/nfs initrd=initrd.img nfsroot=192.168.1.100:/nfsroot ip=dhcp rw
最後にpermissionの設定
chmod -R 777 /tftpboot
syslinux
pxeブートローダ用のファイルを/tftpbootに配置する。
aptitude install syslinux mkdir /tftpboot cp /usr/lib/syslinux/pxelinux.0 /tftpboot
子ノード用のシステムをコピー
子ノード用のシステムを/nfsrootに配置します。最小構成でlinuxを親ノー ドにインストールした後、必要なファイルをコピーします。別解として子ク ラスタ上でlinuxをusbメモリーに最小インストールして、usbメモリーから システムをコピーしても良いと思います。
cd / tar cvzf - bin boot dev etc initrd.img lib lib32 lib64 proc root run sbin selinux srv tmp usr var vmlinuz | (cd /nfsroot; tar xvf -)
pxeブートのためのファイルを生成
tftpbootのimgファイルの置き場を指定して、initrd.imgとvmlinuzをコピーする
vi /etc/initramfs-tools/initramfs.conf ---------------------- MODULES=netboot BOOT=most ---------------------- mkinitramfs -o /tftpboot/initrd.img cp /boot/vmlinuz-3.2.0-4-amd64 /tftpboot/vmlinuz
子ノードのシステムを調整する
/nfsroot/etcのファイルを修正します
vi /nfsroot/etc/network/interfaces ---------------------- auto lo iface lo inet loopback iface eth0 inet manual ---------------------- vi /nfsroot/etc/fstab ---------------------- proc /proc proc defaults 0 0 /dev/nfs / nfs defaults 0 1 none /tmp tmpfs defaults 0 0 none /var/run tmpfs defaults 0 0 none /var/lock tmpfs defaults 0 0 none /var/tmp tmpfs defaults 0 0 ----------------------
dhcp
dhcpサーバーに子ノードのmacアドレスを登録してipアドレスを割り当てます。 lease時間は無限に設定。MACアドレスでIPを割り当てるよう子ノードの数だ け(host nodeX)を登録します。
vi /etc/dhcp/dhcpd.conf ----- ddns-update-style none; option domain-name "lab10.tf.chiba-u.jp"; option domain-name-servers 10.245.1.95, 10.97.1.95, 10.129.1.95; default-lease-time 600; max-lease-time 7200; log-facility local7; option space PXE; option PXE.mtftp-ip code 1 = ip-address; option PXE.mtftp-cport code 2 = unsigned integer 16; option PXE.mtftp-sport code 3 = unsigned integer 16; option PXE.mtftp-tmout code 4 = unsigned integer 8; option PXE.mtftp-delay code 5 = unsigned integer 8; option PXE.discovery-control code 6 = unsigned integer 8; option PXE.discovery-mcast-addr code 7 = ip-address; subnet 192.168.1.0 netmask 255.255.255.0 { class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; option vendor-class-identifier "PXEClient"; vendor-option-space PXE; option PXE.mtftp-ip 0.0.0.0; allow bootp; allow booting; # This is the name of the file the boot ROMs should download. filename "pxelinux.0"; # This is the name of the server they should get it from. next-server 192.168.1.100; } pool { max-lease-time -1; default-lease-time -1; range 192.168.1.2 192.168.1.254; deny unknown clients; } host node1 { hardware ethernet 78:24:AF:3D:D4:95; fixed-address 192.168.1.101; } } -----
NFS
/opt/nfsrootと/homeと/usr/localをNFSで公開します。 fsidは使わない。
aptitude install nfs-server vi /etc/exports --- /opt/nfsroot 192.168.1.0/24(rw,async,no_root_squash,no_subtree_check) /home 192.168.1.0/24(rw,async,no_root_squash,no_subtree_check) /usr/local 192.168.1.0/24(rw,async,no_root_squash,no_subtree_check) ---
NIS
hosts, passwd, group, shadowを共有するようにする
aptitude install nis vi /etc/default/nis --- NISSERVER=master --- vi /var/yp/Makefile (shadowを追加) --- ALL = passwd shadow group hosts rpc services netid protocols netgrp --- /usr/lib/yp/ypinit -m cd /var/yp make
disklessクラスタ(子ノードの設定)
子ノードがpxeブートするようになったら、子ノードにログインしてシステム を調整します。実際は、親ノードの/nfsrootの下のファイルが書き換えられま す。
不要デーモンを止める
nfsのためにはnfs-commonとrpcbindも残して無駄なサービスは全部止めます。
insserv -r exim4 insserv -r rsyslog insserv -r cron insserv -r atd insserv -r acpid insserv -r dbus insserv -r udev
getty使わない
gattyをコメントアウト
vi /etc/inittab --------------- gettyを全てコメントアウト ---------------
カーネルモード以外で最終的に残っているプロセスは以下のとおり。
# ps ax|grep -v "\[" | grep -v grep |grep -v ps PID TTY STAT TIME COMMAND 1439 ? Ss 0:00 /sbin/rpcbind -w 1470 ? Ss 0:00 /sbin/rpc.statd 1482 ? Ss 0:00 /usr/sbin/rpc.idmapd 1825 ? Ss 0:00 /usr/sbin/sshd 1872 ? Sl 0:00 /usr/sbin/ypbind -no-dbus 1880 ? SLsl 0:02 /usr/local/sbin/pbs_mom 2468 ? S 0:00 sshd: takahiro@pts/0 2469 pts/0 Ss 0:00 -bash
nisクライアント
aptitude install nis vi /etc/yp.conf 最終ラインに追加 domain lab10.tf.chiba-u.jp server host000.lab10.tf.chiba-u.jp ---
ライブラリのパス
non interactiveログインでintelのライブラリにパスが通ってなくてはならない。
vi /etc/ld.so.conf.d/intel.conf --- /opt/intel/composer_xe_2013_sp1.0.080/ipp/lib/intel64 /opt/intel/composer_xe_2013_sp1.0.080/tbb/lib/intel64 /opt/intel/composer_xe_2013_sp1.0.080/compiler/lib/intel64 /opt/intel/composer_xe_2013_sp1.0.080/mpirt/lib/intel64 /opt/intel/composer_xe_2013_sp1.0.080/bin/sourcechecker/lib/intel64 /opt/intel/composer_xe_2013_sp1.0.080/mkl/lib/intel64 /opt/intel/composer_xe_2013_sp1.0.080/mkl/benchmarks/mp_linpack/lib_hybrid/intel64 --- ldconfig
NIS
nisにインストール
aptitude -y install nis
/etc/yp.confに以下のラインを追加
domain lab10.tf.chiba-u.jp server 192.168.1.100
/etc/nsswitch.confにnisを追加
passwd: nis compat # 7行目:追記 group: nis compat # 追記 shadow: nis compat # 追記
確認は以下のコマンドで
ypwhich ypcat passwd ypcat hosts
NFS
nfs-commonのインストール。これがないとファイルタイプ不明エラーでnfsマウ ントできずにはまる。
aptitude -y install nfs-common
nfsのチューニングのためrsize,wrizeをテストした。
time dd if=/dev/zero of=./hoge bs=16k count=16384
結果は以下のとおり。rsize=8192,wsize=8192とする。
rsize=1024,wsize=1024 | 7.597s |
rsize=4096,wsize=4096 | 4.497s |
rsize=8192,wsize=8192 | 3.214s |
rsize=9216,wsize=9216 | 4.561s |
pbs\_momの登録
次のような作業をするよう起動スクリプト(diskless)を作成する。
- IPアドレスから子ノードのhostnameを設定する。
- 親ノードの/usr/localを/usr/localにマウント
- 親ノードの/homeを/homeにマウント
- pbs\_mom用のtmpfsを/var/spool/torqueにマウント
- pbs\_momの設定ファイル(/root/torque.tgz)を/var/spool/torqueに展開
disklessを子ノードのetc/init.dに配置する。
#! /bin/sh ### BEGIN INIT INFO # Provides: diskless # Required-Start: $network # Required-Stop: # Default-Start: 2 # Default-Stop: 0 1 # Short-Description: Example initscript # Description: This file should be used to construct scripts to be # placed in /etc/init.d. ### END INIT INFO # Author: Takahiro Ohkubo # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="Description of the service for diskless server" NAME=hostname_and_mount case "$1" in start) export LC_ALL=C IP=`ifconfig eth0 | grep "inet addr" \ | sed 's/\s\{1,\}/ /g' | cut -d' ' -f3 \ | cut -d':' -f2 | cut -d'.' -f4 \ | sed 's/^1/0/'` if [ `hostname` = host${IP} ]; then echo "script has been run" exit 1 fi hostname host${IP} mount -t nfs -o rsize=8192,wsize=8192 192.168.1.100:/usr/local /usr/local mount -t nfs -o rsize=8192,wsize=8192 192.168.1.100:/home /home mount -t tmpfs tmpfs /var/spool/torque tar xzf /root/torque.tgz -C /var/spool ;; stop) umount /usr/local umount /home umount /var/spool/torque ;; *) echo "usage: diskless.sh start|stop" ;; esac
disklessをシステムに登録する
insserve diskless
pbs\_momの起動スクリプトをcontribからinit.dにコピーする。disklessを起 動してからpbs\_momを起動するよう編集する。
cp /usr/local/src/torque-4.2.9/contrib/init.d/debian.pbs_mom /etc/init.d/pbs_mom vi /etc/init.d/pbs_mom ---- # Should-Start: pbs_server pbs_sched diskless ----
システムに登録する
insserve pbs_mom
pbs\_momの設定ポリシー
- /homeはnfsなのでコピー
- tmpfsなのでログは残さない。
- jobのoutputをすぐに出力するためspoolしない。
cd /root vi torque/mom_priv/config ----- $logevent 0x0 $loglevel 0 $spool_as_final_name true $usecp *:/home /home ----- tar cvzf torque.tgz torque
TIPS
親ノードを一時的にGWにして子ノードをインターネットにつなげる
親ノード
eth0は外側、eth1が内側
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
後片付け
echo 0 > /proc/sys/net/ipv4/ip_forward
子ノード
routingテーブルの設定
route add default gw 192.168.1.100 eth0
後片付け
route del default gw 192.168.1.100
CPU温度管理
温度チェックプログラムを子ノードにインストールする
aptitude install lm-sensors
sensorsでハードに検出に失敗した時
- 以下のシェルスクリプト(mkdev.sh)作成
#!/bin/bash # Here you can set several defaults. # The number of devices to create (max: 256) NUMBER=32 # The owner and group of the devices OUSER=root OGROUP=root # The mode of the devices MODE=600 # This script doesn't need to be run if devfs is used if [ -r /proc/mounts ] ; then if grep -q "/dev devfs" /proc/mounts ; then echo "You do not need to run this script as your system uses devfs." exit; fi fi i=0; while [ $i -lt $NUMBER ] ; do echo /dev/i2c-$i mknod -m $MODE /dev/i2c-$i c 89 $i || exit chown "$OUSER:$OGROUP" /dev/i2c-$i || exit i=$[$i + 1] done
mkdev.shを実行
- sensor-detect で質問に適当に答えて最後にmoduleに書き込み
- reboot
screenの使い方
端末を切ってプログラムを終了させたくない場合は、silicon上でscreenを使うと良いです。以下の設定ファイル(.screerc)を$HOMEにおいてください。
startup_message off escape ^Tt idle 3600 #hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w" hardstatus alwayslastline "%`%-w%{=b bw}%n %t%{-}%+w" bind -c REGION 2 split bind -c REGION 1 only bind -c REGION 0 remove bind -c REGION o focus bind x command -c REGION
screenを立ち上げるoptionは以下のとおり。
screen | 新しいscreenを作成する |
screen -ls | 動いているscreenの番号一覧を確認する |
screen -r 番号 | 番号のscreenを立ち上げる。screenが1つなら-rだけでOK |
screen -x 番号 | 番号のscreenを無理やり立ち上げる |
screenに入ってから基本的な使い方は以下のとおりです。全部Ctrl-tではじまります。
Ctrl-t c | 新しい端末を作る |
Ctrl-数字 | 数字の端末に移動 |
Ctrl-t n | 次の端末に移動 |
Ctrl-t p | 前の端末に移動 |
Ctrl-t A | 端末の名前を変える |
Ctrl-t d | screenから抜ける |
ベンチマーク
lammps
64,000個のNaClを作って1000ステップMD計算をノード数1から15の計算資源で 計算を行った。 lammpsのインプットファイルはこれ(NaCl.in)。インプットシェ ルスクリプトの生成プログラムはこれ(make\_sh.py)。
np04.log:Loop time of 13289.7 on 4 procs for 1000 steps with 64000 atoms np08.log:Loop time of 4821.07 on 8 procs for 1000 steps with 64000 atoms np12.log:Loop time of 3211.15 on 12 procs for 1000 steps with 64000 atoms np16.log:Loop time of 2383.08 on 16 procs for 1000 steps with 64000 atoms np20.log:Loop time of 1978.13 on 20 procs for 1000 steps with 64000 atoms np24.log:Loop time of 1611.62 on 24 procs for 1000 steps with 64000 atoms np28.log:Loop time of 1378.98 on 28 procs for 1000 steps with 64000 atoms np32.log:Loop time of 1196.65 on 32 procs for 1000 steps with 64000 atoms np36.log:Loop time of 1108.82 on 36 procs for 1000 steps with 64000 atoms np40.log:Loop time of 986.446 on 40 procs for 1000 steps with 64000 atoms np44.log:Loop time of 961.153 on 44 procs for 1000 steps with 64000 atoms np48.log:Loop time of 825.496 on 48 procs for 1000 steps with 64000 atoms np52.log:Loop time of 829.836 on 52 procs for 1000 steps with 64000 atoms np56.log:Loop time of 724.524 on 56 procs for 1000 steps with 64000 atoms np60.log:Loop time of 668.302 on 60 procs for 1000 steps with 64000 atoms
同じ計算を150万円くらいのXeon X5659 (3.5GHz, 12core)を2cpu搭載したマシ ンで24並列の計算させると以下のような結果です。余計なプロセスが動いてい るためでしょうか、遅い…。
Loop time of 6784.4 on 24 procs for 1000 steps with 64000 atoms
温度チェック
60cpuの並列計算をlammpsで実行しながら以下のコマンドで5秒毎に温度をチェッ クしてtemp.datに記録した。
while [ 1 ]; do for i in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15; do echo -n "host0$i : " ssh host0$i sensors | grep "Core 0" done sleep 5; date done done |tee temp.dat
保存したtemp.datをpythonプログラム でプロット。フルパワーで計算している場合、70℃くらいで推移している(図: 各ノードのCPUの温度変化)
その他
研究室のホームページに戻る。http://chem.tf.chiba-u.jp/gacb10/diy.html