1.top原理
top 是读的/proc/stat文件 比如cat /proc/PID/stat 进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间 某一进程Cpu使用率的计算 计算方法: 1 采样两个足够短的时间间隔的cpu快照与进程快照,
a每一个cpu快照均为(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;
b每一个进程快照均为 (utime、stime、cutime、cstime)的4元组;
2 分别根据a、b计算出两个时刻的总的cpu时间与进程的cpu时间,分别记作:totalCpuTime1、totalCpuTime2、processCpuTime1、processCpuTime2
3 计算该进程的cpu使用率pcpu = 100*( processCpuTime2 – processCpuTime1) / (totalCpuTime2 – totalCpuTime1) (按100%计算,如果是多核情况下还需乘以cpu的个数);
2.docker stats原理:
Cpu数据: docker daemon会记录这次读取/sys/fs/cgroup/cpuacct/docker/[containerId]/cpuacct.usage的值,作为cpu_total_usage;
并记录了上一次读取的该值为pre_cpu_total_usage;
读取/proc/stat中cpu field value,并进行累加,得到system_usage;
并记录上一次的值为pre_system_usage;
读取/sys/fs/cgroup/cpuacct/docker/[containerId]/cpuacct.usage_percpu中的记录,组成数组per_cpu_usage_array;
docker stats计算Cpu Percent的算法: cpu_delta = cpu_total_usage - pre_cpu_total_usage; system_delta = system_usage - pre_system_usage; CPU % = ((cpu_delta / system_delta) * length(per_cpu_usage_array) ) * 100.0
代码:/docker/docker/api/client/stats.go#141 /docker/docker/daemon/daemon.go#1474
3.lxcfs原理
容器启动时,通过-v 将宿主机上 LXCFS 的挂载点 /var/lib/lxc/lxcfs/proc/ 挂载到容器内部的虚拟 /proc 文件系统目录下。 此时在容器内部 /proc 目录下可以看到,一些列 proc 文件,包括 meminfo, uptime, swaps, stat, diskstats, cpuinfo 等。 具体使用参数如下: -v /var/lib/lxc/lxcfs/proc/cpuinfo:/proc/cpuinfo 此时如果用户在容器内读取 /proc/cpuinfo信息,实际上就读取到了 /var/lib/lxcfs/proc/cpuinfo文件, fuse文件系统将读取 cpuinfo的进程 pid传给 lxcfs,lxcfs通过该 pid找到所属的 cgroup分组,并读取该分组中的 /cgroup/cpu信息并返回。
4.总结:
a) 经过大量测试物理机top和docker里的进程CPU使用率是完全一致的,也分别对比了容器和物理机的/proc/PID/stat和/proc/stat文件的内容, 数据几乎差不多(因为stat文件时刻在变化),而top对cpu的使用率计算方式就是通过这两个文件拿到的数据值。文章来源:https://www.toymoban.com/news/detail-425584.html
b)得出结论,可以在容器内使用top查看进程的cpu使用率。文章来源地址https://www.toymoban.com/news/detail-425584.html
到了这里,关于Docker容器cpu利用率问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!