Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonのresourceモジュールでUNIXリソース使用量を測定・制御する方法

```html

UNIXのリソース使用量を測定するには、Pythonプログラム内でresourceモジュールを使用します。このモジュールは、リソース使用量の測定だけでなく、利用量そのものを制御することもできます。

モジュールを利用するには、まず次のようにインポートします。

import resource

リソース制限(Resource Limits)

resourceモジュールでは、setrlimit()関数を使ってリソースの利用量に上限を設定できます。リソースの制限には「ソフトリミット(soft limit)」と「ハードリミット(hard limit)」という2つのパラメータが用意されています。

ソフトリミットは現在適用されている制限値で、プロセス単位で変更できますが、ハードリミットを超える値には設定できません。一方、ハードリミットはソフトリミット以上の任意の値まで引き下げることはできますが、引き上げることはできません。

resource.getrlimit(resource)

指定したリソースのソフトリミットとハードリミットをタプルとして返します。無効なリソースを指定した場合はValueErrorが発生します。

resource.setrlimit(resource, limits)

リソースに制限値を設定します。limitsは(ソフトリミット, ハードリミット)の形式のタプルで指定します。RLIM_INFINITYを指定すれば、リソースを無制限にすることも可能です。

resource.prlimit(pid, resource[, limits])

getrlimit()とsetrlimit()の機能を組み合わせたメソッドです。任意のプロセスに対して、リソース制限の取得と設定を同時に行えます。pidに0を指定すると、呼び出し元のプロセス自身が対象になります。

リソース制限に関連する主な定数は以下の通りです。

No.定数と説明
1RLIM_INFINITY
無制限のリソースを表す上限値
2RLIMIT_CORE
現在のプロセスが作成できるコアファイルの最大サイズ
3RLIMIT_CPU
使用できるCPU時間の最大値。制限を超えるとSIGXCPUシグナルがプロセスに送信されます
4RLIMIT_DATA
プロセスのヒープ領域の最大サイズ
5RLIMIT_STACK
呼び出しスタックの最大サイズ。マルチスレッドプロセスではメインスレッドのスタックに対して適用されます
6RLIMIT_NOFILE
現在のプロセスが開けるファイルディスクリプタの最大数
7RLIMIT_MEMLOCK
ロックできるメモリの最大アドレス空間
8RLIMIT_NICE
プロセスのniceレベルの上限
9RLIMIT_SWAP
スワップ領域の最大サイズ
10RLIMIT_NPTS
システム上で作成できる擬似端末の最大数

リソース使用量(Resource Usage)

リソース使用量を調べるためのメソッドと定数も用意されています。

resource.getrusage(who)

現在のプロセス、またはその子プロセスが使用したリソース情報を含むオブジェクト(struct_rusage)を返します。戻り値の各フィールドから、CPU時間やメモリ使用量など、リソースがどのように使われたのかを詳細に確認できます。

resource.getpagesize()

システムページのサイズをバイト数で返します。物理的なページサイズと必ずしも一致しない場合がある点に注意してください。

リソース使用量に関連する主な定数は以下の通りです。

No.定数と説明
1RUSAGE_SELF
呼び出し元プロセスが消費したリソースを要求します。全スレッドのリソース使用量の合計となります
2RUSAGE_CHILDREN
子プロセスが消費したリソースを要求します
3RUSAGE_BOTH
呼び出し元プロセスと子プロセスの両方が消費したリソースを要求します。すべてのシステムで利用できるわけではありません
4RUSAGE_THREAD
現在のスレッドによるリソース使用量を要求します。すべてのシステムで利用できるわけではありません

サンプルコード

import resource

res_limits = resource.getrusage(resource.RUSAGE_SELF)
print(res_limits)
print('Page Size: ' + str(resource.getpagesize()))

resource.setrlimit(resource.RLIMIT_CPU, (1, 2))
print('Resource Limits: ' + str(resource.getrlimit(resource.RLIMIT_CPU)))

for a in range(1000):
    for b in range(1000):
        for c in range(1000):
            pass

実行結果

$ python3 example.py
resource.struct_rusage(ru_utime=0.035801, ru_stime=0.01074, ru_maxrss=9356, ru_ixrss=0, ru_idrss=0,
ru_isrss=0, ru_minflt=1147, ru_majflt=0, ru_nswap=0, ru_inblock=0, ru_oublock=0,
ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=0, ru_nivcsw=17)
Page Size: 4096
Resource Limits: (1, 2)
CPU time limit exceeded (core dumped)

この例では、まずRUSAGE_SELFを指定して自プロセスのリソース使用状況を取得し、ページサイズ(4096バイト)を表示しています。その後、CPU時間のソフトリミットを1秒、ハードリミットを2秒に設定しています。三重のループ処理がソフトリミットを超えて実行され続けたため、最終的にSIGXCPUシグナルによってプロセスが強制終了(CPU time limit exceeded)されていることがわかります。

  1. PythonとSeleniumでWhatsAppチャットボットを作る方法

    はじめに この記事では、Pythonを使ってWhatsAppのチャットボットを作成する方法を解説します。TwitterやFacebook向けの一般的なチャットボットとは異なり、WhatsAppは運営ポリシーの関係上、プラットフォーム上で直接ボットを動かすことができません。 しかし、SeleniumというPythonの強力なパッケージを使えば、ブラウザの操作を自動化することでこれを実現できます。Seleniumを利用すれば、ブラウザ経由で「WhatsApp Web」を自由に操作できるのです。 必要なもの 準備が必要なのは、主に以下の3点です。 1. Selenium Seleniumはpip

  2. PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法

    はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c