【メモ】ラズパイの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使用率について調査を行いました。
今後もちょくちょく使用率を気にしながら実験などを行っていきたいと思います。