はじめに
システムのリソース監視やプロセス管理を行いたい場面で、Pythonのpsutil
ライブラリは非常に強力なツールです。CPU使用率、メモリ使用量、ディスク容量、ネットワーク統計、プロセス情報など、システムの様々な情報を簡単に取得できます。
この記事では、psutilでできることを体系的に紹介し、実際に動作するサンプルコードとともに解説します。著者はgoogle colabで動作確認しました。
インストール
pip install psutil
1. システムリソース監視
CPU情報の取得
import psutil
import time
def monitor_cpu():
"""CPU使用率とコア情報を監視"""
print("=== CPU情報 ===")
# 物理・論理コア数
print(f"物理コア数: {psutil.cpu_count(logical=False)}")
print(f"論理コア数: {psutil.cpu_count(logical=True)}")
# CPU使用率(全体)
cpu_percent = psutil.cpu_percent(interval=1)
print(f"CPU使用率: {cpu_percent}%")
# コア別使用率
cpu_per_core = psutil.cpu_percent(interval=1, percpu=True)
for i, percent in enumerate(cpu_per_core):
print(f"コア{i}: {percent}%")
# CPU周波数
freq = psutil.cpu_freq()
if freq:
print(f"CPU周波数: {freq.current:.2f}MHz")
# CPU統計情報
stats = psutil.cpu_stats()
print(f"コンテキストスイッチ: {stats.ctx_switches}")
print(f"割り込み: {stats.interrupts}")
if __name__ == "__main__":
monitor_cpu()
メモリ情報の取得
def monitor_memory():
"""メモリ使用量を監視"""
print("\n=== メモリ情報 ===")
# 仮想メモリ
virtual_mem = psutil.virtual_memory()
print(f"総メモリ: {virtual_mem.total / (1024**3):.2f} GB")
print(f"使用中: {virtual_mem.used / (1024**3):.2f} GB")
print(f"空き: {virtual_mem.available / (1024**3):.2f} GB")
print(f"使用率: {virtual_mem.percent}%")
# スワップメモリ
swap_mem = psutil.swap_memory()
print(f"スワップ総容量: {swap_mem.total / (1024**3):.2f} GB")
print(f"スワップ使用中: {swap_mem.used / (1024**3):.2f} GB")
print(f"スワップ使用率: {swap_mem.percent}%")
monitor_memory()
ディスク情報の取得
def monitor_disk():
"""ディスク使用量とI/O統計を監視"""
print("\n=== ディスク情報 ===")
# 全パーティション情報
partitions = psutil.disk_partitions()
for partition in partitions:
print(f"デバイス: {partition.device}")
print(f"マウントポイント: {partition.mountpoint}")
print(f"ファイルシステム: {partition.fstype}")
try:
# ディスク使用量
disk_usage = psutil.disk_usage(partition.mountpoint)
print(f" 総容量: {disk_usage.total / (1024**3):.2f} GB")
print(f" 使用中: {disk_usage.used / (1024**3):.2f} GB")
print(f" 空き: {disk_usage.free / (1024**3):.2f} GB")
print(f" 使用率: {(disk_usage.used / disk_usage.total) * 100:.1f}%")
except PermissionError:
print(" アクセス許可がありません")
print()
# ディスクI/O統計
disk_io = psutil.disk_io_counters()
if disk_io:
print("=== ディスクI/O統計 ===")
print(f"読み取りバイト数: {disk_io.read_bytes / (1024**2):.2f} MB")
print(f"書き込みバイト数: {disk_io.write_bytes / (1024**2):.2f} MB")
print(f"読み取り回数: {disk_io.read_count}")
print(f"書き込み回数: {disk_io.write_count}")
monitor_disk()
2. ネットワーク監視
def monitor_network():
"""ネットワーク統計とインターフェース情報を監視"""
print("\n=== ネットワーク情報 ===")
# ネットワークI/O統計
net_io = psutil.net_io_counters()
print(f"送信バイト数: {net_io.bytes_sent / (1024**2):.2f} MB")
print(f"受信バイト数: {net_io.bytes_recv / (1024**2):.2f} MB")
print(f"送信パケット数: {net_io.packets_sent}")
print(f"受信パケット数: {net_io.packets_recv}")
# インターフェース別統計
net_io_per_if = psutil.net_io_counters(pernic=True)
print("\n=== インターフェース別統計 ===")
for interface, stats in net_io_per_if.items():
print(f"{interface}:")
print(f" 送信: {stats.bytes_sent / (1024**2):.2f} MB")
print(f" 受信: {stats.bytes_recv / (1024**2):.2f} MB")
# ネットワーク接続情報
connections = psutil.net_connections()
print(f"\n接続数: {len(connections)}")
# アクティブな接続(最初の5つ)
print("\n=== アクティブな接続(上位5つ) ===")
for i, conn in enumerate(connections[:5]):
if conn.status == 'ESTABLISHED':
print(f"PID: {conn.pid}, {conn.laddr} -> {conn.raddr}")
monitor_network()
3. プロセス管理
def monitor_processes():
"""プロセス情報を監視・管理"""
print("\n=== プロセス情報 ===")
# 実行中のプロセス数
print(f"実行中のプロセス数: {len(psutil.pids())}")
# CPU使用率の高いプロセス(上位5つ)
print("\n=== CPU使用率の高いプロセス ===")
processes = []
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent']):
try:
processes.append(proc.info)
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
# CPU使用率でソート
processes.sort(key=lambda x: x['cpu_percent'] or 0, reverse=True)
for proc in processes[:5]:
print(f"PID: {proc['pid']}, Name: {proc['name']}, CPU: {proc['cpu_percent']}%")
# メモリ使用量の高いプロセス
print("\n=== メモリ使用量の高いプロセス ===")
processes = []
for proc in psutil.process_iter(['pid', 'name', 'memory_percent']):
try:
processes.append(proc.info)
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
# メモリ使用率でソート
processes.sort(key=lambda x: x['memory_percent'] or 0, reverse=True)
for proc in processes[:5]:
print(f"PID: {proc['pid']}, Name: {proc['name']}, Memory: {proc['memory_percent']:.2f}%")
monitor_processes()
特定プロセスの詳細情報
def process_details(pid):
"""特定のプロセスの詳細情報を取得"""
try:
proc = psutil.Process(pid)
print(f"\n=== プロセス詳細 (PID: {pid}) ===")
print(f"名前: {proc.name()}")
print(f"実行ファイル: {proc.exe()}")
print(f"コマンドライン: {' '.join(proc.cmdline())}")
print(f"状態: {proc.status()}")
print(f"作成日時: {proc.create_time()}")
print(f"CPU使用率: {proc.cpu_percent()}%")
print(f"メモリ使用率: {proc.memory_percent():.2f}%")
# メモリ情報
memory_info = proc.memory_info()
print(f"RSS: {memory_info.rss / (1024**2):.2f} MB")
print(f"VMS: {memory_info.vms / (1024**2):.2f} MB")
# ファイルハンドル
print(f"開いているファイル数: {proc.num_fds()}")
except psutil.NoSuchProcess:
print(f"PID {pid} のプロセスは存在しません")
except psutil.AccessDenied:
print(f"PID {pid} のプロセスにアクセスできません")
# 例: 現在のPythonプロセスの詳細
import os
process_details(os.getpid())
4. システム監視ダッシュボード
実用的な監視ダッシュボードを作成してみましょう。
def system_dashboard():
"""システム監視ダッシュボード"""
import datetime
print("=" * 60)
print(f"システム監視ダッシュボード - {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
# システム情報
print("\n【システム情報】")
boot_time = psutil.boot_time()
boot_time_str = datetime.datetime.fromtimestamp(boot_time).strftime('%Y-%m-%d %H:%M:%S')
print(f"起動時刻: {boot_time_str}")
print(f"稼働時間: {datetime.datetime.now() - datetime.datetime.fromtimestamp(boot_time)}")
# CPU情報
print("\n【CPU】")
cpu_percent = psutil.cpu_percent(interval=1)
print(f"使用率: {cpu_percent}%")
# メモリ情報
print("\n【メモリ】")
memory = psutil.virtual_memory()
print(f"使用率: {memory.percent}%")
print(f"使用中: {memory.used / (1024**3):.2f}GB / {memory.total / (1024**3):.2f}GB")
# ディスク情報
print("\n【ディスク】")
disk = psutil.disk_usage('/')
print(f"使用率: {(disk.used / disk.total) * 100:.1f}%")
print(f"使用中: {disk.used / (1024**3):.2f}GB / {disk.total / (1024**3):.2f}GB")
# ネットワーク情報
print("\n【ネットワーク】")
net_io = psutil.net_io_counters()
print(f"送信: {net_io.bytes_sent / (1024**2):.2f}MB")
print(f"受信: {net_io.bytes_recv / (1024**2):.2f}MB")
# プロセス数
print("\n【プロセス】")
print(f"実行中: {len(psutil.pids())}")
print("=" * 60)
# 継続的な監視
def continuous_monitoring(interval=5):
"""継続的なシステム監視"""
try:
while True:
system_dashboard()
time.sleep(interval)
except KeyboardInterrupt:
print("\n監視を終了します")
# 使用例
if __name__ == "__main__":
# 1回実行
system_dashboard()
# 継続監視(5秒間隔)
# continuous_monitoring(5)
5. 使用例
リソース使用量アラート
def resource_alert():
"""リソース使用量が閾値を超えた場合にアラートを発行"""
# 閾値設定
CPU_THRESHOLD = 80 # CPU使用率80%以上
MEMORY_THRESHOLD = 85 # メモリ使用率85%以上
DISK_THRESHOLD = 90 # ディスク使用率90%以上
alerts = []
# CPU使用率チェック
cpu_percent = psutil.cpu_percent(interval=1)
if cpu_percent > CPU_THRESHOLD:
alerts.append(f"⚠️ CPU使用率が高いです: {cpu_percent}%")
# メモリ使用率チェック
memory = psutil.virtual_memory()
if memory.percent > MEMORY_THRESHOLD:
alerts.append(f"⚠️ メモリ使用率が高いです: {memory.percent}%")
# ディスク使用率チェック
disk = psutil.disk_usage('/')
disk_percent = (disk.used / disk.total) * 100
if disk_percent > DISK_THRESHOLD:
alerts.append(f"⚠️ ディスク使用率が高いです: {disk_percent:.1f}%")
# アラート表示
if alerts:
print("\n🚨 システムアラート 🚨")
for alert in alerts:
print(alert)
else:
print("✅ システムは正常です")
resource_alert()
まとめ
Pythonのpsutilライブラリを使えば、システム情報の取得や監視を簡単に行うことができます。この記事で紹介した機能を組み合わせることで、以下のような実用的なツールを構築できます。
システム監視ツール, パフォーマンスの分析, リソース使用量に応じたアラート通知, プロセスの管理, 定期的なシステム情報のレポート出力
また、psutilはWindows、macOS、Linuxの各プラットフォームに対応しており、同じコードを複数の環境で再利用できる点も大きな強みです。システム管理やDevOpsの自動化において、非常に頼れるライブラリと言えるでしょう。
まずは実際にコードを動かして、自分の用途に合ったシステム監視ツールを作ってみてはいかがでしょうか。
参考情報