4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

image.png

システムのリソース監視やプロセス管理を行いたい場面で、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()

image.png

メモリ情報の取得

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()

image.png

ディスク情報の取得

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()

image.png

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()

image.png

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()

image.png

特定プロセスの詳細情報

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())

image.png

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)

image.png

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()

まとめ

image.png

Pythonのpsutilライブラリを使えば、システム情報の取得や監視を簡単に行うことができます。この記事で紹介した機能を組み合わせることで、以下のような実用的なツールを構築できます。

システム監視ツール, パフォーマンスの分析, リソース使用量に応じたアラート通知, プロセスの管理, 定期的なシステム情報のレポート出力

また、psutilはWindows、macOS、Linuxの各プラットフォームに対応しており、同じコードを複数の環境で再利用できる点も大きな強みです。システム管理やDevOpsの自動化において、非常に頼れるライブラリと言えるでしょう。

まずは実際にコードを動かして、自分の用途に合ったシステム監視ツールを作ってみてはいかがでしょうか。

参考情報

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?