0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

# Pythonで実行環境(CPU・メモリ・OS情報)を自動取得する

0
Posted at

パフォーマンス測定やベンチマーク結果を比較する際、

  • 「どのマシンで実行したのか?」
  • 「CPUコア数はいくつか?」
  • 「メモリはどのくらいか?」
  • 「そのときのCPU使用率は?」

といった 実行環境の前提条件 を残しておくことは非常に重要です。

本記事では、Windows, Linux, MacOSなどで動作可能なライブラリ psutil を使って
OS・CPU・メモリ・プロセス情報をJSON形式で保存するPythonスクリプト を紹介します。

取得できる情報

このスクリプトでは以下を取得します。

✅ 基本情報

  • タイムスタンプ
  • プロセスID
  • 実行コマンド

✅ OS / アーキテクチャ

  • OS名
  • OSリリース
  • CPUアーキテクチャ

✅ CPU情報

  • 物理コア数
  • 論理コア数
  • CPU周波数
  • CPUアフィニティ
  • CPU使用率(全体 / コアごと)

✅ メモリ情報

  • 総メモリ
  • 使用中メモリ
  • 利用可能メモリ
  • プロセスRSS

✅ swap情報

  • 総swap
  • 使用中swap

必要なライブラリ

pip install psutil

実装コード

import psutil
import platform
import os
import json
import time

# 単位をMBに変換する定数
MB = 1024 ** 2

def collect_perf_preconditions():
    p = psutil.Process()

    vm = psutil.virtual_memory()
    swap = psutil.swap_memory()

    info = {
        # タイムスタンプ
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
        "pid": p.pid,
        "cmdline": p.cmdline(),

        # OS / 環境
        "os": platform.system(),
        "os_release": platform.release(),
        "arch": platform.machine(),

        # CPU
        "cpu": {
            "physical_cores": psutil.cpu_count(logical=False),
            "logical_cores": psutil.cpu_count(logical=True),
            "freq_mhz": psutil.cpu_freq()._asdict() if psutil.cpu_freq() else None,
            "cpu_affinity": p.cpu_affinity(),
            "cpu_percent_total": psutil.cpu_percent(interval=1),
            "cpu_percent_percpu": psutil.cpu_percent(interval=1, percpu=True),
        },

        # メモリ
        "memory": {
            "total_mb": round(vm.total / MB, 3),
            "used_mb": round(vm.used / MB, 3),
            "available_mb": round(vm.available / MB, 3),
            "process_rss_mb": round(p.memory_info().rss / MB, 3),
        },

        # swap メモリ
        "swap": {
            "total_mb": round(swap.total / MB, 3),
            "used_mb": round(swap.used / MB, 3),
        }
    }

    return info


if __name__ == "__main__":
    precond = collect_perf_preconditions()

    print(json.dumps(precond, indent=2))

    # jsonファイルとして保存
    with open("perf_precondition.json", "w") as f:
        json.dump(precond, f, indent=2)

実行結果例

json形式で表示するとともにjsonファイルをログとして残します。

{
  "timestamp": "2026-02-11 02:55:51",
  "pid": 1,
  "cmdline": [
    "python",
    "/workspace/record_condition.py"
  ],
  "os": "Linux",
  "os_release": "6.1.21-v8+",
  "arch": "aarch64",
  "cpu": {
    "physical_cores": 4,
    "logical_cores": 4,
    "freq_mhz": {
      "current": 1000.0,
      "min": 600.0,
      "max": 1000.0
    },
    "cpu_affinity": [
      0,
      1,
      2,
      3
    ],
    "cpu_percent_total": 0.5,
    "cpu_percent_percpu": [
      4.0,
      2.0,
      1.0,
      2.0
    ]
  },
  "memory": {
    "total_mb": 419.336,
    "used_mb": 183.199,
    "available_mb": 236.137,
    "process_rss_mb": 11.926
  },
  "swap": {
    "total_mb": 99.996,
    "used_mb": 3.25
  }
}

なぜこの情報が重要なのか?

パフォーマンス評価では、

  • CPUコア数が違う
  • メモリ容量が違う
  • CPUアフィニティが違う
  • swapが発生している

といった条件の違いが結果に大きく影響します。

例えば:

  • OpenMP並列数のスケーリング検証
  • PyTorchのCPUベンチマーク
  • perfによる性能測定
  • Docker内外の性能比較

こういったケースでは 環境差分の記録が再現性を担保する鍵 になります。

まとめ

パフォーマンス評価では「測定コード」よりも「測定環境の記録」のほうが重要なことも多いです。 psutil を使えば簡単に再現性のある環境ログを取得できます。
ぜひベンチマークコードとセットで保存してみてください。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?