😺

Pythonを使用したCPUとメモリ使用率のリアルタイムグラフ表示

2023/04/22に公開

はじめに

本記事では、Pythonのpsutilとmatplotlibライブラリを使って、リアルタイムでCPUとメモリ使用率をグラフに表示する方法を解説します。

概要

以下、コード全文です。

import psutil
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation


# 描画関数
def update(frame):
    x.append(frame)
    cpu_percent = psutil.cpu_percent()
    mem_percent = psutil.virtual_memory().percent

    cpu_data.append(cpu_percent)
    mem_data.append(mem_percent)

    ax1.plot(x, cpu_data, color='r', linewidth=2)
    ax2.plot(x, mem_data, color='b', linewidth=2)

    if len(x) > 50:
        x.pop(0)
        cpu_data.pop(0)
        mem_data.pop(0)
        ax1.set_xlim(x[0], x[-1])
        ax2.set_xlim(x[0], x[-1])

    plt.tight_layout()


if __name__ == '__main__':
    # 初期化
    fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(10, 6))
    ax1.set_ylim(0, 100)
    ax1.set_title("CPU Usage (%)")
    ax2.set_ylim(0, 100)
    ax2.set_title("Memory Usage (%)")

    x = []
    cpu_data = []
    mem_data = []

    # グラフ表示
    ani = FuncAnimation(fig, update, interval=1000)
    plt.show()

実行すると、このようにグラフが表示されます。

1. 必要なライブラリのインストールとインポート

まず、psutilが入っていない場合はインストールします。

pip install plotly dash psutil

コード内でpsutilmatplotlibライブラリをインポートします。psutilはシステムリソースの情報を取得するために使用し、matplotlibはデータをグラフに表示するために使用します。

import psutil
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

2. 描画関数の定義

次に、リアルタイムでグラフを更新するための描画関数updateを定義します。この関数は、FuncAnimationオブジェクトによって繰り返し呼び出され、グラフをリアルタイムで更新します。

def update(frame):
    x.append(frame)
    cpu_percent = psutil.cpu_percent()
    mem_percent = psutil.virtual_memory().percent

    cpu_data.append(cpu_percent)
    mem_data.append(mem_percent)

    ax1.plot(x, cpu_data, color='r', linewidth=2)
    ax2.plot(x, mem_data, color='b', linewidth=2)

    if len(x) > 30:
        x.pop(0)
        cpu_data.pop(0)
        mem_data.pop(0)
        ax1.set_xlim(x[0], x[-1])
        ax2.set_xlim(x[0], x[-1])

    plt.tight_layout()

描画関数では、次の処理が行われます。

  • CPU使用率とメモリ使用率を取得
  • 使用率データをリストに追加
  • ax1およびax2のグラフオブジェクトに新しいデータをプロット
  • データポイントの数が30を超えた場合、古いデータを削除し、表示範囲を更新
  • plt.tight_layout()を使用して、グラフのレイアウトを自動調整

3. グラフの初期化と表示

最後に、グラフの初期化と表示を行います。ここでは、plt.subplots()関数を使用して、2つのサブプロット(CPU使用率とメモリ使用率)を作成します。また、それぞれのサブプロットのy軸の範囲とタイトルを設定します。

if __name__ == '__main__':
    fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(10, 6))
    ax1.set_ylim(0, 100)
    ax1.set_title("CPU Usage (%)")
    ax2.set_ylim(

    0, 100)
    ax2.set_title("Memory Usage (%)")

    x = []
    cpu_data = []
    mem_data = []

xリストは、フレーム(時間)を格納するために使用されます。cpu_dataおよびmem_dataリストは、それぞれCPU使用率とメモリ使用率のデータを格納するために使用されます。

    ani = FuncAnimation(fig, update, interval=1000)
    plt.show()

FuncAnimationオブジェクトは、fig(グラフオブジェクト)とupdate(描画関数)を引数として受け取り、intervalパラメータで指定したミリ秒間隔で描画関数を繰り返し実行します。この例では、interval=1000と指定しているため、描画関数は1秒ごとに実行されます。

最後に、plt.show()を使用してグラフを表示します。これにより、リアルタイムで更新されるCPUとメモリ使用率のグラフが表示されます。

おわりに

かんたんですね。難しいところはpsutilとmatplotlibが全部やってくれます。個人的には、データを取得してグラフィカルな描画をするといった処理は、選択肢としてPython一択な気がしています。

Discussion