getrusage -
資源の使用量を取得する
#include <sys/time.h>
#include <sys/resource.h>
int getrusage(int who, struct rusage *usage);
getrusage() は
who の資源 (resource)
の使用量を返す。
who
には以下のいずれか一つを指定できる。
- RUSAGE_SELF
- 呼び出したプロセスの資源使用量、
そのプロセス内の全スレッドが使用している資源の合計を返す。
- RUSAGE_CHILDREN
- 呼び出したプロセスの子プロセスのうち、
終了して待ち状態にある全プロセスが使用している資源使用量の統計を返す。
これらの統計情報には、孫プロセスやその子孫のプロセスのうち、
削除待ちのものが使用している資源も含まれる。
-
RUSAGE_THREAD (Linux 2.6.26 以降)
- 呼び出したスレッドに関する資源使用量の統計を返す。
<sys/resource.h>
からこの定数の定義を得るためには、
((
どのヘッダーファイルをインクルードするよりも前に)
機能検査マクロ
_GNU_SOURCE
を定義しなければならない。
資源使用量は
usage
が指す構造体に格納されて返される。
構造体は以下の形式である。
struct rusage {
struct timeval ru_utime; /* 使用されたユーザー CPU 時間 */
struct timeval ru_stime; /* 使用されたシステム CPU 時間 */
long ru_maxrss; /* RAM 上に存在する仮想ページのサイズ
(resident set size) の最大値 */
long ru_ixrss; /* 共有メモリーの合計サイズ */
long ru_idrss; /* 非共有データの合計サイズ */
long ru_isrss; /* 非共有スタックの合計サイズ */
long ru_minflt; /* ページの再利用 (ソフトページフォルト) */
long ru_majflt; /* ページフォールト (ハードページフォルト) */
long ru_nswap; /* スワップ */
long ru_inblock; /* ブロック入力操作 */
long ru_oublock; /* ブロック出力操作 */
long ru_msgsnd; /* 送信された IPC メッセージ */
long ru_msgrcv; /* 受信された IPC メッセージ */
long ru_nsignals; /* 受信されたシグナル */
long ru_nvcsw; /* 意図したコンテキスト切り替え */
long ru_nivcsw; /* 意図しないコンテキスト切り替え */
};
すべてのフィールドがサポートされているわけではない。
メンテナンスされていないフィールドには、
カーネルが 0
を設定する
(メンテナンスされていないフィールドは、
他のシステムとの互換性のために提供されており、
いつか Linux
でもサポートされるかもしれない)。
各フィールドの詳細は以下の通りである。
- ru_utime
- ユーザーモードでの実行で消費された合計時間。
timeval 構造体
(秒とミリ秒)
で表現される。
- ru_stime
- カーネルモードでの実行で消費された合計時間。
timeval 構造体
(秒とミリ秒)
で表現される。
-
ru_maxrss (Linux 2.6.32 以降)
- 使用された resident set size
の最大値
(キロバイト単位)。
RUSAGE_CHILDREN
の場合には、プロセスツリーの
resident set size
の最大値ではなく、
最も大きい子プロセスの
resident set size となる。
-
ru_ixrss
(メンテナンスされていない)
- このフィールドは現在のところ
Linux
では未使用である。
-
ru_idrss
(メンテナンスされていない)
- このフィールドは現在のところ
Linux
では未使用である。
-
ru_isrss
(メンテナンスされていない)
- このフィールドは現在のところ
Linux
では未使用である。
- ru_minflt
- I/O
動作なしで発生したページフォルトの回数。
再割り当てを待っているページリストからページフレームを「回収」
(reclaim) することで、 I/O
動作を避けることができる。
- ru_majflt
- I/O
動作を必要とするページフォルトの回数。
-
ru_nswap
(メンテナンスされていない)
- このフィールドは現在のところ
Linux
では未使用である。
-
ru_inblock (Linux 2.6.22 以降)
- ファイルシステムが入力を実行する必要があった回数。
-
ru_oublock (Linux 2.6.22 以降)
- ファイルシステムが出力を実行する必要があった回数。
-
ru_msgsnd
(メンテナンスされていない)
- このフィールドは現在のところ
Linux
では未使用である。
-
ru_msgrcv
(メンテナンスされていない)
- このフィールドは現在のところ
Linux
では未使用である。
-
ru_nsignals
(メンテナンスされていない)
- このフィールドは現在のところ
Linux
では未使用である。
-
ru_nvcsw (Linux 2.6 以降)
- 自分のタイムスライスが完了する前にプロセスが自発的にプロセッサを解放して行われたコンテキストスイッチの回数
(通常はリソースが利用可能になるのを待つために行われる)。
-
ru_nivcsw (Linux 2.6 以降)
- 優先度が自分より高いプロセッサが実行可能になったか、現在のプロセスが自分のタイムスライスを超過したことにより行われたコンテキストスイッチの回数。
成功した場合は 0
が返される。エラーの場合は
-1 が返され、
errno
が適切に設定される。
- EFAULT
-
usage
がアクセス可能なアドレス空間の外を指している。
- EINVAL
-
who
が無効である。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
getrusage() |
Thread safety |
MT-Safe |
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD. POSIX.1 は
getrusage()
を規定しているが、規定しているフィールドは
ru_utime と
ru_stime
だけである。
RUSAGE_THREAD は Linux
固有である。
execve(2)
の前後でリソース使用量の指標は保持される。
今日では
<sys/time.h>
をインクルードする必要はないが、
インクルードしておけば移植性が増す。
(実際
struct timeval は
<sys/time.h>
で定義されている。)
2.6.9
より前のバージョンの
Linux カーネルでは、
SIGCHLD
の処理が
SIG_IGN
に設定されていると、
子プロセスのリソース使用量が
RUSAGE_CHILDREN
で返される値に自動的に含められる。
しかし POSIX.1-2001
では、これを明確に禁止している。
この準拠していなかった点は、Linux
2.6.9 以降で改正された。
このページの最初で示した構造体の定義は
4.3BSD Reno のものである。
古いシステムでは、
getrusage()
と同様の目的を持つ関数
vtimes()
が提供されていた。後方互換性のため、glibc
(バージョン 2.32 まで)
でも
vtimes()
を提供している。全ての新しいアプリケーションでは
getrusage()
を使用すべきである。
proc(5) にある
/proc/[pid]/stat
の説明も参照のこと。
clock_gettime(2),
getrlimit(2),
times(2),
wait(2),
wait4(2),
clock(3)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。