パフォーマンス測定やベンチマーク結果を比較する際、
- 「どのマシンで実行したのか?」
- 「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 を使えば簡単に再現性のある環境ログを取得できます。
ぜひベンチマークコードとセットで保存してみてください。