はじめに
この記事はMetabaseというビジネスBIツールを使ってMacの負荷状況を可視化してみようという内容になります.
ちなみに,僕はmacを普段使っていて性能監視をしたいなと思って作り始めました.
目次
- Metabase導入
- クライアント側で負荷状況をデータベースに書き込み
- 可視化する
##1,導入環境とMetaBase導入について
導入環境
クライアント側
- MacBook Air 2020 (intelモデル)メモリ16GB
- python3.8
サーバ側
- AWS EC2
- MySQL AWS EC2 on RDB(Docker)
※今回DBをAWS EC2 on RDBを使う理由は,AWS RDBを使うよりもコスト削減につながるからです.別にAWS RDBを利用しても問題ありません.
Metabase導入
サーバ側
①EC2上にjava環境がない場合にはjava環境を導入する.
$yum install java-1.8.0-openjdk
$yum install java-1.8.0-openjdk-devel
②metabase.jarのインストール
今回は,Metabaseをjarファイルを使って導入していきます
URL:https://www.metabase.com/start/oss/jar
サーバの適当なディレクトリにおく.
[Unit]
Description=Metabase server
After=syslog.target network.target
[Service]
User=root
Type=simple
WorkingDirectory=/var/test
ExecStart=/usr/bin/java -jar /hoge/hoge/metabase.jar
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=metabase
SuccessExitStatus=143
TimeoutStopSec=120
Restart=always
[Install]
WantedBy=multi-user.target
③dockerでmysqlを作る
version: '3'
services:
# MySQL
db:
image: mysql:5.7
container_name: mysql_host
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_database
MYSQL_USER: docker
MYSQL_PASSWORD: docker
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./docker/db/data:/var/lib/mysql
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
- ./docker/db/sql:/docker-entrypoint-initdb.d
ports:
- 3306:3306
# phpMyAdmin
phpmyadmin:
container_name: test_phpmyadmin
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOSTS=mysql_host
- PMA_USER=root
- PMA_PASSWORD=root
ports:
- 8080:80
クライアント側
クライアント側で負荷状況をデータベースに書き込み
GitHub:https://github.com/S-mishina/server-monitoring
''' server-monitoring'''
from concurrent.futures import ThreadPoolExecutor
import sys
import time
import datetime
import psutil
import pymysql
import schedule
import daemon
#import select_monitoring
dc = daemon.DaemonContext(stdout=sys.stdout)
def hiki():
'''
秒数指定関数
'''
p_h1 = sys.argv
if(len(sys.argv) <= 1):
print('デフォルト60秒になります.')
hikisu = 60
return hikisu
else:
hikisu = int(p_h1[1])
print(hikisu)
return hikisu
def db_connect():
'''
データベース設定
'''
con = pymysql.connect(
host='127.0.0.1',
user='root',
password='root',
db='test',
port= 3306,
charset='utf8',
cursorclass=pymysql.cursors.DictCursor,
)
return con
def job():
'''
jobの設定
例えば,データベースを消去するとか...
'''
print(datetime.datetime.now())
print("プログラムを実行します.")
#select_monitoring.select()
def job1():
'''
jobの設定
例えば,データベースを消去するとか...
'''
print(datetime.datetime.now())
print("データベース消去を行います")
con=db_connect()
cur = con.cursor()
query="DELETE FROM monitoring;"
cur.execute(query)
con.commit()
cur.close()
con.close()
def Regular():
'''
マルチプロセスである時間の時に処理を行うためのプログラム
'''
schedule.every(1).minutes.do(job)
#schedule.every().day.at("23:59").do(job1)
while True:
schedule.run_pending()
def main():
'''
mainプログラム
'''
while True:
dt_now = datetime.datetime.now()
now_day=dt_now.strftime('%Y年%m月%d日')
print(now_day)
now_time=dt_now.strftime('%H:%M')
mem = psutil.virtual_memory()
mem_used=mem.used
mem_total=mem.total
mem_percent=(mem.used/mem.total)*100
dsk = psutil.disk_usage('/')
dsk_used=dsk.used
dsk_total=dsk.total
cpu=psutil.cpu_percent()
con=db_connect()
cur = con.cursor()
query="INSERT INTO test (now_day,now_time,mem_used,mem_total,dsk_used,dsk_total,cpu,mem_percent) \
VALUES (%s,%s,%s,%s,%s,%s,%s,%s) ;"
cur.execute(query, (now_day,now_time,mem_used,mem_total,dsk_used,dsk_total,cpu,mem_percent))
con.commit()
cur.close()
con.close()
time.sleep(p_stoptime)
with dc:
stop_time=hiki()
p_stoptime= stop_time
#システムのマルチプロセス化とデーモン化
executor = ThreadPoolExecutor(max_workers=2)
executor.submit(main)
executor.submit(Regular)
##実際にMetabaseで見てみる
CPUとメモリの使用率を可視化してみる.
メモリ使用状況(生データ)を可視化する.
最終的なダッシュボード
最後に
今回は,Metabaseを使って,Macbook air の性能監視を行ってみました.
普段アクティビティモニタを使って定期的に監視している方はこちら導入して使ってみるのもありかなと思いますので
ぜひご検討いただけると幸いです.
おまけ
アクティビティモニタと性能監視プログラムの比較
僕のPCで見ると,アクティビティモニタはメモリを92.8MB使用しています.
対して,性能監視プログラムは,6.7MB
ということで,メモリやCPUの使用状況を見るだけならばアクティビティモニタよりメモリ使用量については優位性があるかもしれません.