getrusage

関数の概要

PHPのgetrusage関数は、現在のスクリプトやプロセスが消費しているリソース使用状況を取得するための関数です。CPU時間やメモリ使用量、入出力操作の回数など、システムリソースの詳細な統計情報を得ることができ、パフォーマンスの分析や監視に役立ちます。

パラメータの説明

  • $who(省略可能): どのリソース使用状況を取得するかを指定する整数値です。
    主に以下の定数が利用されます。

    • 1 または RUSAGE_SELF – 現在のプロセスのリソース使用状況(デフォルト)
    • 2 または RUSAGE_CHILDREN – 現在のプロセスが生成した子プロセス全体のリソース使用状況

戻り値

この関数は連想配列を返します。配列のキーはシステムにより若干異なる場合がありますが、主に以下のようなリソース情報が含まれています。

  • ru_utime – ユーザーモードCPU時間
  • ru_stime – カーネルモードCPU時間
  • ru_maxrss – 最大常駐セットサイズ(最大使用メモリ)
  • ru_ixrss – 共有メモリサイズ
  • ru_idrss – 保持されたデータサイズ
  • ru_isrss – 保持されたスタックサイズ
  • ru_minflt – 発生したページフォルト数(メモリ参照時のページ欠損)
  • ru_majflt – 発生した重大なページフォルト数
  • ru_inblock – ブロック入力操作回数
  • ru_oublock – ブロック出力操作回数
  • ru_nvcsw – 自発的コンテキストスイッチ数
  • ru_nivcsw – 非自発的コンテキストスイッチ数

取得できる情報はOSによって異なるため、環境依存する点にも注意が必要です。

使用例

基本的な使い方

<?php
// 現在のプロセスのリソース情報を取得
$usage = getrusage();
print_r($usage);
?>

このコードは、現在のPHPスクリプトが使用しているCPU時間やメモリなどのリソース状況を表示します。

ユーザーモードCPU時間の取得

<?php
$usage = getrusage();
$utime_sec = $usage["ru_utime.tv_sec"];
$utime_usec = $usage["ru_utime.tv_usec"];

echo "ユーザーモードCPU時間: " . ($utime_sec + $utime_usec / 1000000) . " 秒";
?>

CPUのユーザーモードでの利用時間を秒単位で算出し、分かりやすく表示しています。

子プロセスのリソース使用状況を取得する

<?php
// 子プロセスがいる場合、そちらのリソース消費を確認
$childUsage = getrusage(2); // RUSAGE_CHILDREN
print_r($childUsage);
?>

子プロセス全体のリソース使用量を取得したい場合に使用します。親プロセス単体よりも複数プロセスでの総合的な負荷確認に便利です。

実際に処理時間計測を行う例

<?php
$start = getrusage();
// 重い処理の例として大きなループ
for ($i = 0; $i < 10000000; $i++) {
    sqrt($i);
}
$end = getrusage();

$utime = ($end["ru_utime.tv_sec"] - $start["ru_utime.tv_sec"]) +
         ($end["ru_utime.tv_usec"] - $start["ru_utime.tv_usec"]) / 1000000;

echo "処理にかかったユーザーモードCPU時間: {$utime} 秒";
?>

処理開始前後でリソース情報を取得し、処理に消費されたユーザーモードCPU時間を計測する例です。パフォーマンス測定に役立ちます。

関連する関数

  • memory_get_usage – 現在のメモリ使用量をバイト数で取得する
  • microtime – 現在のUnixタイムスタンプを秒単位で取得する
  • proc_get_status – 実行しているプロセスの状態を取得する

まとめ

getrusageはPHPで実行中のスクリプトやその子プロセスのリソース使用状況を詳細に把握できる便利な関数です。CPU時間やI/O回数など多様な情報が得られるため、パフォーマンス分析や負荷監視などに非常に有効です。環境によって取得できる情報が異なる点には注意しつつ、実務での性能改善やリソース管理に活用しましょう。