Apache MySQLなどプロセスのメモリ使用量をZabbixで監視

メモリの監視は安定してシステムを運用するためには欠かすことができません。
またどのプロセスがメモリをどれくらい使用しているかがわかれば対策も取りやすくなります。

標準アイテム「proc.mem」を使用する

標準アイテムである「proc.mem」を使用するとプロセスの使用メモリが取得できます。しかし取得できるのは物理メモリではなく仮想メモリのサイズになります。実際取得してみると物理メモリの容量が2Gなのに対し4G以上の値が記録されていました。

UserParameterを使ってカスタムスクリプトを作成する

物理メモリを見るようにするにはUserParameterを使ってカスタムスクリプトを作成する必要があります。

まずは監視対象のサーバ(ZabbixAgent)にログインしスクリプトを作成します。

vi /etc/zabbix/script/proc_mem.sh
#!/bin/bash

[ -z "$1" ] && COMM='.*' || COMM="$1"
[ -z "$2" ] && EUSER='.*' || EUSER="$2"
[ -z "$3" ] && MODE='sum' || MODE="$3"
[ -z "$4" ] && ARGS_PATTERN='.*' || ARGS_PATTERN="$4"

PLIST=$( ps -eo rss,comm,euser,args --no-headers )

case "${MODE}" in
 "min")
   echo "${PLIST}" \
     | awk -v comm="^${COMM}$" -v euser="^${EUSER}$" -v   args_pattern="${ARGS_PATTERN}" \
       'BEGIN {MIN=0;CNT=0}{
          if (($2 ~ comm) && ($3 ~ euser)){
            args="";
            for(i=4;i<=NF;i++){args=args""$i}; if (args ~ args_pattern) { if (CNT == 0) { MIN=$1;CNT+=1 } else if ( MIN > $1 ) { MIN=$1 }
            }
          }
        } END {print MIN}'
 ;;
 "max")
   echo "${PLIST}" \
     | awk -v comm="^${COMM}$" -v euser="^${EUSER}$" -v args_pattern="${ARGS_PATTERN}" \
       'BEGIN {MAX=0}{
          if (($2 ~ comm) && ($3 ~ euser)){
            args="";
            for(i=4;i<=NF;i++){args=args""$i};
            if (args ~ args_pattern) {
              if (MAX < $1) { MAX=$1 }
            }
          }
        } END {print MAX}'
 ;;
 "avg")
   echo "${PLIST}" \
     | awk -v comm="^${COMM}$" -v euser="^${EUSER}$" -v args_pattern="${ARGS_PATTERN}" \
       'BEGIN {SUM=0;CNT=0}{
          if (($2 ~ comm) && ($3 ~ euser)){
            args="";
            for(i=4;i<=NF;i++){args=args""$i};
            if (args ~ args_pattern) { SUM+=$1;CNT+=1 }
          }
        } END {printf("%d\n", SUM/CNT)}'
 ;;
 "sum")
   echo "${PLIST}" \
     | awk -v comm="^${COMM}$" -v euser="^${EUSER}$" -v args_pattern="${ARGS_PATTERN}" \
       'BEGIN {SUM=0}{
          if (($2 ~ comm) && ($3 ~ euser)){
            args="";
            for(i=4;i<=NF;i++){args=args""$i};
            if (args ~ args_pattern) { SUM+=$1 }
          }
        } END {print SUM}'
 ;;
 *)
   exit 1
 ;;
esac

exit 0

作成したスクリプトの権限を変更します。

chmod 655 /etc/zabbix/script/proc_mem.sh

UserParameter追加

監視対象のサーバに先ほど作成したスクリプトをUserParameterに定義します。

vi /etc/zabbix/zabbix_agentd.conf
# UserParameter=
UserParameter=script.proc.mem[*],/etc/zabbix/script/proc_mem.sh "$1" "$2" "$3" "$4"

エージェントを再起動します。

service zabbix-agent restart

Zabbixに設定

プロセス別メモリの値を取得するためにZabbixの管理画面からアイテムを追加します。

プロセス別メモリ監視のテンプレートを作成

いろいろなサーバに設定したいので専用のテンプレートを作成します。

アイテムを作成

先ほど作成したテンプレートを選択しアイテムを追加します。


まずはHTTP用

次にMySQL用

テンプレートを監視サーバに追加

作成したテンプレートを監視サーバに追加します。

設定→ホスト→監視サーバを選択→テンプレート→プロセス別メモリ監視を追加

取得した値を確認する

監視データ→最新データ→アプリケーション選択→プロセス別メモリを選択

参考サイト
https://chirashi-no-ura.tumblr.com/post/84839902327/zabbix%E3%81%A7%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E6%AF%8E%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E4%BD%BF%E7%94%A8%E9%87%8F%E3%82%92%E7%9B%A3%E8%A6%96%E3%81%97%E3%81%9F%E3%81%84
https://qiita.com/y-araki-qiita/items/4b1ee91581a636e8563c

シェアする

  • このエントリーをはてなブックマークに追加

フォローする