Slurmのインストール on CentOS7



## はじめに

Slurmは科学技術計算などでジョブ管理ツールとして使われるサービスです。スパコンなどでも使われています。無料です。人数が多い研究室や、クラスターでMPI並列したい人などにお薦めですが、インストール作業は苦行。

せめてもの助けになればと思い、自分向けノートを公開します。

## 主な手順


1. Mungeのインストール
1. Slurmのインストール

## 注意点

管理サーバー兼フロントシステムとなる**管理ノード**`gw`と、子ノードとしてぶら下がり計算を担当する**計算ノード**`node01`があるとする。基本的には管理ノードが一つ、計算ノードが複数あることになる。今回のインストール作業では、管理ノードと計算ノードで行うことが異なるため、間違えないように。

以下の例ではインストール作業の際に、`/home/tools/`というディレクトリにrpmを置くなどするが、このディレクトリは管理ノードと計算ノードでNFSなどで共有されていることにする。 NFS等が張れない場合は、何らかの手段でファイルをコピーして各ノードに配布すればよい。

## 1. Mungeのインストール

Mungeのバージョンは`munge-0.5.14`とする。

### 1.1. 管理ノードへのインストール

mungeを公式サイトから取り寄せて、rpmをビルドする。管理ノードでビルド作業を行う。


```bash
cd /home/tools/install/
wget 公式の場所/munge-0.5.14.tar.xz
wget 公式の場所/munge-0.5.14.tar.xz.asc
wget https://github.com/dun.gpg
rpmbuild -tb munge-0.5.14.tar.xz
cp -p /root/rpmbuild/RPMS/x86_64/*.rpm /home/tools/rpm/
```

管理ノード自身にインストール。鍵の生成。サービス起動。


```bash
cd ../rpm
rpm -ivh munge-0.5.14-1.el7.x86_64.rpm munge-devel-0.5.14-1.el7.x86_64.rpm munge-libs-0.5.14-1.el7.x86_64.rpm
#鍵の生成
sudo -u munge /usr/sbin/mungekey -v
sudo systemctl enable munge
sudo systemctl start munge
```

  

### 1.2. 計算ノードへのインストール

インストール。`/home/tools/rpm`にアクセスできるものとして、以下を実行。途中、管理ノードからキーをコピーしている。


```bash
cd /home/tools/rpm
rpm -ivh munge-0.5.14-1.el7.x86_64.rpm munge-devel-0.5.14-1.el7.x86_64.rpm munge-libs-0.5.14-1.el7.x86_64.rpm
scp -p gw:/etc/munge/munge.key /etc/munge/munge.key
chown munge:munge /etc/munge/munge.key
systemctl enable munge
systemctl start munge
```

### テスト(ノード共通)

インストールが上手く行っていれば、`munge`というユーザーおよびグループが作られているはず。

管理ノード、計算ノード、それぞれで以下のコマンドを実行して問題が起こらないか確認。


```bash
munge -n |unmunge
```

また、管理ノードから次のコマンドを発行して、ssh経由で計算ノード`node01`にてmungeを解読できるか確認。


```bash
munge -n -t 10 | ssh node01 unmunge
```

## 2. Slurmのインストール

Slurmのバージョンは`slurm-19.05.5`とする。

  

### 2.1 共通作業その1

※ユーザーおよびグループとして`slurm`を作っておく必要があるかもしれない。

### 2.2. 管理ノードへのインストール

公式からソースを取り寄せてビルド、かつ、インスコ。管理ノードで行う。


```bash
cd /home/tools/install
wget https://download.schedmd.com/slurm/slurm-19.05.5.tar.bz2
cd slurm-19.05.5/
./configure
make
make install
```

サービスを登録する。Mungeは自動で登録してくれるのに、Slurmはやってくれないので以下の手順で行う。。

管理ノードで起動するサービスは`slurmctld`と`slurmdbd`の二つ。計算ノードとは異なるので注意。まずはサンプルから`.service`ファイルをコピーして`/etc/systemd/system/`に配置。


```bash
cp -p /home/tools/install/slurm-19.05.5/etc/slurmctld.service /etc/systemd/system/
cp -p /home/tools/install/slurm-19.05.5/etc/slurmdbd.service /etc/systemd/system/
```

ここで、`slurmctld.service`の中身は環境に合わせて書き換えます。特に重要なのは`ConditionPathExists`と`PIDFile`。ここで後者の設定値は後述の理由によって`/run/slurm/slurmctld.pid`に書き換える。


```bash
#slurmctld.serviceの中身
[Unit]
Description=Slurm controller daemon
After=network.target munge.service
ConditionPathExists=/usr/local/etc/slurm.conf #ここも重要

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/slurmctld
ExecStart=/usr/local/sbin/slurmctld $SLURMCTLD_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/slurm/slurmctld.pid     #ここだけ書き換えた
LimitNOFILE=65536


[Install]
WantedBy=multi-user.target
```


```bash
#slurmdbd.serviceの中身
[Unit]
Description=Slurm DBD accounting daemon
After=network.target munge.service
ConditionPathExists=/usr/local/etc/slurmdbd.conf #ここも重要

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/slurmdbd
ExecStart=/usr/local/sbin/slurmdbd $SLURMDBD_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/slurm/slurmdbd.pid     #ここだけ書き換えた

LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
```

`/usr/local/etc/slurm.conf`を書き換える。その場所にファイルが無かった場合は、`/home/tools/install/slurm-19.05.5/etc/slurm.conf.example`をコピーする。書き換える上で、重要な点として`SlurmdPidFile`の設定値が先の`slurmctld.service`の`PIDFile`と同じになっていること。その他の設定値はここでは割愛。公式サイトを参照されたし。


```bash
#slurm.confの一部
SlurmdPidFile=/run/slurm/slurmd.pid  #ここをslurmctld.serviceの設定値と同じにする
```

似たような内容だが、`/usr/local/etc/slurmdbd.conf`を書き換える。その場所にファイルが無かった場合は、`/home/tools/install/slurm-19.05.5/etc/slurmdbd.conf.example`をコピーする。書き換える上で、重要な点として`PidFile`の設定値が先の`slurmdbd.service`の`PIDFile`と同じになっていること。その他の設定値はここでは割愛。公式サイトを参照されたし。


```bash
#slurmdbd.confの一部
PidFile=/run/slurm/slurmdbd.pid  #ここをslurmdbd.serviceの設定値と同じにする
```

### 2.3. 計算ノードへのインストール

管理ノードでコンパイルしたものを使ってインストール。（ただし、インストール場所は`/usr/local/sbin/`配下なので、そこをNFS共有マウントするという荒業もアリ。）


```bash
cd /home/tools/install
/slurm-19.05.5/
make install
```

サービスを登録する。計算ノードで起動すべきサービスは`slurmd`である。管理ノードとは異なるので注意。サンプルをコピーして`/etc/systemd/system/slurmd.service`に配置。


```
cp -p /home/tools/install/slurm-19.05.5/etc/slurmd.service /etc/systemd/system/
```

そして、`slurmd.service`の中身を書き換える。注意点は管理ノード同様にPIDファイルのパスに関する部分。


```bash
#slurmd.serviceの中身
[Unit]
Description=Slurm node daemon
After=munge.service network.target remote-fs.target
ConditionPathExists=/usr/local/etc/slurm.conf  #ここも重要

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/slurmd
ExecStart=/usr/local/sbin/slurmd $SLURMD_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/slurm/slurmd.pid    #ここだけ書き換えた
KillMode=process
LimitNOFILE=131072
LimitMEMLOCK=infinity
LimitSTACK=infinity
Delegate=yes


[Install]
WantedBy=multi-user.target
```

**【重要】**次に、`/usr/local/etc/slurm.conf`を管理ノードからコピーする。（ただし、`/usr/local/`配下をNFS共有マウントするという荒業もアリ。）

### 2.4. 共通作業その2

PIDファイルの場所の変更に合わせて、OS起動時に`/run/slurm/`ディレクトリを自動生成するスクリプトを登録する。具体的には、`/usr/lib/tmpfiles.d/forSlurm.conf`を手動で生成する。


```bash
vi /usr/lib/tmpfiles.d/forSlurm.conf
```

中身は次のようにする。


```bash
#forSlurm.confの中身
d /run/slurm 0755 root root -
```

ここで再起動して実際に`/run/slurm/`が作成されることを確認。再起動したくない場合は、サービスを起動する前に手動でこのディレクトリを作っておく必要がある。

次のコマンドで動作時の一時管理ファイル用の場所を作る。ただし、場合によってはインストール時に作られているかもしれないので確認すべし。


```bash
mkdir /var/spool/slurm
mkdir /var/spool/slurm/ctld
chmod 775 /var/spool/slurm/ctld
chown -R slurm:slurm /var/spool/slurm
```

### 2.5. サービス起動

サービスの起動。以下のコマンドを実行


```bash
#管理ノードの場合
systemctl daemon-reload
systemctl enable slurmctld
systemctl enable slurmdbd
systemctl start slurmctld
systemctl start slurmdbd

#計算ノードの場合
systemctl daemon-reload
systemctl enable slurmd
systemctl start slurmd
```

サービスが起動しない場合は、`journalctl -xe`コマンドで理由を調べる。例えば`slurm.conf`にノードを登録していないと計算ノードのサービスは立ち上がらない。

## PIDファイルの場所を変える理由

上記の設定では、3種類のPIDファイル(そもそもPIDとは？というのは置いておいて)の場所を、`/var/run/*.pid`から`/run/slurm/*pid`に変更しています。その理由として、どうやらsystemdのバグらしく、前者に置いたものは上手く動かないようです[^1]。

しかし、`/run/slurm/`配下にファイルを置くことにしても、`/var/run/`および`/run/`配下のファイルはOS再起動時に全て消えてしまうという事情があります[^2]。

そこで、`/usr/lib/tmpfiles.d/`配下に`forSlurm.conf`を作って起動時に`/run/slurm`ディレクトリが生成されるようにしています。

## その他の注意点


- 色々な設定は`slurm.conf`に書くことになりますが、必ず全ノードで同じ内容になっている必要があります。書き換えたら全ノードへコピーし、全ノードでサービスを再起動しましょう。
- 各ノードの状態は、管理ノードから`sinfo`コマンドで見れます。ここで無事に起動すれば`idol`状態になるはずですが、稀に`down`のままの時があります(CentOS7では割とよくある)。確実に計算ノードのサービスが立ち上がっている場合は、次のコマンドで状態を`idol`に変更してしまって大丈夫です。

  ```bash
  scontrol update nodename=node01 state=idle
  ```

## おわりに

Slurmのインストール作業は、毎回トラブってる気がします。本当につらいですね。


[^1]: [https://log.kobito3.net/2019/11/systemd.html](https://log.kobito3.net/2019/11/systemd.html)

[^2]: [https://qiita.com/suemoc/items/e29285e8e67263298f35](https://qiita.com/suemoc/items/e29285e8e67263298f35)