AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 426972
Accepted
Kiwy
Kiwy
Asked: 2018-02-28 08:36:15 +0800 CST2018-02-28 08:36:15 +0800 CST 2018-02-28 08:36:15 +0800 CST

/proc/[PID]/stat 是否显示有关子进程的累积 CPU 统计信息

  • 772

我不确定是否正确地表达了这个问题,我已经尝试阅读man proc,但我无法找到正确的答案,也找不到简单的方法来验证它。
我尝试获取一个 PID 的 CPU/RAM 消耗,但我不知道程序将投射多少子进程,我想获取 CPU 和 RAM 消耗的总量,而不仅仅是主进程。
我知道事实和经验/proc/[PID]/io确实是通过所有子进程累积的,但我想知道,如果可能的话,如果这同样适用于/proc/[PID]/stat.

proc
  • 1 1 个回答
  • 4311 Views

1 个回答

  • Voted
  1. Best Answer
    Kiwy
    2018-03-13T03:02:55+08:002018-03-13T03:02:55+08:00

    结论:
    如果您不想阅读整个解释,请阅读以下内容:
    是的,/proc/[PID]/stat 中包含的值允许确定进程及其子进程使用的 CPU 时间量。
    但是,您不能将其用于实时监控,因为子 CPU 时间的值仅在子进程死亡时更新。

    说明:
    根据man time时间返回以下统计信息:

    这些统计数据包括 (i) 调用和终止之间经过的实时时间,(ii) 用户 CPU 时间(由 times(2) 返回的结构 tms 中的 tms_utime 和 tms_cutime 值的总和),以及 (iii)系统 CPU 时间(times(2) 返回的 struct tms 中的 tms_stime 和 tms_cstime 值的总和)。

    如果有人阅读man times,可以了解到该结构定义为:

    struct tms {
       clock_t tms_utime;  /* user time */
       clock_t tms_stime;  /* system time */
       clock_t tms_cutime; /* user time of children */
       clock_t tms_cstime; /* system time of children */
    };
    

    这意味着此命令从进程及其所有子进程返回累积的用户和系统 CPU 时间。
    现在我们需要知道我们可以从中提取什么/proc。在man procin 部分中/proc/[PID]/stat,您可以提取以下信息:

    (14) utime %lu
    此进程在用户模式下调度的时间量,以时钟节拍为单位(除以 sysconf(_SC_CLK_TCK))。这包括来宾时间、来宾时间(运行虚拟 CPU 所花费的时间,见下文),以便不知道来宾时间字段的应用程序不会从计算中丢失该时间。
    (15) stime %lu
    此进程在内核模式下被调度的时间量,以时钟滴答为单位(除以 sysconf(_SC_CLK_TCK))。
    (16) cuttime %ld
    此进程的等待子进程已在用户模式下安排的时间量,以时钟节拍为单位(除以 sysconf(_SC_CLK_TCK))。(另见times(2)。)这包括客户时间,cguest_time(运行虚拟CPU所花费的时间,见下文)。
    (17) cstime %ld
    此进程的等待子进程已在内核模式下调度的时间量,以时钟滴答为单位(除以 sysconf(_SC_CLK_TCK))。

    所以基本上这个/proc/[PID]/stat文件包含时间用来确定CPU时间的值(以秒为单位)

    凭借丰富的知识,我尝试像这样运行我的脚本,time load.sh并在脚本末尾添加cat /proc/$$/stat结果如下:

    9398 (load.sh) S 5379 9398 5379 34817 9398 4194304 1325449 7562836 0 0 192 520 3964 1165 20 0 1 0 814903 14422016 1154 18446744073709551615 4194304 5242124 140726473818336 0 0 0 65536 4 65538 1 0 0 17 3 0 0 818155 0 0 7341384 7388228 9928704 140726473827029 140726473827049 140726473827049 140726473830382 0  
    

    命令的输出time:

    real    0m38,783s
    user    0m41,576s
    sys     0m16,866s
    

    根据man proc我们需要查看第 14、15、16 和 17 列:192 520 3964 1165因此,如果我们将进程及其子进程在用户/系统 cpu 中花费的时间相加。

    192+3964 = 4156  <=>  user 0m41,576s
    520+1165 = 1685  <=>  sys  0m16,866s
    

    等等,CPU 时间并不完全是累积的,但是您可以非常准确地(厘秒)计算程序使用的 CPU 时间,并且它的子程序使用/proc/[PID]/stat.

    编辑:
    经过进一步测试并与人们交谈后,我终于得到了答案,我运行了一个仅包含以下内容的脚本:

    #!/bin/bash
    sleep 5
    time stress --cpu 4 -t 60s --vm-hang 15
    sleep 5
    cat /proc/$$/stat | cut -d ' ' -f 14-17
    exit
    

    同时使用watch监控指标/proc/$$/stat。只要子进程未完成,计数器就不会更新。结束时stress,显示的值将更新,并以command 和 14 到 17 列/proc/$$/stat之间的相似结果结束。time/proc

    旧编辑 我虽然结束了,但在做了更多研究后,我尝试了同样的命令stress

    time stress --cpu 4 -t 60s  
    stress: info: [18598] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
    stress: info: [18598] successful run completed in 60s
    real    1m0,003s
    user    3m53,663s
    sys     0m0,349s
    

    在执行过程中,我每秒观察 2 次命令的结果:

    cat /proc/11223/stat | cut -d ' ' -f 14-17
    0 0 0 0
    

    虽然ps faux | grep stress会给我这个特殊的 PID 作为四个stress线程的父亲。

    • 5

相关问题

  • 在 /proc/<pid>/schedstat 中测量单位

  • 永久更改`/proc/acpi/wakeup`

  • 使用 read() 读取 /proc/pid/maps

  • 用空格分割 /proc/pid/stat 的缺点是什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve