[Python] プロセスのメモリ使用量を取得・監視する方法
Pythonでプロセスのメモリ使用量を取得・監視するには、psutil
ライブラリが便利です。
psutil
はシステムのプロセスやリソースの情報を取得できるライブラリで、psutil.Process(pid)
を使って特定のプロセスのメモリ使用量を取得できます。
例えば、memory_info()メソッド
を使うと、RSS(Resident Set Size)やVMS(Virtual Memory Size)などのメモリ情報が得られます。
psutil
はクロスプラットフォーム対応で、WindowsやLinuxでも動作します。
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秒ごとに取得し、グラフとして表示します。
時間に対するメモリ使用量の変化を視覚的に確認できます。
メモリ使用量の推移をリアルタイムで表示する方法
リアルタイムでメモリ使用量の推移を表示するには、matplotlib
のFuncAnimation
を使用します。
以下のコードは、リアルタイムでメモリ使用量を更新する例です。
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
を使用することで、コンテナ内のリソース使用状況を把握することができます。
まとめ
この記事では、Pythonのpsutil
ライブラリを使用してプロセスのメモリ使用量を取得・監視する方法について詳しく解説しました。
具体的には、メモリ使用量の取得方法や監視手法、さらには複数プロセスのメモリ使用量を集計する方法、可視化の手法についても触れました。
これらの知識を活用することで、システムのパフォーマンスを向上させるための具体的なアプローチを実践することが可能です。
今後は、実際に自分のプロジェクトにpsutil
を取り入れ、メモリ使用量の監視や分析を行ってみてください。