PythonのresourceモジュールでUNIXリソース使用量を測定・制御する方法
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. | 定数と説明 |
|---|---|
| 1 | RLIM_INFINITY 無制限のリソースを表す上限値 |
| 2 | RLIMIT_CORE 現在のプロセスが作成できるコアファイルの最大サイズ |
| 3 | RLIMIT_CPU 使用できるCPU時間の最大値。制限を超えるとSIGXCPUシグナルがプロセスに送信されます |
| 4 | RLIMIT_DATA プロセスのヒープ領域の最大サイズ |
| 5 | RLIMIT_STACK 呼び出しスタックの最大サイズ。マルチスレッドプロセスではメインスレッドのスタックに対して適用されます |
| 6 | RLIMIT_NOFILE 現在のプロセスが開けるファイルディスクリプタの最大数 |
| 7 | RLIMIT_MEMLOCK ロックできるメモリの最大アドレス空間 |
| 8 | RLIMIT_NICE プロセスのniceレベルの上限 |
| 9 | RLIMIT_SWAP スワップ領域の最大サイズ |
| 10 | RLIMIT_NPTS システム上で作成できる擬似端末の最大数 |
リソース使用量(Resource Usage)
リソース使用量を調べるためのメソッドと定数も用意されています。
resource.getrusage(who)
現在のプロセス、またはその子プロセスが使用したリソース情報を含むオブジェクト(struct_rusage)を返します。戻り値の各フィールドから、CPU時間やメモリ使用量など、リソースがどのように使われたのかを詳細に確認できます。
resource.getpagesize()
システムページのサイズをバイト数で返します。物理的なページサイズと必ずしも一致しない場合がある点に注意してください。
リソース使用量に関連する主な定数は以下の通りです。
| No. | 定数と説明 |
|---|---|
| 1 | RUSAGE_SELF 呼び出し元プロセスが消費したリソースを要求します。全スレッドのリソース使用量の合計となります |
| 2 | RUSAGE_CHILDREN 子プロセスが消費したリソースを要求します |
| 3 | RUSAGE_BOTH 呼び出し元プロセスと子プロセスの両方が消費したリソースを要求します。すべてのシステムで利用できるわけではありません |
| 4 | RUSAGE_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)されていることがわかります。
-
PythonとSeleniumでWhatsAppチャットボットを作る方法
はじめに この記事では、Pythonを使ってWhatsAppのチャットボットを作成する方法を解説します。TwitterやFacebook向けの一般的なチャットボットとは異なり、WhatsAppは運営ポリシーの関係上、プラットフォーム上で直接ボットを動かすことができません。 しかし、SeleniumというPythonの強力なパッケージを使えば、ブラウザの操作を自動化することでこれを実現できます。Seleniumを利用すれば、ブラウザ経由で「WhatsApp Web」を自由に操作できるのです。 必要なもの 準備が必要なのは、主に以下の3点です。 1. Selenium Seleniumはpip
-
PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法
はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c