【メモ】ラズパイのCPU使用率をPythonで測定する
はじめに
こんにちは、がんがんです。
ラズパイで物体検出を行う場合、CPUがどのくらい使用されているのかって気になりますよね(ラズパイ以外でもそうだと思いますが)。
昨年の今頃はEdge TPUをよく触っていました。
gangannikki.hatenadiary.jp
gangannikki.hatenadiary.jp
本実験を行っていた際に、CPUの利用率が気になって調べたことがあります。
今回はCPUの使用率についての調査メモをまとめておきます。
目的
- ラズパイでCPUの使用率が確認できるようにする(Python使用)
参考
基本的にはこちらの記事を参考にしています。
詳細や詳しい解説についてはこちらを参照頂けると幸いです。
my-web-site.iobb.net
実験
Pythonスクリプトのコードは以下の通りです。コードは参考記事をまとめたものになっています。
解説などは参考サイトを見たほうが分かりやすいです。
#------------------------------------------------------------ # coding:utf-8 #------------------------------------------------------------ import time import subprocess import sys def GetCpuFreq(): Cmd = "vcgencmd measure_clock arm" res = subprocess.Popen(Cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) Rstdout, Rstderr = res.communicate() CpuFreq = Rstdout.split("=") return int(CpuFreq[1]) def GetCpuTemp(): Cmd = "vcgencmd measure_temp" res = subprocess.Popen(Cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) Rstdout, Rstderr = res.communicate() Cputemp = Rstdout.split() return Cputemp[0] def GetCpuStat(): Cmd = "cat /proc/stat | grep cpu" res = subprocess.Popen(Cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) Rstdout,Rstderr = res.communicate() # 行ごとに分割 LineList = Rstdout.splitlines() Tcklist = [] for line in LineList: ItemList = line.split() Idle = int(ItemList[4]) Busy = int(ItemList[1]) + int(ItemList[2]) + int(ItemList[3]) All = Busy + Idle Tcklist.append([ Busy, All ]) return Tcklist class CpuUsage: def __init__(self): self.__Tcklist = GetCpuStat() def get(self): TcklistPre = self.__Tcklist TcklistNow = GetCpuStat() self.__Tcklist = TcklistNow CpuRateList = [] for (TckNow, TckPre) in zip(TcklistNow, TcklistPre): Diff = [ Now - Pre for (Now, Pre) in zip(TckNow, TckPre) ] Busy = Diff[0] All = Diff[1] CpuRate = int(Busy * 100 / All) CpuRateList.append(CpuRate) return CpuRateList if __name__ == "__main__": # 初期化 gCpuUsage = CpuUsage() for ix in range(10000): time.sleep(1) CpuRateList = gCpuUsage.get() CpuRate = CpuRateList[0] CpuRate_str = "CPU:{:3d}".format(CpuRate) del CpuRateList[0] Cputemp = GetCpuTemp() CpuFreq = int(GetCpuFreq() / 1000000) CpuFreq_str = "ARM {:4d}MHz".format(CpuFreq) Info_str = CpuFreq_str + "\t" + Cputemp + "\t" + CpuRate_str + "%" print(Info_str, CpuRateList)
通常時は意外と使ってないですね。
$ python3 cpu_check.py ARM 700MHz temp=52.1'C CPU: 0% [0, 0, 0, 0] ARM 700MHz temp=52.1'C CPU: 6% [0, 3, 10, 9] ARM 1400MHz temp=52.1'C CPU: 5% [2, 9, 6, 2] ARM 700MHz temp=52.6'C CPU: 1% [0, 0, 1, 0] ARM 700MHz temp=52.1'C CPU: 2% [0, 2, 3, 3] ...
おわりに
今回はラズパイのCPU使用率について調査を行いました。
今後もちょくちょく使用率を気にしながら実験などを行っていきたいと思います。