[Python] プロセスのメモリ使用量を取得・監視する方法

Pythonでプロセスのメモリ使用量を取得・監視するには、psutilライブラリが便利です。

psutilはシステムのプロセスやリソースの情報を取得できるライブラリで、psutil.Process(pid)を使って特定のプロセスのメモリ使用量を取得できます。

例えば、memory_info()メソッドを使うと、RSS(Resident Set Size)やVMS(Virtual Memory Size)などのメモリ情報が得られます。

psutilはクロスプラットフォーム対応で、WindowsやLinuxでも動作します。

この記事でわかること
  • psutilライブラリの基本的な使い方
  • プロセスのメモリ使用量の取得方法
  • メモリ使用量の監視と可視化手法
  • 複数プロセスのメモリ使用量の集計
  • 応用例としての実践的なスクリプト

目次から探す

psutilライブラリの概要

psutilとは?

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

CPU、メモリ、ディスク、ネットワークなどのリソースの使用状況を監視することができ、特にプロセスのメモリ使用量を取得するのに便利です。

クロスプラットフォームで動作し、Linux、Windows、macOSなどのオペレーティングシステムで利用可能です。

psutilのインストール方法

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

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

pip install psutil

このコマンドを実行することで、psutilライブラリがインストールされ、すぐに使用できるようになります。

psutilでできること

psutilを使用することで、以下のような情報を取得できます。

スクロールできます
機能説明
プロセス情報の取得実行中のプロセスのリストや詳細情報を取得
CPU使用率の監視CPUの使用率やコアごとの使用状況を取得
メモリ使用量の取得システム全体や特定プロセスのメモリ使用量を取得
ディスク使用状況の監視ディスクの使用状況やパーティション情報を取得
ネットワーク情報の取得ネットワークインターフェースの情報やトラフィックを取得

これにより、システムのパフォーマンスを監視したり、リソースの使用状況を分析したりすることが可能です。

プロセスのメモリ使用量を取得する方法

プロセスID(PID)の取得方法

プロセスID(PID)は、オペレーティングシステムが各プロセスに割り当てる一意の識別子です。

psutilを使用して、実行中のプロセスのPIDを取得することができます。

以下のコードは、すべてのプロセスのPIDをリスト表示する例です。

import psutil
# 実行中のすべてのプロセスのPIDを取得
process_ids = [proc.pid for proc in psutil.process_iter()]
print(process_ids)

出力結果は、実行中のプロセスのPIDのリストになります。

[1, 2, 3, ...]

psutil.Processクラスの使い方

psutil.Processクラスを使用すると、特定のプロセスに関する詳細情報を取得できます。

PIDを指定してインスタンスを作成し、さまざまなメソッドを使用して情報を取得します。

以下は、特定のPIDのプロセス情報を取得する例です。

import psutil
# 特定のPIDを指定
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
# プロセス名を取得
process_name = process.name()
print(f"プロセス名: {process_name}")

出力結果は、指定したPIDのプロセス名になります。

プロセス名: System Idle Process

memory_info()メソッドの詳細

memory_info()メソッドを使用すると、プロセスのメモリ使用量に関する詳細情報を取得できます。

このメソッドは、RSS(Resident Set Size)やVMS(Virtual Memory Size)などの情報を含むオブジェクトを返します。

以下は、memory_info()メソッドを使用した例です。

import psutil
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
# メモリ情報を取得
memory_info = process.memory_info()
print(f"RSS: {memory_info.rss}, VMS: {memory_info.vms}")

出力結果は、RSSとVMSの値になります。

RSS: 12345678, VMS: 23456789

RSS(Resident Set Size)とは?

RSS(Resident Set Size)は、プロセスが物理メモリに占有しているメモリのサイズを示します。

これは、プロセスが実際に使用しているメモリ量であり、スワップアウトされていないページの合計です。

RSSは、プロセスのメモリ使用量を評価する際に重要な指標です。

VMS(Virtual Memory Size)とは?

VMS(Virtual Memory Size)は、プロセスが使用している仮想メモリの総量を示します。

これは、プロセスがアクセス可能なメモリ空間のサイズであり、物理メモリだけでなく、スワップ領域やファイルマッピングも含まれます。

VMSは、プロセスがどれだけのメモリを要求しているかを示す指標です。

メモリ使用量の単位変換(バイトからMB、GBへ)

メモリ使用量は通常、バイト単位で表示されますが、より理解しやすくするためにMB(メガバイト)やGB(ギガバイト)に変換することがよくあります。

以下は、バイトからMB、GBへの変換方法です。

  • 1 MB = 1024 × 1024 バイト
  • 1 GB = 1024 × 1024 × 1024 バイト

以下のコードは、バイトをMBおよびGBに変換する例です。

def convert_bytes(size_bytes):
    size_mb = size_bytes / (1024 * 1024)
    size_gb = size_bytes / (1024 * 1024 * 1024)
    return size_mb, size_gb
# 例としてバイト数を指定
bytes_value = 10485760  # 10 MB
mb, gb = convert_bytes(bytes_value)
print(f"{bytes_value} バイトは {mb} MB, {gb} GBです。")

出力結果は、バイト数のMBおよびGBへの変換結果になります。

10485760 バイトは 10.0 MB, 0.009313225746154785 GBです。

メモリ使用量の監視方法

メモリ使用量の定期的な取得

メモリ使用量を定期的に取得することで、プロセスのパフォーマンスを監視できます。

psutilを使用して、特定のプロセスのメモリ使用量を定期的に取得する方法を以下に示します。

import psutil
import time
# 監視するプロセスのPIDを指定
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
# 定期的にメモリ使用量を取得
while True:
    memory_info = process.memory_info()
    print(f"RSS: {memory_info.rss}, VMS: {memory_info.vms}")
    time.sleep(5)  # 5秒ごとに取得

このコードは、指定したプロセスのRSSとVMSを5秒ごとに取得し、表示します。

time.sleep()を使った監視の実装

time.sleep()を使用することで、指定した間隔でメモリ使用量を取得することができます。

上記の例でも使用していますが、以下にもう一度具体的な実装を示します。

import psutil
import time
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
# メモリ使用量を監視する関数
def monitor_memory(process):
    while True:
        memory_info = process.memory_info()
        print(f"RSS: {memory_info.rss}, VMS: {memory_info.vms}")
        time.sleep(5)  # 5秒ごとに取得
# メモリ監視を開始
monitor_memory(process)

この関数を呼び出すことで、指定したプロセスのメモリ使用量を定期的に監視できます。

メモリ使用量の変化をログに記録する方法

メモリ使用量の変化をログに記録することで、後から分析することが可能です。

以下のコードは、メモリ使用量をファイルに記録する例です。

import psutil
import time
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
# ログファイルを開く
with open("memory_log.txt", "a") as log_file:
    while True:
        memory_info = process.memory_info()
        log_entry = f"RSS: {memory_info.rss}, VMS: {memory_info.vms}\n"
        log_file.write(log_entry)  # ログに記録
        print(log_entry.strip())  # コンソールにも表示
        time.sleep(5)  # 5秒ごとに取得

このコードは、メモリ使用量をmemory_log.txtというファイルに追記し、同時にコンソールにも表示します。

メモリ使用量の閾値を設定してアラートを出す方法

特定のメモリ使用量を超えた場合にアラートを出すことで、リソースの過剰使用を防ぐことができます。

以下のコードは、RSSが特定の閾値を超えた場合にアラートを表示する例です。

import psutil
import time
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
threshold = 100 * 1024 * 1024  # 100 MBの閾値
while True:
    memory_info = process.memory_info()
    if memory_info.rss > threshold:
        print(f"アラート: RSSが閾値を超えました! 現在のRSS: {memory_info.rss}")
    time.sleep(5)  # 5秒ごとに取得

このコードは、RSSが100MBを超えた場合にアラートメッセージを表示します。

これにより、メモリ使用量が過剰になった際に迅速に対応できます。

複数プロセスのメモリ使用量を取得する方法

全プロセスのメモリ使用量を取得する方法

psutilを使用すると、システム上で実行中のすべてのプロセスのメモリ使用量を簡単に取得できます。

以下のコードは、全プロセスのRSSとVMSをリスト表示する例です。

import psutil
# 全プロセスのメモリ使用量を取得
for proc in psutil.process_iter(['pid', 'name', 'memory_info']):
    print(f"PID: {proc.info['pid']}, プロセス名: {proc.info['name']}, RSS: {proc.info['memory_info'].rss}, VMS: {proc.info['memory_info'].vms}")

このコードは、各プロセスのPID、プロセス名、RSS、VMSを表示します。

これにより、システム上のすべてのプロセスのメモリ使用状況を把握できます。

特定の条件でフィルタリングする方法

特定の条件に基づいてプロセスをフィルタリングすることで、必要な情報を効率的に取得できます。

以下の例では、RSSが100MBを超えるプロセスのみを表示します。

import psutil
# RSSが100MBを超えるプロセスをフィルタリング
threshold = 100 * 1024 * 1024  # 100 MB
for proc in psutil.process_iter(['pid', 'name', 'memory_info']):
    if proc.info['memory_info'].rss > threshold:
        print(f"PID: {proc.info['pid']}, プロセス名: {proc.info['name']}, RSS: {proc.info['memory_info'].rss}, VMS: {proc.info['memory_info'].vms}")

このコードは、RSSが100MBを超えるプロセスのみを表示し、リソースを多く消費しているプロセスを特定するのに役立ちます。

複数プロセスのメモリ使用量を集計する方法

複数のプロセスのメモリ使用量を集計することで、システム全体のリソース使用状況を把握できます。

以下のコードは、全プロセスのRSSとVMSを合計する例です。

import psutil
total_rss = 0
total_vms = 0
# 全プロセスのメモリ使用量を集計
for proc in psutil.process_iter(['memory_info']):
    total_rss += proc.info['memory_info'].rss
    total_vms += proc.info['memory_info'].vms
print(f"合計RSS: {total_rss}, 合計VMS: {total_vms}")

このコードは、全プロセスのRSSとVMSを合計し、システム全体のメモリ使用量を表示します。

これにより、リソースの使用状況を把握し、必要に応じて最適化を行うことができます。

メモリ使用量の可視化

matplotlibを使ったグラフ化

matplotlibを使用すると、メモリ使用量を視覚的に表現することができます。

以下のコードは、特定のプロセスのRSSとVMSをグラフ化する例です。

まず、matplotlibをインストールしておく必要があります。

pip install matplotlib

次に、以下のコードを実行して、プロセスのメモリ使用量をグラフ化します。

import psutil
import matplotlib.pyplot as plt
import time
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
rss_values = []
vms_values = []
timestamps = []
# メモリ使用量を取得してグラフ化
for _ in range(10):  # 10回取得
    memory_info = process.memory_info()
    rss_values.append(memory_info.rss)
    vms_values.append(memory_info.vms)
    timestamps.append(time.time())
    time.sleep(1)  # 1秒ごとに取得
# グラフの描画
plt.plot(timestamps, rss_values, label='RSS', color='blue')
plt.plot(timestamps, vms_values, label='VMS', color='orange')
plt.xlabel('時間 (秒)')
plt.ylabel('メモリ使用量 (バイト)')
plt.title('プロセスのメモリ使用量')
plt.legend()
plt.show()

このコードは、指定したプロセスのRSSとVMSを1秒ごとに取得し、グラフとして表示します。

時間に対するメモリ使用量の変化を視覚的に確認できます。

メモリ使用量の推移をリアルタイムで表示する方法

リアルタイムでメモリ使用量の推移を表示するには、matplotlibFuncAnimationを使用します。

以下のコードは、リアルタイムでメモリ使用量を更新する例です。

import psutil
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
rss_values = []
vms_values = []
# グラフの初期設定
fig, ax = plt.subplots()
line_rss, = ax.plot([], [], label='RSS', color='blue')
line_vms, = ax.plot([], [], label='VMS', color='orange')
ax.set_xlim(0, 10)  # x軸の範囲
ax.set_ylim(0, 2**30)  # y軸の範囲
ax.set_xlabel('時間 (秒)')
ax.set_ylabel('メモリ使用量 (バイト)')
ax.set_title('リアルタイムメモリ使用量')
ax.legend()
# 更新関数
def update(frame):
    memory_info = process.memory_info()
    rss_values.append(memory_info.rss)
    vms_values.append(memory_info.vms)
    
    # x軸の範囲を更新
    if len(rss_values) > 10:
        rss_values.pop(0)
        vms_values.pop(0)
    
    line_rss.set_data(range(len(rss_values)), rss_values)
    line_vms.set_data(range(len(vms_values)), vms_values)
    return line_rss, line_vms
# アニメーションの開始
ani = FuncAnimation(fig, update, frames=range(100), interval=1000)
plt.show()

このコードは、指定したプロセスのRSSとVMSをリアルタイムで更新し、グラフとして表示します。

時間の経過とともにメモリ使用量の変化を視覚的に確認できます。

CSVファイルにメモリ使用量を記録する方法

メモリ使用量をCSVファイルに記録することで、後から分析することが可能です。

以下のコードは、特定のプロセスのメモリ使用量をCSVファイルに記録する例です。

import psutil
import time
import csv
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
# CSVファイルの作成
with open('memory_usage.csv', mode='w', newline='') as csv_file:
    fieldnames = ['timestamp', 'RSS', 'VMS']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    writer.writeheader()  # ヘッダーの書き込み
    # メモリ使用量を取得してCSVに記録
    for _ in range(10):  # 10回取得
        memory_info = process.memory_info()
        writer.writerow({
            'timestamp': time.time(),
            'RSS': memory_info.rss,
            'VMS': memory_info.vms
        })
        time.sleep(1)  # 1秒ごとに取得

このコードは、指定したプロセスのRSSとVMSを1秒ごとに取得し、memory_usage.csvというファイルに記録します。

これにより、後からメモリ使用量の変化を分析することができます。

応用例

サーバーのメモリ使用量を監視するスクリプトの作成

サーバーのメモリ使用量を監視するスクリプトを作成することで、リソースの過剰使用を早期に検出できます。

以下のコードは、サーバーのメモリ使用量を定期的に取得し、閾値を超えた場合にアラートを表示する例です。

import psutil
import time
# メモリ使用量の閾値を設定(例:80%)
threshold = 80
while True:
    # メモリ使用量を取得
    memory = psutil.virtual_memory()
    usage_percentage = memory.percent
    print(f"メモリ使用率: {usage_percentage}%")
    
    # 閾値を超えた場合にアラートを表示
    if usage_percentage > threshold:
        print("アラート: メモリ使用率が閾値を超えました!")
    
    time.sleep(5)  # 5秒ごとに取得

このスクリプトは、サーバーのメモリ使用率を5秒ごとに取得し、設定した閾値を超えた場合にアラートを表示します。

メモリリークの検出方法

メモリリークを検出するためには、特定のプロセスのメモリ使用量を定期的に監視し、時間の経過とともに増加し続ける場合に警告を出すことが重要です。

以下のコードは、メモリ使用量の変化を監視する例です。

import psutil
import time
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
previous_rss = process.memory_info().rss
while True:
    current_rss = process.memory_info().rss
    print(f"現在のRSS: {current_rss}, 前回のRSS: {previous_rss}")
    
    # メモリ使用量が増加している場合に警告を表示
    if current_rss > previous_rss:
        print("警告: メモリリークの可能性があります。")
    
    previous_rss = current_rss
    time.sleep(5)  # 5秒ごとに取得

このスクリプトは、指定したプロセスのRSSを5秒ごとに取得し、前回の値と比較して増加している場合に警告を表示します。

メモリ使用量が一定以上になった場合の自動プロセス終了

特定のプロセスのメモリ使用量が一定以上になった場合に、自動的にそのプロセスを終了させることができます。

以下のコードは、RSSが100MBを超えた場合にプロセスを終了する例です。

import psutil
import time
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
threshold = 100 * 1024 * 1024  # 100 MBの閾値
while True:
    memory_info = process.memory_info()
    print(f"現在のRSS: {memory_info.rss}")
    
    # RSSが閾値を超えた場合にプロセスを終了
    if memory_info.rss > threshold:
        print("アラート: メモリ使用量が閾値を超えました。プロセスを終了します。")
        process.terminate()  # プロセスを終了
        break
    
    time.sleep(5)  # 5秒ごとに取得

このスクリプトは、指定したプロセスのRSSを5秒ごとに取得し、閾値を超えた場合にそのプロセスを終了します。

Dockerコンテナ内のプロセスのメモリ使用量を監視する方法

Dockerコンテナ内のプロセスのメモリ使用量を監視するには、コンテナ内でpsutilを使用することができます。

以下のコードは、Dockerコンテナ内で実行されるプロセスのメモリ使用量を監視する例です。

import psutil
import time
# コンテナ内のプロセスのPIDを指定
pid = 1  # 例としてPID 1を使用
process = psutil.Process(pid)
while True:
    memory_info = process.memory_info()
    print(f"RSS: {memory_info.rss}, VMS: {memory_info.vms}")
    time.sleep(5)  # 5秒ごとに取得

このスクリプトは、Dockerコンテナ内で実行されるプロセスのRSSとVMSを5秒ごとに取得し、表示します。

Dockerコンテナ内でpsutilを使用することで、コンテナ内のリソース使用状況を把握することができます。

よくある質問

psutilがインストールできない場合の対処法は?

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

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

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

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

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

  python -m pip install --upgrade pip
  • 権限の問題: 管理者権限が必要な場合があります。

LinuxやmacOSではsudoを使ってインストールすることができます。

  sudo pip install psutil
  • 仮想環境の確認: 仮想環境を使用している場合、その環境が正しくアクティブになっているか確認してください。

メモリ使用量が正しく取得できない場合の原因は?

メモリ使用量が正しく取得できない場合、以下の原因が考えられます。

  • プロセスのPIDが無効: 指定したPIDが存在しない場合、psutilはエラーを返します。

プロセスが実行中であることを確認してください。

  • 権限の不足: 一部のプロセスに対しては、メモリ情報を取得するための権限が必要です。

特に、他のユーザーが所有するプロセスに対しては、権限が不足している可能性があります。

  • psutilのバージョン: 古いバージョンのpsutilを使用している場合、バグや互換性の問題があるかもしれません。

最新バージョンにアップグレードしてください。

  • OSの制限: 一部のオペレーティングシステムでは、特定のプロセスのメモリ情報を取得することが制限されている場合があります。

メモリ使用量の取得にかかるオーバーヘッドはどのくらい?

psutilを使用してメモリ使用量を取得する際のオーバーヘッドは、通常は非常に小さいですが、以下の要因によって異なる場合があります。

  • プロセスの数: システム上で実行中のプロセスが多い場合、情報を取得するためのオーバーヘッドが増加します。
  • 取得頻度: メモリ使用量を頻繁に取得する場合、CPUリソースを消費するため、オーバーヘッドが大きくなる可能性があります。
  • システムの状態: システムの負荷が高い場合、psutilの呼び出しに対する応答時間が遅くなることがあります。

一般的には、psutilのメモリ情報取得は軽量であり、通常の使用ではパフォーマンスに大きな影響を与えることはありませんが、特に高頻度で情報を取得する場合は、オーバーヘッドを考慮する必要があります。

まとめ

この記事では、Pythonのpsutilライブラリを使用してプロセスのメモリ使用量を取得・監視する方法について詳しく解説しました。

具体的には、メモリ使用量の取得方法や監視手法、さらには複数プロセスのメモリ使用量を集計する方法、可視化の手法についても触れました。

これらの知識を活用することで、システムのパフォーマンスを向上させるための具体的なアプローチを実践することが可能です。

今後は、実際に自分のプロジェクトにpsutilを取り入れ、メモリ使用量の監視や分析を行ってみてください。

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