• 上邪忘川
    2020-11-29
    随便写了一个,比较粗糙 #!/bin/bash cpuinfo1=$(cat /sys/fs/cgroup/cpu,cpuacct/cpuacct.stat) utime1=$(echo $cpuinfo1|awk '{print $2}') stime1=$(echo $cpuinfo1|awk '{print $4}') sleep 1 cpuinfo2=$(cat /sys/fs/cgroup/cpu,cpuacct/cpuacct.stat) utime2=$(echo $cpuinfo2|awk '{print $2}') stime2=$(echo $cpuinfo2|awk '{print $4}') cpus=$((utime2+stime2-utime1-stime1)) echo "${cpus}%"

    作者回复: 赞!

    共 4 条评论
    24
  • Geek2014
    2020-11-27
    多谢老师的分享,之前想去搞明白进程CPU时间的计算,一直没有去花时间研究,今天终于透彻地明白了。 我有个问题不太明白,想请教下,容器运行时比如docker,在做容器化的时候,有没有办法构造出一个和物理机一样的proc文件系统呢?这样的话,容器环境和虚拟机也没啥差别了,物理机上的应用也可以无障碍运行在容器环境中。

    作者回复: 很高兴,这篇文章对你有帮助。 https://github.com/lxc/lxcfs, lxcfs可以为每个容器虚拟一些/proc下的文件,比如/proc/stat

    
    20
  • 东方奇骥
    2020-11-27
    老师,ticks 1s中是100次,这个怎么查呢?

    作者回复: USER_HZ, 可以用命令 "getconf CLK_TCK"拿

    
    16
  • 蒋悦
    2020-11-27
    老师您好, 我有一个问题。根据我的理解,容器的cpu使用就必须要在容器内进行,从宿主机是无法计算的,是这样吗?如果是的,那么,这个监控cpu的代码就需要侵入程序代码(容器中跑的业务代码),这会不会有些无奈啊?另外,这个侵入的代码,所在的线程如果不能被实时调度,则瞬时速度就算的不准确了吧? 望解答。

    作者回复: @蒋悦 > 容器的cpu使用就必须要在容器内进行,从宿主机是无法计算的,是这样吗? 不是这样的,从宿主机也可以得到容器对应的CPU Cgroup里的值。

    
    8
  • 争光 Alan
    2020-12-02
    老师,非常感谢,之前都是模糊知道大概这个意思,这次明白了 另外有个问题: 我当然做监控的时候发现docker stats 和cadvisor(或通过cgroup直接计算)通过cgroup拿到的cpu使用率,内存使用率都是不一样的,您这边知道根本的原因吗?

    作者回复: @争光 Alan 你是指 cpu/memory 使用率在分别在docker stats 和cadvisor里是不一样的? 我们用cadvisor, 看到的结果大致和cgroup差不多,docker stats也是通过cgroup计算的。 你看到的差异有多大?或者你看到的结果,和你自己通过cgroup里的值计算比较一下,哪个更加接近一些?

    共 3 条评论
    4
  • 路一直在
    2021-08-04
    老师,如果计算容器整体的cpu使用率,使用cpuacct.stat是否完整,因为cpuacct.stat中只有us和sys的ticks,其他的类似iowait、idle等的ticks不用计算吗?

    作者回复: 其他的cpu usage, 如io/hi/si等更多的是从宿主机角度统计的,也不能知道这些开销是属于哪个进程的,也就很难放到每一个cgroup里。

    共 2 条评论
    3
  • 水蒸蛋
    2020-12-15
    老师,/sys/fs/cgroup/cpu 和 cpuacc,这2个有什么区别 还有这个获取容器中是获取容器的CPU使用,宿主机是获取宿主机的CPU使用吗

    作者回复: 这两个目录是一样的, lrwxrwxrwx 1 root root 11 Dec 14 23:51 cpu -> cpu,cpuacct lrwxrwxrwx 1 root root 11 Dec 14 23:51 cpuacct -> cpu,cpuacct dr-xr-xr-x 5 root root 0 Dec 14 23:51 cpu,cpuacct

    
    2
  • 笃定
    2021-03-27
    老师问一下,像Prometheus或者k8s自己的metrics server获取到的pod各个资源使用率(cpu men net io)也是这样通过查看进程/proc来计算得出的吗?如果是这样的话,指标数据太多,运算太大会不会也会消耗节点资源呢

    作者回复: cAdvisor就是通过读取sys cgroup 或者 /proc下的状态信息来得到container cpu/mem/net/io metrics的。 一般一个节点上的container数量是小于1000的,metrics获取的周期在10s 的情况下, 这个资源消耗不会很大。

    
    1
  • GCC?
    2020-12-02
    老师,在k8s集群中,使用metrics查看到整个pod的资源用量,这个粒度已经够了吧?我的理解是如果pod内不是单一容器,或者容器内有多个进程,这个时候才应该考虑进程级的cpu用量。

    作者回复: 是的。

    共 2 条评论
    1
  • 李兵
    2021-07-22
    老师,如已经是高负载的情况下。应该会有很多正常的进程被安排在D进程中,如何区分造成高负载的D进程呢?

    作者回复: 如果是单纯的高计算的进程,状态多为R.

    
    