Featured image of post 正确拿到容器的CPU开销

正确拿到容器的CPU开销

Linux系统资源状态存放位置

整个系统的状态:/proc/stat

某个进程的状态:/proc/[pid]/stat

ticks的概念

Linux 有自己的始终,它会周期的产生中断。每次中断都会触发 Linux 内核去做一次进程调度,一次中断就是一个 tick。因为中断是周期性的。可以通过 getconf CLK_TCK命令获取,一般这个值是100,即1秒钟产生100次中断。

CPU 开销计算

在stat文件中有很多字段,有进程的运行状态,父进程 pid,进程优先级,进程内存占用等50多项信息。

对于CPU的开销,主要是第14项的 utime 和第15项的 stime。

  • utime:进程在用户态获取到的ticks数。

  • stime:进程在内核态获取到的ticks数。

这两个值是一个累计数,在进程启动的开始计算。假如utime数为100,即在用户态运行了1秒。一般我们的系统是1秒钟产生100次中断,所以在计算CPU开销的时候以一秒钟为时间间隔来计算。每一秒中查询stat中的utime和stime,以此得到一下公式:

CPU使用率 = ((utime2-utime1)+(stime2-stime1)) * 100 / (HZ * et * 1)

  • HZ:为 ticks 的发生频率,一般系统值为 100 。getconf CLK_TCK命名可以获取。

  • et:时间间隔,即utime2 和 utime1 的发生的时间间隔,因为我们是1秒钟获取一次,所以值为1。

  • 1:表示一个CPU所包含的ticks数。

假如:utime_1 = 399,stime_1=0,utime_2=600,stime_2=0。

201% = ((600-399)+(0-0)) * 100 / (100 * 1 * 1),即占用了 2 个CPU。

系统的cpu

/proc/stat 目录下:

commang-grep-cpu.png

代表的 ticks:

ticks-summary-table.png

容器中的CPU

/sys/fs/cgroup/cpu,cpuacct/system.slice目录下找到对应容器id的目录下的 cpuacct.stat 文件。里面的内容就是 user 是用户空间的ticks数,system 是内核态的 ticks 数。代入公式计算即可。

cat cpuacct.stat; sleep 1;cat cpuacct.stat

user 19900372 system 20014530

Licensed under CC BY-NC-SA 4.0