Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Pythonでリソース管理を行ってみる

今回はCPU使用率やメモリ使用率などのチェックを行うためのコードに挑戦してみたいと思います!!
目指すは、サーバー上のリソースを監視できるWebアプリの作成です!!

今回はPythonでどのようにリソースを監視すればよいのか?
方法をまとめておこうと思います!!



■環境

冒頭やタイトルで記載した通り、Pythonを用いていきます。
Pythonのバージョンは、

Python 3.7.3

です。

Pythonでリソースチェックする方法

PythonにはCPU使用率やメモリ使用率などのリソースを取得するライブラリとして、
psutil
が用意されております。

公式ドキュメントには下記が記載されております。

psutilは、pythonでの実行中のプロセス及びシステム使用率に関する情報を取得するためのクロスプラットフォームライブラリになります。
システムのモニタリングやプロファイリング、プロセスリソース制限や実行プロセス管理などに役立つ。
psutil (python system and process utilities) is a cross-platform library for retrieving information on running processes and system utilization (CPU, memory, disks, network, sensors) in Python. It is useful mainly for system monitoring, profiling, limiting process resources and the management of running processes. It implements many functionalities offered by UNIX command line tools such as: ps, top, lsof, netstat, ifconfig, who, df, kill, free, nice, ionice, iostat, iotop, uptime, pidof, tty, taskset, pmap. psutil currently supports the following platforms:

インストールするためには、

pip install psutil

を実行すればOKです。

■psutilでシステム使用率をチェックしてみる

ではpsutilでCPU使用率やメモリ使用率をチェックしてみたいと思います。
コードはこちら。

import psutil

mem = psutil.virtual_memory()
print(mem.percent)
print(mem.free)
print(mem.used)
cpu = psutil.cpu_percent(interval=1)
print(cpu)

とてもシンプルですねw。

mem = psutil.virtual_memory()

によりmem変数にメモリ関係のデータが格納されます。
mem変数をprintしてみると、

svmem(total=8418025472, available=1307623424, percent=84.5, used=7110402048, free=1307623424)

といったようにトータルメモリやメモリ使用率、使用/未使用メモリ量が格納されています。
各データを抽出したい場合には、

print(mem.percent)
print(mem.free)
print(mem.used)

というようにすればOKです。

さらにCPU使用率は、

cpu = psutil.cpu_percent(interval=1)

とすればOKです。
intervalですが、CPU使用率を算出するまでの時間を示しており、こちらが短くすることですぐに出力が得られるのですが、
精度が落ちてしまいます。
逆に長くすれば精度は増加するようです。
トレードオフですね。。
こちらのintervalですが、0.1などの小数点も指定できます。

psutilはCPU使用率やメモリ使用率以外にもネットワークやディスクについても確認できます。
下記に使い方が載っているので是非ご参考ください。
https://githubja.com/giampaolo/psutil

■グラフ化してみる

psutilを用いることでリソースが出力されることが分かりました。
しかし、数値のみだと増減や変化率がわかりにくい!!
ということで、こちらの結果をグラフとして出力させてみました。

グラフ出力にあたり、matplotlibをもちいました。
コードはこちら。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
import psutil
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk

fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)
xlim = [0,100]
x = []
mem = []
cpu = []

def plotFunc(data):
    mem = psutil.virtual_memory()
    mem.append(mem.percent)
    cpu.append(psutil.cpu_percent(interval=0.1, percpu=False))
    x.append(len(x))

    ax1.plot(x,mem, color='blue')
    ax1.set_xlim(xlim[0],xlim[1])

    ax2.plot(x,cpu, color='red')
    ax2.set_xlim(xlim[0],xlim[1])
    
    if len(x) > 2000:
        mem.clear()
        cpu.clear()
        x.clear()
        xlim[0] = 0
        xlim[1] = 100
        ax1.cla()
        ax2.cla()
    elif len(x) > 100:
        xlim[0]+=1
        xlim[1]+=1

def Domatplot():
    ani = animation.FuncAnimation(fig, plotFunc, interval=100)
    plt.show()

Domatplot()

今回定期的に使用率の見える化をしたかったので、グラフを動的に変更させました。
グラフを動的に変更させるにあたり、matplotlibにはFuncAnimation関数が用意されていますのでこちらを利用しました。

FuncAnimationの引数ですが、
第1引数:Figure
第2引数:グラフを各インターバル毎に作成sるうコールバック関数
第3引数:コールバック関数をコールして画面を更新するインターバル
になります。

コールバック関数ですが、
plotFunc(data)
にあたります。

plotFunc(data)ではまず、

mem = psutil.virtual_memory()
    mem.append(mem.percent)
    cpu.append(psutil.cpu_percent(interval=0.1, percpu=False))
    x.append(len(x))

にてCPU使用率やメモリ使用率をリストに格納します。

そして、

    ax1.plot(x,mem, color='blue')
    ax1.set_xlim(xlim[0],xlim[1])

    ax2.plot(x,cpu, color='red')
    ax2.set_xlim(xlim[0],xlim[1])

にてグラフ上に先ほど格納したリスト型変数内のデータをプロットします。
これでコールされる毎にグラフの更新が行われます。

最後に、

    if len(x) > 2000:
        mem.clear()
        cpu.clear()
        x.clear()
        xlim[0] = 0
        xlim[1] = 100
        ax1.cla()
        ax2.cla()
    elif len(x) > 100:
        xlim[0]+=1
        xlim[1]+=1

ですが、あまりリストに変数を格納しておくことを嫌ったため2000データ格納された際にはリセットするようにしました。

 elif len(x) > 100:
        xlim[0]+=1
        xlim[1]+=1

はグラフの横軸を変化させ見やすくするためにセットしております。


こちらのコードを実行するとこちらのような結果となります。
f:id:Elsammit:20210808150518g:plain
グラフの上段がメモリ使用率、
下段がCPU使用率になります。
グラフ化することで数値より変化が分かりやすくなりましたね。

■最後に

今回はリソース管理ために数値出力やグラフによる変化をモニタリングしてみました。
次回はこちらをWebアプリとすることでどこからでも監視・モニタリングできるようにしてみたいと思います。
がんばるぞ~~