阿里巴巴网站建设基础服务,163邮箱企业邮箱注册,佛山网站建设的首选,oneup wordpress1.top原理
top 是读的/proc/stat文件 比如cat /proc/PID/stat 进程的总Cpu时间processCpuTime utime stime cutime cstime#xff0c;该值包括其所有线程的cpu时间 某一进程Cpu使用率的计算 计算方法#xff1a; 1 采样两个足够短的时间间隔的cpu快照与进程快照 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传给 lxcfslxcfs通过该 pid找到所属的 cgroup分组并读取该分组中的 /cgroup/cpu信息并返回。
4.总结 a) 经过大量测试物理机top和docker里的进程CPU使用率是完全一致的也分别对比了容器和物理机的/proc/PID/stat和/proc/stat文件的内容 数据几乎差不多因为stat文件时刻在变化而top对cpu的使用率计算方式就是通过这两个文件拿到的数据值。 b)得出结论可以在容器内使用top查看进程的cpu使用率。