メインコンテンツに移動

Cent8

ここにまとめようとしてる

諸般の事情により, CentOS8Streamをインストールする. うわさではCentOS7をCentOS8にしただけで10%程度高速になるという話であるし。

  • 何が起こったのか400%高速になった例も存在する。

ここでは,Amazonでポチったマザーボード・CPU・メモリー・SSDを 電源にプチプチっとつないだマシンに,CentOS8Streamをインストールし、数台〜百台くらいの計算機クラスターを構築する方法を述べる。具体的には

  • IPAをインストール -- IPAとはユーザー・ディスク・コンピュータ管理システムです
    • IPAが不要な人 = PCが100台あったとして,1台づつパスワード設定とかしたい人
    • IPAが必要な人 = 上記の作業が嫌な人
  • RMSをインストール -- RMSとは計算機リソース管理システムです
    • RMSが不要な人 = PCが100台あったとして,「どれつかってる?」と同僚に聞いて回るのが好きな人
    • RMSが必要な人 = 上記の作業がアホらしく,「空いてるので勝手にやってほしい」と思う人
  • ライブラリーをインストール
    • ライブラリーが不要な人 = 補間とか積分とか授業で習ったから,初等的なのを自分で作りたい人
    • ライブラリーが必要な人 = 補間とか積分とか授業で習ったけれども,プロの高速品を使いたい人

IPAサーバーをインストール

まだサーバーがないとかいう向きは、サーバーを作らねばならぬ。パッケージで対応るつもりはあるんですけどね。あまりにも手数が多すぎ。ここをみて頑張るしかねえです。

ここまでできたら、稼働するIPAサーバー(偽りのDNSサーバーたち)と、そのWebサイトにアクセスできる、管理ユーザー admin  とそのパスワードがわかるわけよ。

流体力学分野のIPAサーバーは、10.249.229.111であるよ.


IPAクライアントを登録

サーバーが1台でもあれば、クライアントをいくらでも追加できます。クライアントは、なにぶん大量であるので、自動化してある。パッケージはこればい!こいつは、IPAサーバー&クライアント(ディスク共有機能付き)システムを作成する。

OSをインストールの前に、まんず、お前さが追加しようという、そのクライアントをIPAサーバーに登録だよ。

IPAサーバーにアクセス、【Network Services】【DNS】【DNS Zones】で、Zone情報を編集。

Zone

クライアントで追加するのは、次の3点だよ

  • Aレコード。クライアント名とIPアドレスのペアを【Add】で作る
    •  ここで作るDNSサーバーは単なるフォワードサーバーであるにより、10.249.229.174 のマシンは h174 と登録しなければならん。
  • CNAMEレコード。h174ではわけがわからないので、別名をつけることができる。
    • 上の例では、h174に, 2011 年製ボールクラス初号機 ib2011-1 と別名を作成している。
    • うちでは、年賀状クラス計算機を「ボール」、ゲーマークラス計算機を「ジム」、HPCクラス計算機を「ガンダム」と呼称している(元々は金銀銅だったかも)
    • ボールにもビームライフルは装備されているが,連射すると発熱により搭乗者が死亡する場合があるので注意(2011年同期入隊12名のうち, 2020年まだ息があるのは8名だ)
  • PTRレコード

MPIで計算する場合に, 代表計算ノードの作業フォルダ /local/disk0 が他のノードから見えた方が便利である. 共有ディスク設定済みなら, /net/ノード名 でそれらが見えるようにできる. 具体的には 【Network Services】【Automount】【default】【auto.home】で計算ノードを追加しておく:

auto

Keyに ノード名, mountにマウントオプション  -fstyle=nfs4,rw,hard,intr ノード名:/disk0 を追加する.


IPAクライアントをインストール

CentOS8Streamのインストール自身には,DNSサーバーとしてIPAサーバーを指定する点以外,何もいうことはない。もしお前がふざけた設定でインストールして日本語変換ができなかったら dnf install ibus-kkc して日本語(さかな漢字)せよ。にゃお,計算ノードの作業ディスクはデフォルトで /local/disk0/tmp になっているので,高速な作業ディスク(RAID0とかNVMeとか)が/local/disk0に来るように設定した方が良い.インストールできたら

# dnf update -y      ←とりあえずインストール後に行って気を落ち着けるのだ
# reboot                 ←さあ、はじめよう

で、rootでログインし、パッケージをダウンロードしてインストール:

# mkdir -p /local/packages
# cd /local/packages
# git clone https://bitbucket.org/rgdkyotou/thirdparty.git
# cd thirdparty

さて、Makefileのてっぺんを、あなたの環境に合わせて数行編集する必要がある。

ETHER=bond0     ←あなたのイーサネットデバイス名
RMS_SERVER=10.249.229.225    ←あなたのSLURMサーバー(既存、あるいはのちに作成)
DNS_TRUE=( 10.224.253.1 10.22.254.1 ) ←真実のDNSサーバー(公式サーバー軍)
DNS_FAKE=( 10.249.229.225 10.249.229.226 ) ←偽りのDNSサーバー(IPAサーバー軍)

では設定開始:

# make ipa-client
IPADDR[10.249.229.174] HOSTNAME[h174.229.249.10.1016485.vlan.kuins.net]
ipa-client完了しました!
...
Discovery was successful!
Do you want to configure chrony with NTP server or pool address? [no]: yes
Enter NTP source server addresses separated by comma, or press Enter to skip: ntp.kuins.net  ←あんたの適切なNTPサーバーを入力
Enter a NTP source pool address, or press Enter to skip: (RETURN)
Client hostname: h174.229.249.10.1016485.vlan.kuins.net
NTP server: ntp.kuins.net
Continue to configure the system with these values? [no]: yes
Synchronizing time
...
Time synchronization was successful.
User authorized to enroll computers: admin ← IPAサーバーの管理人とパスワード
Password for admin@229.249.10.1016485.VLAN.KUINS.NET: いつものいつもの
Successfully retrieved CA cert
...
モジュラーの依存に関する問題:
 問題 1: conflicting requests
  - nothing provides module(perl:5.26) needed by module perl-DBD-SQLite:1.58:8010020191114033549:073fa5fe-0.x86_64
 問題 2: conflicting requests
  - nothing provides module(perl:5.26) needed by module perl-DBI:1.641:8010020191113222731:16b3ab4d-0.x86_64
お前は本名[h174]に通名をつけよう(嫌なら本名):ib2011-1
ib2011-1.229.249.10.1016485.vlan.kuins.net を h174.229.249.10.1016485.vlan.kuins.net の別名とする
/etc/hosts, /etc/bashrc, /etc/profile に追記しました:
10.249.229.174	h174.229.249.10.1016485.vlan.kuins.net ib2011-1.229.249.10.1016485.vlan.kuins.net
ipa-clientOK 4.8.0-13.module_el8.1.0+265+e1e65be4

残りの作業を行ってから再起動する:

# make kvm selinux
# reboot

なお,上の作業で次が行われる:

  • 仮想マシンを使う場合だけ役に立つKVMデーモンを切る(重要GCCビルドの実行ファイルが極高速に! ←2GBメモリとかの,ゴミマシンの場合)←KVM利用する場合はダメよ
  • 仮想マシンを使う場合だけ役に立つvirbr0を削除(トラブルの元なので)←KVM利用する場合はダメよ
  • firewall切断(意味がないので)←firewallの中のみ.壁外うろついていると巨人に喰われるよ

SLURMサーバーを作成

まだ作成していなければ、ネットワークに1台、リソース・マネジメント・システム(ジョブ管理システム)サーバー(RMS_SERVER)が必要である。ので、ここで作成する。あなたのネットワークにすでにSLURMサーバーが稼働しているのならば、SLURMクライアントの作成に進む。

まだ貴方がジョブ管理サーバーを作成していない場合,次のように作成する:

server# cd /local/packages/thirdparty
server# make munge.key.create
server# make slurm-server

お前の計算機クラスターの詳細は /usr/local/etc/slurm.conf で定義される. まんず,その情報をかけ. 上の方は関係ない.下の方で, サーバーの正式名称, 通称, スペック類, Featureを定義する. スペック類がわからない場合, slurmd -C で,そのマシンの妥当なスペック案を表示してくれる:

server# slurmd -C
NodeName=h225 CPUs=2 Boards=1 SocketsPerBoard=1 CoresPerSocket=2 ThreadsPerCore=1 RealMemory=3935

で, /usr/local/etc/slurm.confの下の方で定義する:

NodeName=ib2007-3 NodeHostname=h225 CPUs=2 RealMemory=3935 TmpDisk=200000 Sockets=1 CoresPerSocket=2 ThreadsPerCore=1 Feature=CL0 Gres=none NodeAddr=127.0.0.1

サーバーを定義したら, 一番下で定義してある,ジョブクラス(PartitionName)にも入れておく.下の例では, サーバーib2007-3の他に, 計算ノードib2007-1, ib2007-2, ib2007-4, ib2011-1を定義してある:

PartitionName=S Nodes=ib2007-3 State=Up MaxTime=0-03:05 DefaultTime=0-03:05 OverSubscribe=FORCE:2 PriorityTier=100 PreemptMode=OFF
PartitionName=F Nodes=ib2007-[1,2,4],ib2011-1 State=Up MaxTime=1-00:05 DefaultTime=0-03:05 OverSubscribe=FORCE:2 PriorityTier=100 PreemptMode=OFF
PartitionName=B Nodes=ib2007-[1,2,4],ib2011-1 State=Up MaxTime=7-00:05 DefaultTime=0-03:05 OverSubscribe=FORCE:2 PriorityTier=20 PreemptMode=GANG
PartitionName=E Nodes=ib2007-[1,2,4],ib2011-1 State=Up MaxTime=30-00:05 DefaultTime=0-03:05 OverSubscribe=FORCE:2 PriorityTier=10 PreemptMode=GANG
PartitionName=L Nodes=ib2007-[1,2,4],ib2011-1 State=Up MaxTime=99-00:05 DefaultTime=0-03:05 OverSubscribe=FORCE:2 PriorityTier=1 PreemptMode=REQUEUE GraceTime=300

書き終わったら,サーバーを起動してみる:

server# smgr s
This is SERVER
サーバーデーモンさん再起動
SUCCESS
 slurmdbd.service - Slurm DBD accounting daemon
   Loaded: loaded (/etc/systemd/system/slurmdbd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-02-13 13:01:23 JST; 692ms ago
...
 slurmctld.service - Slurm controller daemon
   Loaded: loaded (/etc/systemd/system/slurmctld.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-02-13 13:01:24 JST; 20ms ago
  Process: 12165 ExecStart=/usr/local/sbin/slurmctld $SLURMCTLD_OPTIONS (code=exited, status=0/SUCCESS)
....

無事に起動できたら, ジョブクラスの一覧とか, ノードの一覧とかやってみる:

server# smgr j
This is SERVER
PARTITION AVAIL  TIMELIMIT   NODES(A/I/O/T)  NODELIST
S            up    3:05:00          0/1/0/1  ib2007-3
F            up 1-00:05:00          0/4/0/4  ib2007-[1-2,4],ib2011-1
B            up 7-00:05:00          0/4/0/4  ib2007-[1-2,4],ib2011-1
E            up 30-00:05:0          0/4/0/4  ib2007-[1-2,4],ib2011-1
L            up 99-00:05:0          0/4/0/4  ib2007-[1-2,4],ib2011-1

デフォルトでは,次のジョブクラスが定義される:

  • サーバークラス: ジョブ管理サーバーで実行するクラス
  • ファーストクラス: 王族が利用するクラス
  • ビジネスクラス:  貴族が利用するクラス.王族ジョブが来たら一時停止・再開
  • エコノミークラス: ふつうの人が利用するクラス.高貴なジョブが来たら一時停止・再開
  • ランディングギアクラス: 客が来たら強制終了されるクラス

計算ノードの一覧

server# smgr n
This is SERVER
NODE       PARTITION  C:S:T MEM,MB  DISK,GB FEATURE              STAT  REASON
ib2007-1   B,E,F,L    1:2:1   3935      150 CL0                  idle  none
ib2007-2   B,E,F,L    1:2:1   3935      200 CL0                  idle  none
ib2007-3   S          1:2:1   3935      200 CL0                  idle  none
ib2007-4   B,E,F,L    1:2:1   3935      200 CL0                  idle  none
ib2011-1   B,E,F,L    1:4:2  15728     1400 CL1,CL2              idle  none

次に,クライアント増設の手順を説明する.


SLURMクライアントを作成

SLURMサーバーが設定済みであるならば

client# cd /local/packages/thirdparty
client# make munge.key.copy
あんたのRMSサーバー[10.249.229.225]のキーをコピーします
Password:RMSサーバーのrootパスワードを入力
client# make slurm-client
openssl完了しました!
munge完了しました!
MariaDBの管理パスワードを設定します. 以下のように答えるとよいぞ:
Enter current passwd: (return)
Set root password: Y
New password, Re-enter new password お好きなパスワード入力
...
Remove Anonymous Users: Y
Disallow root login remotey : Y n
Remove test database : Y
Reload priviledge talbes now: Y
パスワードは覚えときんしゃい. (HIT ENTER KEY)
Enter current password for root (enter for none):
...
Set root password? [Y/n] Y
New password:パウワード
Re-enter new password:パウワード
...
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] n
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
...
Thanks for using MariaDB!
さっきのよ:
Enter password:パウワード
mariaslurm      h200.229.249.10.1016485.vlan.kuins.netB9*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19
httpd完了しました!
mailx完了しました!
readline完了しました!
pam完了しました!
libcurl完了しました!
python-devel完了しました!
boostSubmodule path 'tools/quickbook': checked out '944f760cc2decfe745540f019cad078a57a27337'
boostMwitools/quickbook
boost...updated 16674 targets...
boostぶうすとOK
libevent-devel完了しました!
openpmixCloning into 'openpmix'...
openpmixSetting version 3.1.4
openpmixSwitched to a new branch 'v3.1.4'
openpmixmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/BASE/openpmix' から出ます
openpmixぴみくすOK
slurmCloning into 'slurm'...
slurmSwitched to a new branch 'slurm-19-05-4-1'
slurmpatching file src/plugins/mpi/pmix/pmixp_client.c
slurmUsing python3 as default
slurm./configure --prefix=/usr/local --with-munge --with-pmix=/usr/local/pmix
slurmconfig.status: executing libtool commands
slurmmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/BASE/slurm' から出ます
slurmumask 022; if [ -x /usr/lib/rpm/debugedit ]; then hsrcdir=`cd ../.. && pwd`; /usr/lib/rpm/debugedit -b $srcdir -d /usr/local/lib/slurm /usr/local/slurmmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/BASE/slurm' から出ます
slurmすらるむOK
gfortran完了しました!
cmake完了しました!
ompiDisable firewall for MPI nodes....
ompiRemoved /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
ompi[DOWNLOAD]
ompiCloning into 'ompi'...
ompiSwitched to a new branch 'v4.0.2'
ompi[AUTOGEN]
ompi[CONFIGURE]
ompi./configure --prefix=/usr/local --with-slurm --with-pmix=/usr/local/pmix --with-libevent --with-hwloc=internal --with-ompi-pmix-rte --disable-mca-dso
ompimake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/BASE/ompi' から出ます
ompiえむぴーあいOK
boost-mpi...updated 82 targets...
boost-mpiぶうすとえむぴあいOK
Making user slurm [666]
Created symlink /etc/systemd/system/multi-user.target.wants/slurmd.service → /etc/systemd/system/slurmd.service.
slurm-clientじっこーのーどOK
Please start slurmd by [ systemctl start slumd ] AFTER YOU CONFIRM slurmd.conf that must include this machine as
NodeName=h200 CPUs=48 Boards=1 SocketsPerBoard=2 CoresPerSocket=12 ThreadsPerCore=2 RealMemory=257845
or you can use [ smgr ] to apply [c] command 

以上で、ソフトウェアのインストールは完了. 共有ディスクを使う場合は次も実行しておく:

client# make nfs-export

サーバーマシンの slurm.conf に,上記紫色データをもとに,このクライアントを追加する必要がある. サーバーにおいて slurm.conf を書き換えた場合, 全ての計算ノードに設定を伝達する.それは,サーバーにおいて以下のコマンドを実行する:

server# smgr d
This is SERVER
クライアントに送るぞ
scp -q {/usr/local/etc/slurm.conf,/usr/local/etc/prolog.sh,/usr/local/etc/prolog-task.sh,/usr/local/etc/epilog.sh} ib2007-1:/usr/local/etc
scp -q {/usr/local/sbin/StartDisk,/usr/local/sbin/FinishDisk} ib2007-1:/usr/local/sbin
scp -q {/usr/local/etc/slurm.conf,/usr/local/etc/prolog.sh,/usr/local/etc/prolog-task.sh,/usr/local/etc/epilog.sh} ib2007-2:/usr/local/etc
....

各クライアントに対し,そのパスワードを尋ねられる場合もある.面倒である場合, サーバーにおいて作成した公開鍵を計算クライアントノードに登録しておけば良い.

あるいは,新規・既存の,全てのクライアントにおいて, 設定ファイルをサーバーから取得しても良い:

client# smgr d
サーバーからパクるぞ

準備ができたら,クライアントプログラムを起動しる:

client# smgr c
計算デーモンちゃん再起動
SUCCESS
 slurmd.service - Slurm node daemon
   Loaded: loaded (/etc/systemd/system/slurmd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-02-13 16:58:17 JST; 10ms ago
...
2月 13 16:58:17 h223.229.249.10.1016485.vlan.kuins.net systemd[1]: Started Slurm node daemon.

ノード一覧で表示に出ることを確認しよう.

client# smgr n
NODE       PARTITION  C:S:T MEM,MB  DISK,GB FEATURE              STAT  REASON
ib2007-1   B,E,F,L    1:2:1   3935      150 CL0                  idle  none
ib2007-2   B,E,F,L    1:2:1   3935      200 CL0                  idle  none
ib2007-3   S          1:2:1   3935      200 CL0                  idle  none
ib2007-4   B,E,F,L    1:2:1   3935      200 CL0                  idle  none
ib2011-1   B,E,F,L    1:4:2  15728     1400 CL1,CL2              idle  none

STATがidleにならない場合, 自分のノード名を使って

client# smgr on ib2007-1

としてみる.明確な理由が表示されてidleにならない場合(メモリーが足りねえとか,ネットワークが繋がらないとか)は,対応する問題点を解決する.初回は,なんや意味もなくエラーしてみちゃったりする場合もあり,ま,とりあえずonにしてみるのもよかろうて.


各種ライブラリーを整備

いずれにせよ,数値解析に用いる各種ライブラリーも準備する:

# make all
gsl                      完了しました!
cmake                3.11.4-3.el8                   ←インストール済みマーク
python-devel         3.6.8-2.module_el8.1.0+245+c39af44f   
boost                boost-1.71.0                        
libXt完了しました!
libopengl完了しました!
vtkSubmodule path 'ThirdParty/vtkm/vtkvtkm/vtk-m': checked out 'f2aa6ad5be1a97e3fb41ef4680ee2c76c3434ac0'
vtkSwitched to a new branch 'v8.2.0'
vtk-- Build files have been written to: /local/packages/thirdparty/CLUSTER/LIB/vtk.build
vtkmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/LIB/vtk.build' から出ます
vtkゔってけOK
blas完了しました!
gmp完了しました!
mpfr完了しました!
eigenCloning into 'eigen'...
eigenSwitched to a new branch '3.3.7'
eigenえいげんOK
ntlgenerating ../include/NTL/config_log.h
ntlmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/LIB/ntl-10.3.0/src' から出ます
ntlNTL:OK
Checking out files:  58%
cgalSwitched to a new branch 'releases/CGAL-4.13.2'
cgal-- Build files have been written to: /local/packages/thirdparty/CLUSTER/LIB/cgal/build/release
cgalmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/LIB/cgal/build/release' から出ます
cgalしーがるOK
calcCloning into 'calc'...
calcSwitched to a new branch '2.12.7.2'
calcmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/LIB/calc' から出ます
calcかるくOK
nkfCloning into 'nkf'...
nkfSwitched to a new branch 'v2_1_3'
nkfmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/LIB/nkf' から出ます
nkfnkf OK
gfortran             8.3.1-4.5.el8                           
openssl              1:1.1.1c-2.el8                          
munge                0.5.13-1.el8                            
selinux              disabled                                
maria                3:10.3.17-1.module_el8.1.0+257+48736ea6
httpd                2.4.37-16.module_el8.1.0+256+ae790463   
mailx                12.5-29.el8                             
readline             7.0-10.el8                              
pam                  1.3.1-4.el8                             
libcurl              7.61.1-11.el8                           
libevent-devel       2.1.8-5.el8                             
openpmix             v3.1.4                                  
slurm                slurm-19-05-4-1                         
ompi                 v4.0.2                                  
boost-mpi            boost-1.71.0                            
cryptoppCloning into 'cryptopp'...
cryptoppSwitched to a new branch 'CRYPTOPP_8_2_0'
cryptoppgmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/LIB/cryptopp' から出ます
cryptoppくりぷとぴぃぴぃOK
lapack完了しました!
log4cplusconfig.status: executing libtool commands
log4cplusmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/LIB/log4cplus-2.0.4' から出ます
log4cpluslog4cplus:OK
maria-devel          3:10.3.17-1.module_el8.1.0+257+48736ea6
mysqlppconfig.status: executing libtool commands
mysqlppmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/LIB/mysql++-3.2.5' から出ます
mysqlppmysqlpp:OK
php完了しました!
libpng完了しました!
libXaw完了しました!
texinfo完了しました!
plotutilsCloning into 'gnu-plotutils-fd-patch'...
plotutilsSwitched to a new branch '2.6.fd7'
plotutilsconfig.status: executing depfiles commands
plotutilsmake[1]: Leaving directory '/local/packages/thirdparty/CLUSTER/LIB/gnu-plotutils-fd-patch/plotutils-2.6'
plotutilsplotutils:OK
lzipOK. Now you can run make.
lzipmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/LIB/lzip-1.21' から出ます
lziplzip:OK
GraphicsMagickjaist.dl.sourceforge.net (jaist.dl.sourceforge.net) をDNSに問いあわせています... 150.65.7.130, 2001:df0:2ed:feed:GraphicsMagick
GraphicsMagickmake[1]: ディレクトリ '/local/packages/thirdparty/CLUSTER/LIB/GraphicsMagick-1.3.34' から出ます
GraphicsMagickGraphicsMagick:OK

以上である.インストール済みのバージョン番号は, statフォルダーに保存されている. それを一覧表示することもできる

# make all

stat/該当パッケージ ファイルを消去すると, make all で新バージョンをインストールすることができるようになる.

最後に,定期的にコマンド類を更新するように設定しておこう;

# make daily