自己紹介
名前:鈴木俊一 (スズキ シュンイチ)
職業:OracleDatabaseのサポート業務
好きなもの:天文、猫、サッカー(アビスパ)、刀(居合)
その他:G's ACADEMY Fukuoka DEV2卒(2018年~2019年)
やりたいこと
OS のリソースデータは長期保存されない。
OS のリソース使用量を定期的に取得してデータベースに格納し、グラフ化する。
⇒OS のメモリ使用量で試してみた。
メリット
定期的に取得したデータの長期間保存ができ、グラフ化して直観的に把握できる。
SQL 文の内容次第で、様々な値を取得できる場合がある。
ターゲット
システム運用されている方。
使ったもの
①Windows のコマンドとタスクスケジューラ
②MySQL
③PHP
④Chart.js
データ取得からグラフ表示までの流れ(概要)
・mem.bat の中でメモリ使用量の値を取得し、年月日と時刻の形式を MySQL で取り込める形に整形する。
・callmem.bat の中で mem.bat を 10 秒間隔で 合計 30 回呼び出す。
・Windows のタスクスケジューラで callmem.bat を呼び出す。
・insert.bat の中で、MySQL のコマンドを使用して CSV のデータを取り込む。
・Windows のタスクスケジューラで 5 分間隔で insert.bat を呼び出す。
・meminfo.php にて Chart.js を使用し、MySQL からデータを取得してグラフ化する。
データ取得からグラフ表示までの流れ(詳細)
1. メモリ使用率データを取得して形式を整形する (mem.bat)
"(PDH-CSV 4.0) (","\\XXXXXXX\Memory\Available MBytes"
"05/17/2022 12:30:43.566","2778"
↓
↓ この形式ではDBに取り込めないため整形。
↓
2行目だけを取ってきてダブルクォーテーションを削除し、年月日をyyyy-mm-dd, 時刻を hh24: mm: ss 形式に整形する。
2022-05-17 12:05:01,2853
2. 10秒間隔で 1 のバッチファイルを呼び出す (callmem.bat)
mem.bat を 10 秒間隔で 30 回、5 分間実行するという処理内容。
for /l %%j in (1,1,30) do (
call %Nowdir%mem.bat
sleep 10
)
3. callmem.bat を Windows のタスクスケジューラで5分間隔で実行する。
4. 取得したメモリ使用量データを 5 分間隔で MySQL に取り込む (insert.bat)
getmem.csv には常にデータが入り続けるので、いったん insert.csv にリネーム。
rename %target_file% %to_file%
CSV ファイルのデータを MySQL にインポートする。
C:\xampp\mysql\bin\mysql.exe -u root --skip-password gsacf_d10_t -e "LOAD DATA INFILE 'C:\\xampp\\htdocs\\insert.csv' INTO TABLE meminfo FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'"
5. meminfo.php にアクセスして使用量がどのくらいか確認する
・デフォルトは直近 1 時間のグラフを表示。
・これ以外に、「直近6時間」「直近1日間」「直近7日間」というボタンを作って、それぞれの期間のメモリ使用量を表示できるようにしている。
ポイント①
MySQL から取得した日付データとメモリ使用量を PHP の配列に格納し、Chart.js でのグラフ作成で使用した。
日付データは、x軸のラベルに使用している。
ポイント②
「直近6時間」「直近1日間」「直近7日間」のグラフを表示する際は、PHP の POST の機能を使用して、再度 meminfo.php に飛ばしている。
POST した際の name によって、実行する SQL 文の内容を変えている。
ハマったところ
CSV のデータを MySQL に取り込むコマンドづくりに手間取った
MySQLのマニュアルにもきちんと書かれていなかったので、実際に実行してみてコマンドを組み立てた。
mem.bat と callmem.bat を 1 つのファイルで実行しようとしたがきなかった
遅延環境変数問題 というようなものがあって、Windows のバッチファイルで if 文や for 文の中で使われている変数が想定していた挙動にならないという状況に。
下記の(例)の場合、こんな感じに。
・想定:for 文に入って順番に処理が実行されて変数に結果がセットされる。
・実際:for 文に入ってすぐに変数に内容がセットされる。
「setlocal ENABLEDELAYEDEXPANSION」を書いて、変数を「!」で囲むと該当行実行時の結果が入るようにできる機能がある。
しかし、なぜかこの機能を使ってもやりたいことができるようにならず。。
ということで、mem.bat と callmem.bat に分けた。
for /l %%j in (1,1,30) do (
typeperf -sc 1 -si 1 -o %target_file% -y "\Memory\Available MBytes"
for /f "tokens=* skip=1" %%i in (%target_file%) do (
set str1=%%i
echo %str1%
)
set y=%str1:~7,4%
echo %y%
set m=%str1:~1,2%
echo %m%
set d=%str1:~4,2%
echo %d%
set hms=%str1:~12,8%
echo %hms%
set mem=%str1:~27,4%
echo %mem%
set data=%y%-%m%-%d% %hms%,%mem%
echo %data% >> %writen_file%
sleep 10
)
参考:遅延環境変数
Linuxでやる場合
・MySQL はインストールメディアに標準で含まれているので、追加導入する。
・bat ファイルの代わりに sh (スクリプト)で実行する。
・スクリプトの定期的な実行は cron で行う。
・メモリ使用量は free コマンドを実行して取得する。