Monitでサーバー監視(基本的な設定、CPU、メモリリソースの監視設定)

サーバーを監視したいが、2~3台だけなので手の込んだ監視システムを導入するのはちょっと、、、。という時はお手軽監視ソフト「Monit」が便利です。
Monitは無料で使える監視ツールです。
下記のサイトからダウンロード可能です。
マニュアルも充実しています。

ソースコード、バイナリ、Gitが用意されていますが、各ディストリビューションにも含まれていますので、各ディストリビューションのパッケージ管理コマンドでインストールするのが簡単です。
Monitでは、リソース監視、プロセス監視が可能で、メール通知や異常があったサービスの再起動、異常検知時に任意のプログラムを実行することが可能です。
サーバー/クライアント型監視ソフトのような複数のサーバにインストールされたMonitを一括管理する機能はありません。

概要

今回は「Monit」のインストールと基本的な設定、CPU、メモリリソースの監視設定をご紹介します。
アラートをメールで通知する為、postfixを予めインストールしています。

環境

OSCentOS Linux release 8.2.2004
監視monit-5.26.0

構築の流れ

  1. インストール
  2. 自動再起動設定
  3. メインの設定ファイル
  4. 監視設定ファイル
  5. 自動起動
  6. コマンド

構築方法

[1] インストール

Monitはepelリポジトリにあるので、まずepelをインストールし、その後Monitをインストールします。

# yum install epel-release
# yum install monit

[2] 自動再起動設定

  • Unit設定ファイルを書き換え

Monitの設定の前に、Monit自体が異常停止しないよう、monitプロセスが落ちた際に自動的に再起動するようにUnit設定ファイルを書き換えます。
デフォルトのUnit設定ファイルは書き換えず、/etc/systemd/system/にコピーしたmonit.serviceファイルを書き換えます。

# cp -p /usr/lib/systemd/system/monit.service /etc/systemd/system/

monit.serviceファイルの[Servicd]セクションの最後尾に「Restart=always」を追記します。

# vi /etc/systemd/system/monit.service
[Unit]
Description=Pro-active monitoring utility for unix systems
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/monit -I
ExecStop=/usr/bin/monit quit
ExecReload=/usr/bin/monit reload
Restart=always
[Install]
WantedBy=multi-user.target
  • デーモン再起動

Unit設定ファイルに変更を加えたのでdaemon-reloadを実行します。

# systemctl daemon-reload
  • サービス自動再起動が有効化確認

ここで一度、自動再起動が有効に機能するか確認します。

# systemctl start monit
# systemctl status monit
● monit.service - Pro-active monitoring utility for unix systems
   Loaded: loaded (/etc/systemd/system/monit.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-07-17 16:53:06 JST; 52s ago
  Process: 1930 ExecStop=/usr/bin/monit quit (code=exited, status=0/SUCCESS)
 Main PID: 1934 (monit)
    Tasks: 2 (limit: 23968)
   Memory: 968.0K
   CGroup: /system.slice/monit.service
           └1934 /usr/bin/monit -I

monitプロセスのPIDを確認し、killします。

# ps -ef | grep -v grep | grep monit
root        1934       1  0 16:53 ?        00:00:00 /usr/bin/monit -I
# kill -9 1934

killした後にsystemctlコマンドでステータスを確認すると、起動していることがわかります。
起動時間に注目すると、「2s」となっていますので再起動したことが確認できます。

# systemctl status monit
● monit.service - Pro-active monitoring utility for unix systems
   Loaded: loaded (/etc/systemd/system/monit.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-07-17 16:54:29 JST; 2s ago
  Process: 1930 ExecStop=/usr/bin/monit quit (code=exited, status=0/SUCCESS)
 Main PID: 1950 (monit)
    Tasks: 2 (limit: 23968)
   Memory: 944.0K
   CGroup: /system.slice/monit.service
           └1950 /usr/bin/monit -I

Monitのログファイル(デフォルト:/var/log/monit.log)にMonitを起動したことを示すログが出力されています。

# cat /var/log/monit.log
[JST Jul 17 16:54:29] info     : Starting Monit 5.26.0 daemon with http interface at [localhost]:2812
[JST Jul 17 16:54:29] info     : 'monit01.cv.local' Monit 5.26.0 started

systemdコマンドでプロセスを停止させた場合は再起動してきません。一応確認しておきます。

# systemctl stop monit
# systemctl status monit
● monit.service - Pro-active monitoring utility for unix systems
   Loaded: loaded (/etc/systemd/system/monit.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

[3] メインの設定ファイル

Monitの基本設定を行うファイルは「/etc/monitrc」です。
主な設定項目について記載します。

  • 設定項目
  • チェック間隔

チェック間隔を秒で指定します。
デフォルトは「30」ですが、わかりやすく「60」にします。

set daemon 60
  • 初回チェック開始までの待機秒数

初回チェック開始までの待機秒数を指定します。
サーバー起動時等監視をすぐに開始してもまだサービスが起動されていない場合がある為、適切な秒数を指定します。
デフォルトでは無効です。今回は60に指定します。

with start delay 60
  • PIDファイルを作成する場所

PIDファイルを作成する場所を指定します。
デフォルトでは「$HOME/.monit.pid」となりますが、設定ファイル内にコメントアウト状態で記載されている場所に変更します。

set pidfile /var/run/monit.pid
  • Monitのidファイル、stateファイル

Monitのidファイル、stateファイルも同様に設定ファイル内にコメントアウト状態で記載されている場所に変更します。
idファイルは一意のIDを生成し保存しています。
stateファイルは監視対象、リソース等をキャッシュしています。

set idfile /var/.monit.id
set statefile /var/.monit.state
  • メールでアラート通知する際のメールサーバ

メールでアラート通知する際のメールサーバを指定します。
今回はlocalhostとします。

set mailserver localhost
  • メールでのアラート通知先

メールでのアラート通知先を指定します。
ここではローカルのユーザを指定していますが、外部へメール送信可能な環境であれば外部の有効なメールアドレスを指定できます。

set alert root@localhost

上記の記載だと一回しか通知されないので、事象が解消するまで通知し続けるように「with reminder on 10 cycles」と記述を追加します。

set alert root@localhost with reminder on 10 cycles

上記記述で10サイクルごとに事象が解消されていなければ通知します。
1サイクルは「set daemon」で指定した秒数になります。

  • メール通知の文面

メール通知の文面を設定します。
デフォルトのままでもよいですが、ここではSubjectに「$HOST」を追加しています。
システムが提供しているサービス名等もSubjectに追加すると、いちいちメールを開かなくてもどのサービス、サーバーでアラートが出たのかわかりやすくなります。

set mail-format {
  from:    Monit
  subject: monit alert -- $HOST $EVENT $SERVICE
  message: $EVENT Service $SERVICE
                Date:        $DATE
                Action:      $ACTION
                Host:        $HOST
                Description: $DESCRIPTION
           Your faithful employee,
           Monit
}

※メール通知にlocalのpostfixを使用している場合、postfixが停止しているとメール通知が行われないので注意が必要です。

  • シンタックスチェック

ここまで設定が完了したらシンタックスチェックを実行します。

# monit -t
 New Monit id: 835***602**********86e****d7a403
 Stored in '/var/.monit.id'
Control file syntax OK

[4] 監視設定ファイル

監視設定ファイル等は通常「/etc/monit.d/」にまとめて保存するとわかりやすいです。
ログ出力先の指定も同ディレクトリ内にある「logging」ファイルにパスが記載されています。

  • 設定項目
  • ロードアベレージ、CPU使用率、メモリ監視

今回はシステムの監視として、ロードアベレージ、CPU使用率、メモリの監視を設定しています。
設定ファイルは、「/etc/monit.d/system」としています。設定ファイルの名前は何でもよいのでわかりやすい名前にした方がよいでしょう。systemファイルの中身は以下のように記載します。

check system $HOST
  if loadavg (1min) > 4 then alert
  if loadavg (5min) > 2 then alert
  if cpu usage > 95% for 10 cycles then alert
  if memory usage > 75% then alert

ロードアベレージは1分と5分の2つを監視しています。
ここでは、loadavg(1min)はCPUコア数×2、loadavg(5min)「はCPUコア数×1を閾値として設定しています。
特に根拠はありませんが瞬間的なロードアベレージの増加は検知しなくてもよいので、コア数×2にしています。
cpu usageは95%以上になるとアラートを出しますが、「for 10 cycles then alert」という付加設定で10サイクル連続で95%を超えていた場合にアラートを出すようにしています。

  • シンタックス

設定ファイルを保存したらシンタックスチェックを行いMonitを起動します。

# monit -t
# systemct start monit
  • 負荷テスト

サービスを起動してから初回のチェックが行われるのは、「with start delay」で指定した秒数後になります。
実際にyesコマンドでCPU負荷をかけて、アラートが出るか確認します。

# yes > /dev/null &

※負荷が上がらない場合は上記コマンドを複数実行します。

アラートの閾値を超えると下記のようにmonit.logにwarningやerrorが出力されます。きちんと検知しています。
チェック間隔は「set daemon」で指定した秒数になりますので、実際には負荷が閾値を超えた状態でチェック間隔が到来したときにアラートが出ます。

[JST Jul 20 14:36:11] warning  : 'monit01.cv.local' cpu usage of 99.5% matches resource limit [cpu usage > 95.0%]
[JST Jul 20 14:36:11] error    : 'monit01.cv.local' loadavg (1min) of 5.8 matches resource limit [loadavg (1min) > 4.0]
[JST Jul 20 14:37:11] error    : 'monit01.cv.local' loadavg (5min) of 2.5 matches resource limit [loadavg (5min) > 2.0]

cpu usageは10回連続検知でアラートを出す設定ですので、1回検知しただけではwarningとなり、メール通知は行われません。
ロードアベレージは1回でアラートを出すの設定ですので、errorとなっています。
この時アラートメールが送信されてます。
負荷を止めてcpu usage、load averageが低下し、閾値を下回ると下記のようにinfoメッセージで「check succeeded」が出力されます。

[JST Jul 20 14:37:11] info     : 'monit01.cv.local' cpu usage check succeeded [current cpu usage = 75.7%]
[JST Jul 20 14:38:12] info     : 'monit01.cv.local' loadavg (1min) check succeeded [current loadavg (1min) = 2.4]
[JST Jul 20 14:39:12] info     : 'monit01.cv.local' loadavg (5min) check succeeded [current loadavg (5min) = 2.0]

アラートメールの文面はmonitrcで設定した通り、下記のように記載されます。

Subject: monit alert -- monit01.cv.local Resource limit matched monit01.cv.local
Date: Mon, 20 Jul 2020 05:36:11 GMT
X-Mailer: Monit 5.26.0
Content-Type: text/plain; charset=utf-8
Status: R
Resource limit matched Service monit01.cv.local
                Date:        Mon, 20 Jul 2020 14:36:11
                Action:      alert
                Host:        monit01.cv.local
                Description: loadavg (1min) of 5.8 matches resource limit [loadavg (1min) > 4.0]
           Your faithful employee,
           Monit

下記はアラート回復メールの文面になります。

Subject: monit alert -- monit01.cv.local Resource limit succeeded monit01.cv.local
Date: Mon, 20 Jul 2020 05:38:12 GMT
X-Mailer: Monit 5.26.0
Content-Type: text/plain; charset=utf-8
Status: R
Resource limit succeeded Service monit01.cv.local
                Date:        Mon, 20 Jul 2020 14:38:12
                Action:      alert
                Host:        monit01.cv.local
                Description: loadavg (1min) check succeeded [current loadavg (1min) = 2.4]
           Your faithful employee,
           Monit

[5] 自動起動

サーバ起動時に自動的に起動するようにサービスをenableにしておきます。

# systemctl enable monit

[6] コマンド

Monitでは監視状況を確認するコマンド/オプションが用意されています。

  • 監視状況確認
# monit status
Monit 5.26.0 uptime: 30m
System 'monit01.cv.local'
  status                       OK
  monitoring status            Monitored
  monitoring mode              active
  on reboot                    start
  load average                 [1.11] [1.07] [1.02]
  cpu                          15.0%us 35.0%sy 0.0%wa
  memory usage                 198.1 MB [5.2%]
  swap usage                   0 B [0.0%]
  uptime                       2d 22h 48m
  boot time                    Fri, 17 Jul 2020 16:13:17
  data collected               Mon, 20 Jul 2020 15:01:12
  • 監視状況のサマリー表示

※表組で表示されます。

# monit summary
Monit 5.26.0 uptime: 31m
--------------------------------------------------------------------------------
| Service Name                    | Status                     | Type          |
--------------------------------------------------------------------------------
| monit01.cv.local                | OK                         | System        |
--------------------------------------------------------------------------------
  • その他

その他、よく使うものとして下記のオプションがあります。
※ 「name」には、monit summary コマンドで表示される「Service Name」を指定します

その他コマンド説明
monitor allすべての監視を開始する
monitor  < name >< name >で指定された項目の監視を開始する
unmonitor allすべての監視を停止する
unmonitor < name >< name >で指定された項目の監視を停止する
reload設定ファイルを読み込み監視状況を初期化する
status [name]監視状況の詳細を表示する
summary [name]監視状況のサマリーを表示する

技術情報

商標について

関連サービス

OSS導入支援

お気軽にお問い合わせください。応対時間 9:30-17:30 [ 土・日・祝日除く ]

お問い合わせ