概要
性能試験をやっている時に、vmstatコマンドを使用してCPUとメモリの使用率を測定していました。
CPUとメモリの使用率を測定しながら、各値の判定をできないかと思いスクリプトを作成してみました。
本来はLinux環境で実行できるようにしたいのですが、環境が用意できなかったため、Windowsで実行できるようにPowerShellで作成しました。
スクリプト内容
CPUとメモリの使用率が定期的に監視するスクリプトです。
指定された条件が満たされた場合にアラートが表示されます。
CPU使用率を取得する関数、メモリ使用率を取得する関数、ログにデータを追加する関数を作成して、ループ処理で実行するようにしました。
約2秒間隔で監視するようにしています。
スクリプト
# 監視ログファイルのパス
$LOG_FILE = "monitoring_log.txt"
# アラートの閾値
$CPU_THRESHOLD = 100 # CPUが100%になった場合の閾値
$CPU_AVERAGE_THRESHOLD = 60 # CPUの平均使用率が60%を超えた場合の閾値
$MEMORY_AVERAGE_THRESHOLD = 50 # メモリの平均使用率が50%を超えた場合の閾値
# ログにデータを追加する関数
function Log-Data {
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Add-Content -Path $LOG_FILE -Value "$timestamp - CPU: $args[0]%, Memory: $args[1]%"
}
# メインの監視ループ
while ($true) {
$cpu = Get-WmiObject Win32_PerfFormattedData_PerfOS_Processor | Select-Object -ExpandProperty PercentProcessorTime
$cpu_usage = [math]::Round(($cpu | Measure-Object -Average).Average, 2)
$memory = Get-WmiObject Win32_OperatingSystem | Select-Object -ExpandProperty FreePhysicalMemory
$total_memory = Get-WmiObject Win32_OperatingSystem | Select-Object -ExpandProperty TotalVisibleMemorySize
$memory_usage = [math]::Round((($total_memory - $memory) / $total_memory) * 100, 2)
Log-Data $cpu_usage $memory_usage
# CPUが100%の状態が20秒続いた場合、平均でCPU使用率が60%を超えた場合、メモリ使用率が50%を超えた場合にアラートを表示
if ($cpu_usage -ge $CPU_THRESHOLD) {
Write-Host "CPU is at 100% for 20 seconds."
}
elseif ($cpu_usage -ge $CPU_AVERAGE_THRESHOLD) {
Write-Host "Average CPU usage is above 60%."
}
elseif ($memory_usage -ge $MEMORY_AVERAGE_THRESHOLD) {
Write-Host "Average memory usage is above 50%."
}
Start-Sleep -Seconds 1 # 1秒待機してから再度監視
}
実行結果
PowerShellの起動画面には、以下のように出力されます。
Average memory usage is above 50%.
Average memory usage is above 50%.
Average memory usage is above 50%.
ログファイルの出力内容
2024-03-31 21:25:43 - CPU: 1.31 61.04[0]%, Memory: 1.31 61.04[1]%
2024-03-31 21:25:44 - CPU: 8.54 61.4[0]%, Memory: 8.54 61.4[1]%
2024-03-31 21:25:46 - CPU: 6.54 61.45[0]%, Memory: 6.54 61.45[1]%
2024-03-31 21:25:47 - CPU: 9.92 61.36[0]%, Memory: 9.92 61.36[1]%
2024-03-31 21:25:49 - CPU: 7.69 61.2[0]%, Memory: 7.69 61.2[1]%
結果
CPUとメモリの使用率を監視するログファイルを取得できるところまではできました。
改善点は測定の間隔をsleapで管理しているため、ログファイルを見ると出力時間が一定間隔ではありませんでした。別の方法で管理するか修正が必要です。
次はLinuxで実行できるものを作成しようと思います。