Slurm Workload ManagerをUbuntu 16.04LTS に導入する

# Slurm Workload Managerとは
Slurm Workload Manager (Slurm)は無料でオープンソースのジョブスケジューラであり、世界中の多くのスパコンで利用されている。Xeon E5-26XXv4では今まで使用していたジョブスケジューラ(TORQUE)がうまく動作しなかったので、こちらのジョブスケジューラを試したところ、うまく動いたので作業メモを残す。

## MUNGEのインストール
MUNGEはSlurmのデフォルトの認証ソフト。 https://dun.github.io/munge/
これは、Ubntuのパッケージレポジトリからインストールできる。

```bash
sudo apt install libmunge-dev libmunge2 munge
```
しかし、"Job for munge.service failed because the control process exited with error code. See "systemctl status munge.service" and "journalctl -xe" for details."のようなエラーメッセージが表示され、MUNGEが起動しない。そこで、ググるとmunge.serviceのコードを以下のように少し書き換えれば対処できることが分かった。
https://groups.google.com/forum/#!topic/slurm-devel/_fUsovmjkvM
https://github.com/dun/munge/issues/31#issuecomment-127726497

```bash
sudo systemctl edit --system --full munge # munge.serviceを編集する。
# "ExecStart=/usr/sbin/munged" の行を
# "ExecStart=/usr/sbin/munged --syslog"に書き換える。
# nanoで編集しているので"ctrl+o"で上書き保存し、"ctrl+x"で終了する。
```

```bash:/etc/systemd/system/munge.service
[Unit]
Description=MUNGE authentication service
Documentation=man:munged(8)
After=network.target
After=time-sync.target

[Service]
Type=forking
ExecStart=/usr/sbin/munged --syslog
PIDFile=/var/run/munge/munged.pid
User=munge
Group=munge
Restart=on-abort

[Install]
WantedBy=multi-user.target

```

MUNGEの起動と動作確認

```bash
sudo systemctl start munge     # mungeを起動
systemctl status munge.service # mungeが動作しているか確認。
```

## Slurmのインストール
SlurmもUbuntuのレポジトリからインストールできるはずだが、手元の環境ではうまく動作しなかったので、最新の安定版を使った。 https://www.schedmd.com/downloads.php から最新の安定版をダウンロードし、ダウンロードしたフォルダでビルドし、インストールする。

```bash
tar -jxvf slurm-16.05.6.tar.bz2 
cd slurm-16.05.6
./configure
make
sudo make install
```

## Slurmの設定ファイルの作成
次にSlurmの設定ファイルを作成する。展開したslurmのフォルダに設定ファイルの作成を手助けするhtmlファイルがあるので（doc/html/configurator.easy.html）、適当なブラウザで開いて作成する。今回はPC一台にインストールするのでControl MachineとCompute Machinesを同一にした。また、Slurm Userをrootに、Resource Selection, SelectTypeをCons_resにそれぞれ変更した。submitボタンを押した後表示されるテキストをslurm.confファイルとして保存する。

```bash
firefox doc/html/configurator.easy.html

# ControlMachine: ホスト名
# ControlAddr: ホストのIPアドレス
# NodeName: ホスト名
# NodeAddr: ホストのIPアドレス
# Sockets: マザーボードに搭載しているCPUの数（普通は1か２）
# CoresPerSocket: １CPUあたりのコアの数
# ThreadsPerCore: 1コアあたりのスレッドの数
# CPUｓ: SoketsとCoresPerSocketとThreadsPerCoreの積
# RealMemory: 搭載しているメモリの量（free -m コマンドで表示される）
# SlurmUser: root
# Resource Selection
# SelectType: Cons_res に変更。
# "SelectTypeParameters=CR_CPU" この行は設定ファイルに書き込む。
```

Hyper Threadingを使って全てのスレッドにジョブを割り振る場合は"Sockets", "CoresPerSocket", "ThreadsPerCore"は設定しない方がいいようだ。その場合は"CPUs"のみ設定する。
https://groups.google.com/forum/#!searchin/slurm-devel/all$20threads|sort:relevance/slurm-devel/wmCeUBwR9bk/GKmP4JNQBwAJ
http://slurm.schedmd.com/cons_res.html
作成したSlurmの設定ファイルを /usr/local/etc/ にコピーする。

```bash
sudo cp slurm.conf /usr/local/etc/
```

```bash:/usr/local/etc/slurm.conf
# slurm.conf file generated by configurator easy.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
ControlMachine=SlurmServer
ControlAddr=10.x.x.x
#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-#
ProctrackType=proctrack/pgid
ReturnToService=1
SlurmctldPidFile=/var/run/slurmctld.pid
#SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=root
#SlurmdUser=root
StateSaveLocation=/var/spool
SwitchType=switch/none
TaskPlugin=task/none
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
FastSchedule=1
SchedulerType=sched/backfill
#SchedulerPort=7321
SelectType=select/cons_res
SelectTypeParameters=CR_CPU
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=cluster
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
#SlurmctldDebug=3
#SlurmctldLogFile=
#SlurmdDebug=3
#SlurmdLogFile=
#
#
# COMPUTE NODES
NodeName=SlurmServer NodeAddr=10.x.x.x CPUs=32 RealMemory=257850 State=UNKNOWN
PartitionName=defq Nodes=SlurmServer Default=YES MaxTime=INFINITE State=UP
```

## Slurmが使用するポート
ファイアウォールを設定している場合は、Slurmで使用するポートを開けておく。デフォルトの設定だと、Slurmctldが6817、Slurmdが6818を使用し、Schedulerが7321を使用するようだ。 
 
## Slurmをサービスとしてsystemdに設定後、起動させる
```bash
# set and start slurmd and slurmctld as services
sudo cp etc/slurmctld.service /etc/systemd/system
sudo cp etc/slurmd.service /etc/systemd/system
sudo systemctl enable slurmctld.service
sudo systemctl enable slurmd.service
sudo systemctl start  slurmctld.service
sudo systemctl start  slurmd.service

# check status of the services
systemctl status slurmctld.service
systemctl status slurmd.service
```

## 動作テスト
```bash
srun -l sleep 60 &
squeue 
```

ほかのジョブスケジューラとのコマンドの対応表はこちら。
https://slurm.schedmd.com/rosetta.pdf

# 参考
https://en.wikipedia.org/wiki/Slurm_Workload_Manager
https://slurm.schedmd.com/
http://www.ibm.com/developerworks/jp/linux/library/l-slurm-utility/
http://wildflower.diablonet.net/~scaron/slurmsetup.html
http://www-fps.nifs.ac.jp/ito/memo/slurm01.html
http://qiita.com/JeJeNeNo/items/908b127d9c3cfb8a21ce