Zabbix によるGPUサーバの監視

# はじめに

ZabbixでGPUサーバの使用率等を監視する環境を構築します．

zabbixのバージョン: 3.4
zabbix serverのFQDN: ZABBIX.SERVER

## Zabbixとは

Zabbixは，Zabbix社が開発した"ネットワーク管理ソフトウェア"です．
監視サーバを中心にして，様々なサーバをリモートで監視することができます．

# 環境構築
データを収集し監視を行うZabbix Serverの構築と，対象の各サーバにAgentの導入が必要です．

## Zabbix Server
このServerが監視対象サーバからのデータを管理し，必要に応じてアラート等を発します．
こちらはDockerを使った構築が便利です．
なお，初期アカウントは admin/zabbix でログインできます．

```yml:docker-compose.yml
version: '2'
services:
  mysql:
    image: mysql:5.7
    restart: always
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - ./data/mysql:/var/lib/mysql
    expose:
      - "3306"
    environment:
      MYSQL_ROOT_PASSWORD: docker
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix

  zabbix-server:
    image: zabbix/zabbix-server-mysql:alpine-3.4-latest
    restart: always
    volumes:
      - ./data/zabbix:/var/lib/zabbix
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
    ports:
      - "10051:10051"
    depends_on:
      - mysql

  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:alpine-3.4-latest
    restart: always
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
      ZBX_SERVER_HOST: zabbix-server
      PHP_TZ: Asia/Tokyo
    ports:
      - "80:80"
    depends_on:
      - mysql
      - zabbix-server
```
(参考: https://qiita.com/330k/items/3d3f984a5d3a374ccc96)



## Zabbix agent
監視対象に導入し，Zabbix Serverにデータを送信するクライアントです．
こちらもDockerで導入することは可能ですが，GPUを監視したい場合コンテナ内からアクセスする必要が出てきます (nvidia-docker等使えば可能だと思いますが未確認です)．
ここでは，Agentは対象サーバに直接インストールすることを想定します．公式ドキュメントに従えば簡単です．(https://www.zabbix.com/documentation/3.4/manual/installation/install_from_packages/)
(例) ubuntu 14.04/16.04

```bash:ubuntu
#ubuntu 18.04
$ wget http://repo.zabbix.com/zabbix/3.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.4-1+bionic_all.deb
# ubuntu16.04
$ wget https://repo.zabbix.com/zabbix/3.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.4-1+xenial_all.deb
# ubuntu14.04
$ wget https://repo.zabbix.com/zabbix/3.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.4-1+trusty_all.deb

$ dpkg -i zabbix-release_3.4-1+*_all.deb
$ apt-get update
$ apt-get install zabbix-agent

# 起動/自動起動
$ service zabbix-agent start
$ systemctl enable zabbix-agent
```

(例) CentOS 7

```bash:CentOS7
$ rpm -ivh https://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
$ yum install zabbix-agent
```

### 設定
設定ファイルを編集します．`TARGET.SERVER`は対象サーバのホストネームです．

```:/etc/zabbix/zabbix_agentd.conf
Server=ZABBIX.SERVER
ServerActive=ZABBIX.SERVER
Hostname=TARGET.SERVER
```

## GPUの監視
デフォルトではGPUの監視はできません．そこで設定の追加を行います．なお，ここではNvidiaのGPUのみを想定しています．
搭載するGPUが1枚のみの場合は https://github.com/RichardKav/zabbix-nvidia-smi-integration が使えます．また複数のGPUの場合は https://github.com/plambe/zabbix-nvidia-smi-multi-gpu が使えます．以下は複数GPUの設定です．

### Server側
テンプレートをインポートします．
Web GUI -> Configuration-> Templates から右上のImportを押下します．Import Fileにリポジトリのxmlファイルを指定します．


### クライアント側
* ``/etc/zabbix/zabbix_agentd.conf``にリポジトリ内の``userparameter_nvidia-smi.conf.linux``の中身を追記します．
* リポジトリ内の``get_gpus_info.sh``を``/etc/zabbix/scripts/``にコピーします (このディレクトリはデフォルトでは存在しません．)．``get_gpus_info.sh``に実行権限を与えます．


# 監視対象の追加
1. 対象サーバに上記の設定を行います．
1. Web GUI -> Configuration-> Hosts の右上 Create Hostを押下します．
    * Hostnameに``TARGET.SERVER``を入力します (対象サーバ側の設定と一致する必要があります)．
    * Visible nameは任意です．
    * Group は最低1つに所属させる必要があります．
    * IP address or DNS nameどちらかを入力します．通常はDNS nameに``TARGET.SERVER``で良いはずです．"Connect to"はどちらか適切に選択します．
1. Templateに切り替えます．
    * Select からテンプレートを追加します． ``Template OS Linux``と ``Template Nvidia GPUs Performance`` を選択します．
    * 青いボタン状の``Add``の上の``Add``を押さないと反映されません．
1. AddでHostの追加します．


# ビジュアライゼーション
すべてのGPUの状況を一覧できるScreenを作成すると便利です．
あらかじめ複数のGraphをまとめて定義したGraph prototypeを使うと少ない作業量で作成できます．

1. ResourceでGraph prototypeを選択．
1. Graph prototypeで追加したいHostのprototypeを選択．上記でインポートしたテンプレートにはGPU関連で次の3つが定義されています．もちろん自分で追加編集できます．:
    - GPU {#GPUINDEX} Memory
    - GPU {#GPUINDEX} Temperature, Fan Speed and Power
    - GPU {#GPUINDEX} Utilization
1. 縦横の個数などを調整します．例えば，4GPU搭載のホストと8GPU搭載のホストが混在している場合，横幅を4に統一するといい感じに一覧できると思います (8GPUのホストは2段表示)．
1. ホストの数だけ作業を繰り返す．

## ユーザへの公開
特定のGroupに読み取り権限を与えることで，Screenを公開することができます．
例えばGuestsに権限を与えることで，ログイン不要でサーバの状況を確認することができるようになります．
注意点としては，Screenだけでなく，ホスト自体への読み取り権限も与える必要があります．これにより，GuestsはScreen上の値だけでなく，すべてのデータにアクセス(Read)できるようになります．おそらく公開するデータのみに絞ったTemplateを作成することでアクセス権限を絞ることは可能だと思いますが，とくに悪用できるようなデータはないと思っているので，私はすべて公開しています．

### screenの公開設定
1. 対象のScreenのPropertiesからSharingを選択．
2. 公開したい対象のGroup (たとえばGuests) を追加し，Read-onlyの権限を与える．

### ホストの公開設定
1. AdministrationからUser groupsを開き，対象のGroup (たとえばGuests) を選択する．
2. Permissionsから公開したいHost groupにReadの権限を与える．