モニタリングサービスを使わないDBCS監視(パフォーマンス監視)

こんにちは。Oracle Cloud Infrastructure(OCI)特集 編集部です。

OCIにはモニタリングサービスと通知サービスがあり、サーバーのパフォーマンスを監視する機能と特定のメールアドレスに通知する機能になります。
しかし、モニタリングサービスはDBCSで利用することができないのでスクリプトを作成して代用します。
DBCSの死活監視を行うスクリプトとパフォーマンスを監視するスクリプトの2つを作成したいと思います。

  1. DBCSの死活監視
  2. DBCSのパフォーマンス監視

本記事では2. DBCSのパフォーマンス監視にて記載します。
1. DBCSの死活監視は別の記事にて紹介しています。

DBCSのメモリ使用量が70%を超えた場合、メールで通知されるように下記作業を行います。
・メールを転送する際にはOCIの「電子メール配信サービス」を使用  
※使用にあたり、「SMTP資格証明の生成」
・「承認済送信者(送信元メールアドレス)の追加」を行う
・メモリ使用率を計算するスクリプトとメール送信を行うスクリプトの2つを作成  
※DBCSのOS(Linux)には sendmail や Postfix がインストールされていないため、pythonのスクリプトで代用する

【作業の流れ】

  • OCIのコンソールからSMTP資格認証の生成
  • OCIのコンソールから電子メール配信の承認済送信者の追加
  • メールを送信するスクリプトの作成
  • メモリ使用率が70%以上の時にメールを送信するスクリプト作成
  • DBCSに負荷をかけるスクリプトの作成
  • スクリプトの実行

OCIのコンソールからSMTP資格証明の生成


OCIのメニュー画面から「アイデンティティ」→「ユーザー」をクリックします。

該当するユーザーを選択します。

「SMTP資格証明」→「SMTP資格証明の生成」をクリックします。

説明を入力し、「SMTP資格証明の生成」をクリックします。

表示されているユーザ名とパスワードは後から確認することができないので、メモ帳に書き留めます。
「閉じる」をクリックします。


OCIのコンソールから電子メールの承認済送信者の追加


次にOCIのメニュー画面から「電子メール配信」→「電子メールの承認済送信者」をクリックします。

「承認済送信者の作成」をクリックします。

登録するメールアドレスを入力し、「承認済送信者の作成」をクリックします。


メールを送信するスクリプトの作成


オラクル クラウド インフラストラクチャの電子メール配信サービスを使用して送信するためのスクリプトを作成します。
Teratermを使用してDBCSにログインします。
ログイン後、スクリプトを作成するのですが
メールを送信するスクリプトはpythonで作成しますのでpythonが入っているかを確認します。
下記コマンドでpythonがインストールされているか確認できます。

$ python -V

pythonが入っていることが確認できましたのでスクリプトを作成していきます。

インストールされていることを確認し、スクリプトを作成します。

下記のコマンドでスクリプトをDBCS内に作成します。 

$ vi ociemail.py

メールを送信するスクリプトの内容は下記の通りです。
※参考URL https://docs.cloud.oracle.com/ja-jp/iaas/Content/Email/Reference/python.htm

# Oracle クラウド インフラストラクチャの電子メール配信を使用してメール送信するためのスクリプト
 
 import smtplib 
 import email.utils
 from email.mime.multipart import MIMEMultipart
 from email.mime.text import MIMEText
 
# 送信元メールアドレスの指定。
 SENDER = '送信元アドレス' 
 SENDERNAME = '送信元名前'
 
# 宛先メールアドレスの指定
 RECIPIENT  = '宛先アドレス'
 
#SMTP資格証明で生成したユーザー名の指定
 USERNAME_SMTP = 'SMTP資格証明で生成したユーザー名'
#SMTP資格証明で生成したパスワードの指定
 PASSWORD_SMTP = 'SMTP資格証明で生成したパスワード'
# エンドポイントの指定、portの指定
 HOST = "smtp.email.ap-tokyo-1.oci.oraclecloud.com"
 PORT = 25
# 件名の指定
 SUBJECT = 'Email Delivery Test (Python smtplib)'
 
# HTML以外のメール本文の指定
 BODY_TEXT = ("Email Delivery Test\r\n"
              "This email was sent through the Email Delivery SMTP "
              "Interface using the Python smtplib package."
             )
 
#メール本文の指定
 BODY_HTML ="testmemory"    
# メールの構成
 msg = MIMEMultipart('alternative')
 msg['Subject'] = SUBJECT
 msg['From'] = email.utils.formataddr((SENDERNAME, SENDER))
 msg['To'] = RECIPIENT
 
# Record the MIME types of both parts - text/plain and text/html.
 part1 = MIMEText(BODY_TEXT, 'plain')
 part2 = MIMEText(BODY_HTML, 'html')
 
# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
 msg.attach(part1)
 msg.attach(part2)
 
# メールの送信
 try: 
     server = smtplib.SMTP(HOST, PORT)
     server.ehlo()
     server.starttls()
     #smtplib docs recommend calling ehlo() before & after starttls()
     server.ehlo()
     server.login(USERNAME_SMTP, PASSWORD_SMTP)
     server.sendmail(SENDER, RECIPIENT, msg.as_string())
     server.close()
 
# ディスプレイに完了、エラーメッセージの表示
 except Exception as e:
     print ("Error: ", e)
 else:
     print ("Email successfully sent!")

メモリ使用率が70%以上の時にメールを送信するスクリプトの作成


メモリ使用率が70%を超えていた場合、メールを送信するスクリプトを作成します。
メールの送信は前の手順で作成したociemail.pyを使用します
スクリプトの詳細は以下のようになっています。

下記のコマンドでスクリプトを作成します。


$ vi check_memory_usage_rate.sh

メモリ使用率を計算するスクリプトの内容は以下の通りです。

#!/bin/bash
#
 #名前:check_memory_usage_rate.sh
 #説明:メモリ使用率をチェックし、閾値を超えていた場合メール送信
 #
 #
 #変数設定
 MEMORY_USAGE_THRESHOLD=70
 #物理メモリ容量 取得
 MEMORY_SIZE_TOTAL=free | grep "Mem:" | awk '{print $2}'
 echo "total:${MEMORY_SIZE_TOTAL}"
 #メモリ使用量 取得
 MEMORY_SIZE_USED=free | grep "Mem:" | awk '{print $3}'
 echo "USED:${MEMORY_SIZE_USED}"
 #メモリ使用率を計算
 MEMORY_USAGE=expr 100 "*" ${MEMORY_SIZE_USED} / ${MEMORY_SIZE_TOTAL}
 echo "memory:${MEMORY_USAGE}%"
 #メモリ使用率の判定処理
 if [ ${MEMORY_USAGE} -ge ${MEMORY_USAGE_THRESHOLD} ]; then
     echo "over 70%"
     #echo ${MAIL_BODY} | mail -s ${MAIL_SUBJECT} ${MAIL_TO}
     python ociemail.py
     exit 1
     fi
 exit 0

動作確認(DBCSのメモリ使用率を70%以上にする)

DBCSのメモリ使用率を70%以上にするために負荷をかけるスクリプトを作成します。

このスクリプトは実行後、Enterを押す毎に500MB分の負荷がかかっていきます。
終了する場合は、Ctrl+dを入力します。

下記のコマンドでスクリプトを作成します。


$ vi test-memory.sh

スクリプトの内容は以下の通りです。

#! /bin/bash
# "--bytest 5000000" is 500MB.
echo PID=$$
echo -n "[ Enter : start ] , [ Ctrl+d : stop ]"
c=0
while read byte; do
   eval a$c'=$(head --bytes 5000000 /dev/zero |cat -v)'
   c=$(($c+1))
   echo -n ">"
done
echo

下記のコマンドで負荷をかけるスクリプトを実行することができます。

$ ./test-memory.sh

スクリプトの実行

負荷をかけた後、メモリ使用率を計算するスクリプトを実行します。
下記のコマンドでスクリプトを実行することができます。
※負荷をかけたときに使用したTeratermとは別のTeratermでDBCSにログインしてから作業を行ってください。

$ ./check_memory_usage_rate.sh

実行すると下記の画像のように

  • total:メモリ容量
  • used:メモリ使用量
  • memory:メモリ使用率

が表示され70%を超えた場合にメール送信されます。

70%超えていたのでメールが届いているか確認します。

メールが届いていることが確認できましたので完了となります。


最後に


今回はDBCSのパフォーマンスを収集し、一定の値を超えていた場合にメールでお知らせする設定を行ってみました。
パフォーマンス収集、メール送信、負荷をかけるスクリプトの3つを作成するため作業量が多くなってしましたが、DBCSを監視することができました。
定期的に監視をする場合はcronの登録も併せてご検討ください。
DBCSのパフォーマンス監視でOMC やZabbixなどの監視ソフトウェアが導入できない時は是非試してみてください。