並列計算機の製作

目次

クラスタマシン構築ポリシー

運用していた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の口を外側に向けるようぶらさげて配置 し必要に応じて接続します。ラックがやや細身になってしまい安定感がイマイチ です。地震で倒れて終了しないようにどこかにくくりつけておく必要がありそ うです。起動する時はむき出しになっているマザーボードのパワーボタンをド ライバ等でショートしてます。

cluster_a.png cluster_b.png

親機に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=hoge@faculty.chiba-u.jp"
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をhoge@hoge.comでhoge@huga.jpにメールを出す。

mail -r hoge@hoge.com -s "mail test" hoge@hufa.jp
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の温度変化)

temp_check.png

その他

研究室のホームページに戻る。http://chem.tf.chiba-u.jp/gacb10/diy.html

著者: 大窪 貴洋

Created: 2016-11-16 水 14:14

Validate