当前位置: 首页> 最新文章列表> getrusage() 返回的数据单位解析

getrusage() 返回的数据单位解析

M66 2025-07-08
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 本文无关的程序部分</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"欢迎阅读 PHP 技术文章。\n"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>

<hr>

<h1></span><span><span class="hljs-title function_ invoke__">getrusage</span></span><span>() 返回的数据单位解析</h1>

<p>在 PHP 中,<code></span><span><span class="hljs-title function_ invoke__">getrusage</span></span><span>()

这段代码将输出类似如下的内容(不同系统可能略有差异):


</span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [ru_utime.tv_sec] => </span><span><span class="hljs-number">0</span></span><span>
    [ru_utime.tv_usec] => </span><span><span class="hljs-number">123456</span></span><span>
    [ru_stime.tv_sec] => </span><span><span class="hljs-number">0</span></span><span>
    [ru_stime.tv_usec] => </span><span><span class="hljs-number">7890</span></span><span>
    [ru_maxrss] => </span><span><span class="hljs-number">34560</span></span><span>
    ...
)

2. 字段及单位说明

  • ru_utime.tv_sec / ru_utime.tv_usec
    表示用户态 CPU 时间,分别以秒和微秒为单位。可将二者相加获得精确的用户态耗时。
  • ru_stime.tv_sec / ru_stime.tv_usec
    表示内核态 CPU 时间,单位同上。
  • ru_maxrss
    表示进程所使用的最大常驻集大小(Max Resident Set Size)。在 Linux 上,单位是 KB(千字节);在 macOS 上,单位是字节,需要特别留意。
  • ru_ixrss、ru_idrss、ru_isrss
    这几个字段理论上表示共享内存、未共享数据内存、未共享栈的内存使用量,但通常在现代系统中不可用,返回值为 0
  • ru_minflt / ru_majflt
    页面错误(缺页异常)的次数,单位是“次数”,不是时间。
  • ru_nswap
    进程进行交换的次数,单位也是“次数”。
  • ru_inblock / ru_oublock
    块输入/输出操作的次数(例如文件系统的读写),单位是“块操作的次数”,不是字节。
  • ru_msgsnd / ru_msgrcv
    发送和接收消息的次数,单位是“次”。
  • ru_nsignals
    接收到的信号数量。
  • ru_nvcsw / ru_nivcsw
    自愿/非自愿上下文切换的次数。

3. 单位换算示例

假设我们想获取总的用户态 CPU 时间,可以这样写:


</span><span><span class="hljs-variable">$usage</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getrusage</span></span><span>();
</span><span><span class="hljs-variable">$user_time</span></span><span> = </span><span><span class="hljs-variable">$usage</span></span><span>[</span><span><span class="hljs-string">"ru_utime.tv_sec"</span></span><span>] + </span><span><span class="hljs-variable">$usage</span></span><span>[</span><span><span class="hljs-string">"ru_utime.tv_usec"</span></span><span>] / </span><span><span class="hljs-number">1e6</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"用户态耗时: <span class="hljs-subst">{$user_time}</span></span></span><span> 秒\n";

类似地,可对内核态时间执行相同操作,从而获得进程 CPU 使用总时间。

4. 注意事项

  • 不同操作系统返回的单位可能不同,特别是 ru_maxrss 字段。
  • 某些字段在特定平台上始终为 0,这是由于系统实现不支持该数据收集。
  • getrusage() 不会告诉你内存峰值的实时数据,更适合用于性能分析,而非资源限制控制。

结语

getrusage() 是 PHP 提供的一个深入了解脚本资源消耗情况的重要工具。理解其返回值的含义和单位,有助于开发者进行更细致的性能调优与监控。