Linux系统如何测量特定进程的已流逝运行时长?
进程已流逝时长的正确实现逻辑
你之前的计算方向本身存在偏差:用户态CPU时间+内核态CPU时间是进程实际占用CPU运行的总时长,进程大部分生命周期可能处于休眠、IO等待等不占用CPU的状态,所以这个求和结果必然和真实流逝时长不匹配。
ps命令输出的etime(已流逝时长)计算逻辑非常直接:用当前时间减去进程的启动时间戳,和CPU占用数据完全无关。
基于/proc文件系统的具体实现步骤
- 第一步:读取
/proc/stat第一行的btime字段,获取系统启动时的Unix时间戳,单位为秒。 - 第二步:读取目标进程
/proc/<PID>/stat文件,按空格分割后取第22个字段,得到进程启动时距离系统启动的时钟滴答数。 - 第三步:将时钟滴答数转换为秒:将该字段值除以系统时钟频率,系统时钟频率可以通过
sysconf(_SC_CLK_TCK)接口获取,常规x86平台下默认值为100。 - 第四步:计算进程启动的Unix时间戳 = 系统启动时间戳 + (进程启动滴答数 / 系统时钟频率)
- 第五步:当前系统Unix时间戳减去进程启动时间戳,得到的就是进程从启动到当前的已流逝时长。
已退出进程的时长统计逻辑
如果进程已经终止,/proc/<PID>目录会被系统回收,ps之所以能统计到已退出进程的时长,是因为它读取了进程会计日志、或者进程描述符未被完全回收的残留信息。如果你的业务需要统计已退出进程的全生命周期时长,建议提前开启系统进程会计功能,或者在进程运行阶段主动记录其启动、退出时间戳。
正确性验证
你可以通过简单测试验证逻辑:执行sleep 300 &启动一个后台休眠进程,拿到PID后按上述步骤计算时长,结果和ps -o etime= <PID>输出的时长完全一致。
内容的提问来源于stack exchange,提问作者kinder Hong
相关产品推荐
相关产品推荐

