[Python] プロセスが使用中のCPU使用率を取得・監視する方法

PythonでプロセスのCPU使用率を取得・監視するには、psutilライブラリを使用するのが一般的です。

psutilはシステムのプロセスやリソースの情報を取得するためのライブラリで、psutil.Process(pid)を使って特定のプロセスを指定し、そのプロセスのcpu_percent(interval)メソッドでCPU使用率を取得できます。

intervalは計測間隔を秒単位で指定します。

psutil.cpu_percent(interval)を使えば、システム全体のCPU使用率も取得可能です。

この記事でわかること
  • PythonでCPU使用率を取得する方法
  • psutilライブラリの基本的な使い方
  • CPU使用率の監視とアクションの実装
  • 複数プロセスのCPU使用率の取得方法
  • CPU使用率に基づく応用例の紹介

目次から探す

プロセスのCPU使用率を取得する方法

psutilライブラリとは

psutilは、Pythonでシステムのプロセスやシステム情報を取得するためのライブラリです。

CPU、メモリ、ディスク、ネットワークなどの情報を簡単に取得できるため、システム監視やパフォーマンス分析に非常に便利です。

特に、プロセスのCPU使用率を取得する機能が充実しています。

psutilのインストール方法

psutilライブラリは、Pythonのパッケージ管理ツールであるpipを使用して簡単にインストールできます。

以下のコマンドを実行してください。

pip install psutil

プロセスのCPU使用率を取得する基本的なコード

以下のコードは、現在のプロセスのCPU使用率を取得する基本的な方法を示しています。

import psutil
import time
# CPU使用率を取得する
cpu_usage = psutil.cpu_percent(interval=1)
print(f"CPU使用率: {cpu_usage}%")

実行結果は以下のようになります。

CPU使用率: 12.5%

このコードでは、cpu_percent()メソッドを使用して、1秒間隔でCPU使用率を取得しています。

cpu_percent()メソッドの使い方

cpu_percent(interval=None)メソッドは、指定した時間間隔でCPUの使用率を計測します。

引数intervalに秒数を指定することで、その間にCPUの使用率を計測します。

引数を指定しない場合、直前の計測結果を返します。

import psutil
# CPU使用率を取得する
cpu_usage = psutil.cpu_percent()
print(f"CPU使用率: {cpu_usage}%")

ただし、水クリプトの実行直後に行ってしまうと正しくCPU使用率を取得できず、実行結果は以下のようになります。

CPU使用率: 0.0%

少し経った後なら取得できるため、interval=1time.sleep(1)などで少し遅延するなどの工夫が必要です。

プロセスID(PID)を指定してCPU使用率を取得する方法

特定のプロセスのCPU使用率を取得するには、プロセスID(PID)を指定してProcessオブジェクトを作成します。

以下のコードは、PIDを指定してCPU使用率を取得する方法を示しています。

import psutil
# プロセスIDを指定
pid = 1234  # 例: 1234を実際のPIDに置き換えてください
process = psutil.Process(pid)
# CPU使用率を取得する
cpu_usage = process.cpu_percent(interval=1)
print(f"プロセスID {pid} のCPU使用率: {cpu_usage}%")

実行結果は以下のようになります。

プロセスID 1234 のCPU使用率: 20.0%

システム全体のCPU使用率を取得する方法

システム全体のCPU使用率を取得するには、cpu_percent()メソッドを引数なしで呼び出します。

以下のコードは、システム全体のCPU使用率を取得する方法を示しています。

import psutil
# システム全体のCPU使用率を取得する
cpu_usage = psutil.cpu_percent(interval=1)
print(f"システム全体のCPU使用率: {cpu_usage}%")

実行結果は以下のようになります。

システム全体のCPU使用率: 18.0%

このように、psutilライブラリを使用することで、簡単にプロセスやシステム全体のCPU使用率を取得することができます。

CPU使用率の監視方法

定期的にCPU使用率を監視する方法

CPU使用率を定期的に監視するためには、一定の間隔でCPU使用率を取得し、表示する方法が一般的です。

これにより、システムのパフォーマンスを把握しやすくなります。

以下の方法で、定期的にCPU使用率を監視することができます。

time.sleep()を使った簡単な監視コード

time.sleep()を使用して、指定した間隔でCPU使用率を取得する簡単な監視コードを作成できます。

以下のコードは、5秒ごとにCPU使用率を表示します。

import psutil
import time
# 5秒ごとにCPU使用率を監視する
while True:
    cpu_usage = psutil.cpu_percent(interval=1)
    print(f"CPU使用率: {cpu_usage}%")
    time.sleep(5)  # 5秒待機

このコードを実行すると、5秒ごとにCPU使用率が表示されます。

whileループを使ったリアルタイム監視

whileループを使用することで、リアルタイムでCPU使用率を監視することができます。

以下のコードは、CPU使用率を継続的に表示し続ける例です。

import psutil
import time
# リアルタイムでCPU使用率を監視する
try:
    while True:
        cpu_usage = psutil.cpu_percent(interval=1)
        print(f"CPU使用率: {cpu_usage}%")
except KeyboardInterrupt:
    print("監視を終了しました。")

このコードは、ユーザーがCtrl+Cを押すまでCPU使用率を表示し続けます。

CPU使用率の履歴を記録する方法

CPU使用率の履歴を記録するには、取得したデータをリストやファイルに保存する方法があります。

以下のコードは、CPU使用率をリストに記録する例です。

import psutil
import time
cpu_history = []  # CPU使用率の履歴を保存するリスト
# 10回の監視を行う
for _ in range(10):
    cpu_usage = psutil.cpu_percent(interval=1)
    cpu_history.append(cpu_usage)
    print(f"CPU使用率: {cpu_usage}%")
# 履歴を表示
print("CPU使用率の履歴:", cpu_history)

このコードでは、10回の監視を行い、その結果をリストに保存しています。

CPU使用率の変動をグラフ化する方法

CPU使用率の変動を視覚的に把握するために、グラフ化することが有効です。

matplotlibライブラリを使用して、CPU使用率の履歴をグラフ化することができます。

以下のコードは、CPU使用率をグラフ化する例です。

import psutil
import time
import matplotlib.pyplot as plt
cpu_history = []  # CPU使用率の履歴を保存するリスト
# 10回の監視を行う
for _ in range(10):
    cpu_usage = psutil.cpu_percent(interval=1)
    cpu_history.append(cpu_usage)
    print(f"CPU使用率: {cpu_usage}%")
# グラフを描画
plt.plot(cpu_history, marker='o')
plt.title("CPU使用率の変動")
plt.xlabel("監視回数")
plt.ylabel("CPU使用率 (%)")
plt.grid()
plt.show()

このコードを実行すると、CPU使用率の変動を示すグラフが表示されます。

matplotlibを使用することで、データを視覚的に分析することが可能です。

複数プロセスのCPU使用率を取得する方法

全プロセスのCPU使用率を取得する方法

全プロセスのCPU使用率を取得するには、psutil.process_iter()メソッドを使用して、すべてのプロセスを反復処理し、それぞれのCPU使用率を取得します。

以下のコードは、全プロセスのCPU使用率を表示する例です。

import psutil
# 全プロセスのCPU使用率を取得する
for process in psutil.process_iter(['pid', 'name', 'cpu_percent']):
    try:
        cpu_usage = process.cpu_percent(interval=1)
        print(f"プロセスID: {process.info['pid']}, 名前: {process.info['name']}, CPU使用率: {cpu_usage}%")
    except (psutil.NoSuchProcess, psutil.AccessDenied):
        continue

このコードを実行すると、すべてのプロセスのID、名前、CPU使用率が表示されます。

AccessDeniedエラーが発生する場合もあるため、例外処理を行っています。

特定のプロセスグループのCPU使用率を取得する方法

特定のプロセスグループのCPU使用率を取得するには、プロセス名や条件を指定してフィルタリングします。

以下のコードは、特定のプロセス名(例: “python”)のCPU使用率を取得する例です。

import psutil
# 特定のプロセス名のCPU使用率を取得する
process_name = "python"  # 監視したいプロセス名
for process in psutil.process_iter(['pid', 'name', 'cpu_percent']):
    if process.info['name'] == process_name:
        try:
            cpu_usage = process.cpu_percent(interval=1)
            print(f"プロセスID: {process.info['pid']}, 名前: {process.info['name']}, CPU使用率: {cpu_usage}%")
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            continue

このコードでは、指定したプロセス名に一致するプロセスのCPU使用率を取得しています。

複数プロセスのCPU使用率を同時に監視する方法

複数のプロセスのCPU使用率を同時に監視するには、Threadを使用して各プロセスの監視を並行して行うことができます。

以下のコードは、複数のプロセスのCPU使用率を同時に監視する例です。

import psutil
import threading
import time
def monitor_process(pid):
    try:
        process = psutil.Process(pid)
        while True:
            cpu_usage = process.cpu_percent(interval=1)
            print(f"プロセスID: {pid}, CPU使用率: {cpu_usage}%")
    except (psutil.NoSuchProcess, psutil.AccessDenied):
        print(f"プロセスID: {pid} は存在しないか、アクセスが拒否されました。")
# 監視したいプロセスIDのリスト
pids_to_monitor = [1234, 5678]  # 例: 実際のPIDに置き換えてください
# 各プロセスを監視するスレッドを作成
threads = []
for pid in pids_to_monitor:
    thread = threading.Thread(target=monitor_process, args=(pid,))
    threads.append(thread)
    thread.start()
# スレッドの終了を待機
for thread in threads:
    thread.join()

このコードでは、指定したプロセスIDのリストに対して、それぞれのプロセスを監視するスレッドを作成しています。

並列処理を使った効率的な監視方法

multiprocessingモジュールを使用して、並列処理を行うことで、CPU使用率の監視をさらに効率的に行うことができます。

以下のコードは、multiprocessingを使用して複数プロセスのCPU使用率を監視する例です。

import psutil
from multiprocessing import Process
import time
def monitor_process(pid):
    try:
        process = psutil.Process(pid)
        while True:
            cpu_usage = process.cpu_percent(interval=1)
            print(f"プロセスID: {pid}, CPU使用率: {cpu_usage}%")
    except (psutil.NoSuchProcess, psutil.AccessDenied):
        print(f"プロセスID: {pid} は存在しないか、アクセスが拒否されました。")
# 監視したいプロセスIDのリスト
pids_to_monitor = [1234, 5678]  # 例: 実際のPIDに置き換えてください
# 各プロセスを監視するプロセスを作成
processes = []

if __name__ == "__main__":
    for pid in pids_to_monitor:
        process = Process(target=monitor_process, args=(pid,))
        processes.append(process)
        process.start()
    # プロセスの終了を待機
    for process in processes:
        process.join()

このコードでは、multiprocessingを使用して、各プロセスを独立して監視することができます。

これにより、CPU使用率の監視がより効率的に行えるようになります。

応用例:CPU使用率に基づくアクション

CPU使用率が一定以上になった場合にアラートを出す方法

CPU使用率が一定の閾値を超えた場合にアラートを出すことで、システムの異常を早期に検知できます。

以下のコードは、CPU使用率が80%を超えた場合にアラートを表示する例です。

import psutil
import time
# CPU使用率の閾値
threshold = 80.0
while True:
    cpu_usage = psutil.cpu_percent(interval=1)
    if cpu_usage > threshold:
        print(f"アラート: CPU使用率が{cpu_usage}%に達しました!")
    time.sleep(5)  # 5秒待機

このコードを実行すると、CPU使用率が80%を超えた場合にアラートが表示されます。

CPU使用率が高いプロセスを自動的に終了させる方法

CPU使用率が高いプロセスを自動的に終了させることで、システムの安定性を保つことができます。

以下のコードは、CPU使用率が90%を超えるプロセスを終了させる例です。

import psutil
# CPU使用率の閾値
threshold = 90.0
for process in psutil.process_iter(['pid', 'name', 'cpu_percent']):
    try:
        cpu_usage = process.cpu_percent(interval=1)
        if cpu_usage > threshold:
            print(f"プロセスID: {process.info['pid']} ({process.info['name']}) を終了します。")
            process.terminate()  # プロセスを終了
    except (psutil.NoSuchProcess, psutil.AccessDenied):
        continue

このコードでは、CPU使用率が90%を超えるプロセスを自動的に終了させます。

CPU使用率に応じてプロセスの優先度を変更する方法

CPU使用率に応じてプロセスの優先度を変更することで、システムのパフォーマンスを最適化できます。

以下のコードは、CPU使用率が高いプロセスの優先度を下げる例です。

import psutil
# CPU使用率の閾値
threshold = 80.0
for process in psutil.process_iter(['pid', 'name', 'cpu_percent']):
    try:
        cpu_usage = process.cpu_percent(interval=1)
        if cpu_usage > threshold:
            print(f"プロセスID: {process.info['pid']} ({process.info['name']}) の優先度を下げます。")
            process.nice(psutil.BELOW_NORMAL_PRIORITY_CLASS)  # 優先度を下げる
    except (psutil.NoSuchProcess, psutil.AccessDenied):
        continue

このコードでは、CPU使用率が80%を超えるプロセスの優先度を下げています。

CPU使用率をログファイルに記録する方法

CPU使用率をログファイルに記録することで、後から分析することができます。

以下のコードは、CPU使用率をログファイルに記録する例です。

import psutil
import time
# ログファイルのパス
log_file_path = "cpu_usage_log.txt"
# ログファイルにCPU使用率を記録する
with open(log_file_path, 'a') as log_file:
    while True:
        cpu_usage = psutil.cpu_percent(interval=1)
        log_file.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - CPU使用率: {cpu_usage}%\n")
        time.sleep(5)  # 5秒待機

このコードを実行すると、CPU使用率が5秒ごとにログファイルに記録されます。

CPU使用率をリアルタイムでWebダッシュボードに表示する方法

CPU使用率をリアルタイムでWebダッシュボードに表示するには、FlaskなどのWebフレームワークを使用します。

以下のコードは、Flaskを使用してCPU使用率を表示する簡単なWebアプリケーションの例です。

from flask import Flask, jsonify
import psutil
app = Flask(__name__)
@app.route('/cpu_usage')
def cpu_usage():
    usage = psutil.cpu_percent(interval=1)
    return jsonify(cpu_usage=usage)
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

このコードを実行すると、http://localhost:5000/cpu_usageにアクセスすることで、リアルタイムのCPU使用率をJSON形式で取得できます。

Webダッシュボードを作成する際には、フロントエンドの技術を使用して、視覚的に表示することができます。

よくある質問

psutilがインストールできない場合はどうすればいいですか?

psutilがインストールできない場合、以下の点を確認してください。

  • Pythonのバージョン: psutilはPython 2.6以降で動作します。

Pythonのバージョンが古い場合は、最新のバージョンにアップデートしてください。

  • pipのバージョン: pipが古いとインストールに失敗することがあります。

以下のコマンドでpipをアップグレードしてください。

  python -m pip install --upgrade pip
  • 管理者権限: インストール時に権限が不足している場合があります。

管理者権限でコマンドを実行するか、仮想環境を使用してインストールを試みてください。

  • 依存関係: 他のライブラリやパッケージが原因でインストールに失敗することがあります。

エラーメッセージを確認し、必要な依存関係を手動でインストールしてください。

cpu_percent()が常に0を返すのはなぜですか?

cpu_percent()が常に0を返す場合、以下の理由が考えられます。

  • intervalの指定: cpu_percent()メソッドのinterval引数を指定しない場合、直前の計測結果を返します。

初回の呼び出しでは、CPU使用率が計測されていないため0が返されることがあります。

最初の呼び出しではintervalを1秒以上に設定して、次回の呼び出しで正しい値を取得してください。

  • プロセスの状態: 監視対象のプロセスがアイドル状態である場合、CPU使用率が0%になることがあります。

プロセスがアクティブな状態であることを確認してください。

  • システムの負荷: システム全体の負荷が非常に低い場合、CPU使用率が0%または非常に低い値になることがあります。

負荷をかけるタスクを実行してから再度確認してください。

複数のCPUコアがある場合、どのようにCPU使用率を取得しますか?

複数のCPUコアがある場合、psutilを使用して各コアのCPU使用率を個別に取得することができます。

以下の方法で、各コアの使用率を取得できます。

  • 全コアの使用率を取得: psutil.cpu_percent(percpu=True)を使用すると、各コアのCPU使用率をリスト形式で取得できます。
  • 特定のコアの使用率を取得: psutil.cpu_percent(interval=1, percpu=True)を使用して、特定のコアの使用率を取得することも可能です。

以下は、全コアのCPU使用率を取得する例です。

import psutil
# 各コアのCPU使用率を取得
cpu_usage_per_core = psutil.cpu_percent(interval=1, percpu=True)
print("各コアのCPU使用率:", cpu_usage_per_core)

このコードを実行すると、各コアのCPU使用率がリスト形式で表示されます。

まとめ

この記事では、Pythonを使用してプロセスのCPU使用率を取得・監視する方法について詳しく解説しました。

具体的には、psutilライブラリを活用して、全プロセスや特定のプロセスのCPU使用率を取得する方法や、CPU使用率に基づいてアクションを実行する応用例を紹介しました。

これらの知識を活用して、システムのパフォーマンスを向上させるための監視ツールを作成してみてください。

  • URLをコピーしました!
目次から探す