resource --- リソース使用情報¶
このモジュールでは、プログラムによって使用されているシステムリソースを計測したり制御するための基本的なメカニズムを提供します。
利用可能な環境: Unix, not WASI.
特定のシステムリソースを指定したり、現在のプロセスやその子プロセスのリソース使用情報を要求するためにシンボル定数が使われます。
システムコールが失敗した場合 OSError を送出します。
リソースの制限¶
リソースの使用は下に述べる setrlimit() 関数を使って制限することができます。各リソースは二つ組の制限値: ソフトリミット (soft limit) 、およびハードリミット (hard limit) 、で制御されます。ソフトリミットは現在の制限値で、時間とともにプロセスによって下げたり上げたりできます。ソフトリミットはハードリミットを超えることはできません。ハードリミットはソフトリミットよりも高い任意の値まで下げることができますが、上げることはできません。 (スーパユーザの有効な UID を持つプロセスのみがハードリミットを上げることができます。)
制限をかけるべく指定できるリソースはシステムに依存します。指定できるリソースは getrlimit(2) マニュアルページで解説されています。以下に列挙するリソースは背後のオペレーティングシステムがサポートする場合にサポートされています; オペレーティングシステム側で値を調べたり制御したりできないリソースは、そのプラットフォーム向けのこのモジュール内では定義されていません。
- resource.RLIM_INFINITY¶
無制限のリソースの上限を示すための定数です。
バージョン 3.15 で変更: 常に正の値になりました。 以前は -1 や -3 など、負の値になる場合がありました。
- resource.RLIM_SAVED_CUR¶
- resource.RLIM_SAVED_MAX¶
C の
rlim_tの値で表せない場合に、ソフトリミットとハードリミットの値を表すために使う定数です。RLIM_INFINITYと等しい場合もあります。Added in version 3.15.
- resource.getrlimit(resource)¶
resource の現在のソフトおよびハードリミットを表すタプル
(soft, hard)を返します。無効なリソースが指定された場合にはValueErrorが、背後のシステムコールが予期せず失敗した場合にはerrorが送出されます。
- resource.setrlimit(resource, limits)¶
resource の使用量に新しい制限を設定します。 limits 引数は新しい制限値を表す二つの整数のタプル
(soft, hard)でなければなりません。RLIM_INFINITYを指定すると無制限を要求できます。無効なリソースを指定した場合、新しいソフトリミットがハードリミットを超える場合、またはプロセスが自身のハードリミットを引き上げようとした場合は
ValueErrorを送出します。 そのリソースのハードリミットまたはシステムの制限が無制限でない場合にRLIM_INFINITYを指定するとValueErrorになります。 実効 UID がスーパーユーザーであるプロセスは、無制限を含む任意の有効な制限値を要求できますが、システムの課す上限を超える値を要求した場合はやはりValueErrorが送出されます。setrlimitは背後のシステムコールが予期せず失敗した場合に、errorを送出する場合があります。VxWorks では
RLIMIT_NOFILEの設定にのみ対応しています。引数
resource,limitsを指定して 監査イベントresource.setrlimitを送出します。
- resource.prlimit(pid, resource[, limits])¶
1つの関数の中で
setrlimit()とgetrlimit()を組み合わせ、任意のプロセスのリソースの制限値を取得したり設定したりします。 pid が 0 の場合は、現在のプロセスに適用されます。 resource および limits は、 limits がオプションであることを除けば、setrlimit()と同じ意味です。limits が与えられないときは、関数はプロセス pid の resource の制限値を返します。 limits が与えられたときは、プロセスの resource の制限値が設定され、設定が変更される前のリソースの制限値が返されます。
pid が見付からないときは
ProcessLookupErrorを、ユーザがプロセスのCAP_SYS_RESOURCEを持ってないときはPermissionErrorを送出します。引数
pid,resource,limitsを指定して 監査イベントresource.prlimitを送出します。利用可能な環境: Linux >= 2.6.36 with glibc >= 2.13.
Added in version 3.4.
以下のシンボルは、後に述べる関数 setrlimit() および getrlimit() を使って消費量を制御することができるリソースを定義しています。これらのシンボルの値は、C プログラムで使われているシンボルと全く同じです。
getrlimit(2) の Unix マニュアルページには、指定可能なリソースが列挙されています。全てのシステムで同じシンボルが使われているわけではなく、また同じリソースを表すために同じ値が使われているとも限らないので注意してください。このモジュールはプラットフォーム間の相違を隠蔽しようとはしていません --- あるプラットフォームで定義されていないシンボルは、そのプラットフォーム向けの本モジュールでは利用することができません。
- resource.RLIMIT_CORE¶
現在のプロセスが生成できるコアファイルの最大 (バイト) サイズです。プロセスの全体イメージを入れるためにこの値より大きなサイズのコアファイルが要求された結果、部分的なコアファイルが生成される可能性があります。
- resource.RLIMIT_CPU¶
プロセスが使用できるプロセッサー時間の上限 (秒単位) です。 この上限を超えると、プロセスに
SIGXCPUシグナルが送られます。 (このシグナルを捕捉して、開いているファイルをディスクにフラッシュするなどの処理を行う方法については、signalモジュールのドキュメントを参照してください。)
- resource.RLIMIT_FSIZE¶
プロセスが作成するファイルの最大サイズです。
- resource.RLIMIT_DATA¶
プロセスのヒープの最大 (バイト) サイズです。
- resource.RLIMIT_STACK¶
現在のプロセスのコールスタックの最大サイズ (バイト単位) です。 これはマルチスレッドプロセスのメインスレッドのスタックのみに影響します。
- resource.RLIMIT_RSS¶
プロセスが取りうる最大 RAM 常駐ページサイズ (resident set size) です。
- resource.RLIMIT_NPROC¶
現在のプロセスが生成できるプロセスの上限です。
- resource.RLIMIT_NOFILE¶
現在のプロセスが開けるファイル記述子の上限です。
- resource.RLIMIT_OFILE¶
RLIMIT_NOFILEの BSD での名称です。
- resource.RLIMIT_MEMLOCK¶
メモリ中でロックできる最大アドレス空間です。
- resource.RLIMIT_VMEM¶
プロセスが占有できるマップされたメモリ領域の上限です。 通常は
RLIMIT_ASの別名です。利用可能な環境: Solaris, FreeBSD, NetBSD.
- resource.RLIMIT_AS¶
アドレス空間でプロセスが占有できる最大領域 (バイト単位) です。
- resource.RLIMIT_MSGQUEUE¶
POSIX メッセージキューに割り当てることの出来るバイト数です。
利用可能な環境: Linux >= 2.6.8.
Added in version 3.4.
- resource.RLIMIT_NICE¶
プロセスの nice の上限です (20 - rlim_cur)。
利用可能な環境: Linux >= 2.6.12.
Added in version 3.4.
- resource.RLIMIT_RTTIME¶
リアルタイムスケジューリングにおいて、プロセスがブロッキングシステムコールを行わずに使用できるCPU時間の制限値(マイクロ秒単位)。
利用可能な環境: Linux >= 2.6.25.
Added in version 3.4.
- resource.RLIMIT_SBSIZE¶
このユーザが使用するソケットバッファの最大サイズ(バイト単位)。これは、このユーザが常に保持できるネットワークメモリの量、つまり mbuf の量を制限します。
利用可能な環境: FreeBSD, NetBSD.
Added in version 3.4.
- resource.RLIMIT_SWAP¶
このユーザ ID のすべてのプロセスで予約または使用できるスワップスペースの最大サイズ (バイト単位)。この制限は vm.overcommit sysctl のビット 1 が設定されている場合のみ適用されます。この sysctl の完全な説明については tuning(7) を参照してください。
利用可能な環境: FreeBSD >= 8.
Added in version 3.4.
- resource.RLIMIT_KQUEUES¶
このユーザー ID で作成できる kqueue の数の上限です。
利用可能な環境: FreeBSD >= 11.
Added in version 3.10.
- resource.RLIMIT_NTHR¶
メインスレッドとカーネルスレッドを除き、このユーザー ID が持てるスレッド数の上限です。
利用可能な環境: NetBSD >= 7.0.
Added in version 3.15.
リソースの使用状態¶
以下の関数はリソース使用情報を取得するために使われます:
- resource.getrusage(who)¶
who 引数の指定に従い、現在のプロセスまたはその子プロセスが消費したリソースを表すオブジェクトを返します。 who 引数には、以下で説明する
RUSAGE_*定数のいずれかを指定してください。簡単な例:
from resource import * import time # CPU に処理速度が制約されないタスク time.sleep(3) print(getrusage(RUSAGE_SELF)) # CPU に処理速度が制約されるタスク for i in range(10 ** 8): _ = 1 + 1 print(getrusage(RUSAGE_SELF))
戻り値の各フィールドは、ユーザーモードで実行した時間や主記憶からプロセスがスワップアウトされた回数など、特定のシステムリソースの使用状況を表します。 プロセスのメモリ使用量など、一部の値はクロックの刻み幅に依存します。
以前のバージョンとの互換性のため、返される値は 16 要素からなるタプルとしてアクセスすることもできます。
戻り値の
ru_utimeフィールドとru_stimeフィールドは、それぞれユーザーモードとシステムモードでの実行時間を表す浮動小数点数です。 他の値は整数です。 各値の詳細は getrusage(2) マニュアルページを参照してください。 以下に概要を示します。インデックス
フィールド
リソース
0ru_utimeユーザーモードでの時間 (浮動小数点数、秒単位)
1ru_stimeシステムモードでの時間 (浮動小数点数、秒単位)
2ru_maxrss最大常駐ページサイズ
3ru_ixrss共有メモリサイズ
4ru_idrss非共有メモリサイズ
5ru_isrss非共有スタックサイズ
6ru_minfltI/O を必要としないページフォールト数
7ru_majfltI/O を必要とするページフォールト数
8ru_nswapスワップアウト回数
9ru_inblockブロック入力操作数
10ru_oublockブロック出力操作数
11ru_msgsnd送信メッセージ数
12ru_msgrcv受信メッセージ数
13ru_nsignals受信シグナル数
14ru_nvcsw自発的な実行コンテキスト切り替え数
15ru_nivcsw非自発的な実行コンテキスト切り替え数
この関数は無効な who 引数を指定した場合には
ValueErrorを送出します。また、異常が発生した場合にはerror例外が送出される可能性があります。
- resource.getpagesize()¶
システムページ内のバイト数を返します。(ハードウェアページサイズと同じとは限りません。)
以下の RUSAGE_* シンボルを getrusage() 関数に渡すことで、どのプロセスの情報を取得するか指定します。
- resource.RUSAGE_SELF¶
getrusage()に渡すと呼び出し中のプロセスが消費しているリソースを要求します。そのプロセスの全スレッドが使用するリソースの合計です。
- resource.RUSAGE_CHILDREN¶
getrusage()に渡すと、呼び出し元プロセスの子プロセスのうち、終了して wait による回収も済んだものが消費したリソースを取得できます。
- resource.RUSAGE_BOTH¶
getrusage()に渡すと現在のプロセスおよび子プロセスの両方が消費しているリソースを要求します。全てのシステムで利用可能なわけではありません。
- resource.RUSAGE_THREAD¶
getrusage()に渡すと現在のスレッドが消費しているリソースを要求します。全てのシステムで利用可能なわけではありません。Added in version 3.2.