当前位置: 首页 > news >正文

Docker容器cpu利用率问题

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的使用率计算方式就是通过这两个文件拿到的数据值。

  b)得出结论,可以在容器内使用top查看进程的cpu使用率。

http://www.lryc.cn/news/24771.html

相关文章:

  • FreeRTOS入门(06):任务通知
  • 谷歌seo做的外链怎样更快被semrush识别
  • Java | IO 模式之 JavaBIO 应用
  • C语言学习及复习笔记-【18】C内存管理
  • linux--多线程(一)
  • 计算机组成原理(2.1)--系统总线
  • C语言数组【详解】
  • 并行与体系结构会议
  • 【巨人的肩膀】JAVA面试总结(三)
  • 嵌入式 STM32 SHT31温湿度传感器
  • 哪款蓝牙耳机打电话好用?打电话音质好的蓝牙耳机
  • 【C++】-- 内存泄漏
  • C++ STL学习之【string类的模拟实现】
  • Selenium基于POM的自动化测试实践
  • 记录每日LeetCode 2373.矩阵中的局部最大值 Java实现
  • QT中级(6)基于QT的文件传输工具(2)
  • 【Linux】工具(3)——gcc/g++
  • Android文件选择器
  • 《MySql学习》 Select 查询语句慢的非性能原因
  • Vue组件间通信方式超详细(父传子、父传后代、子传父、后代传父、兄弟组件传值)
  • 【ES】Elasticsearch-深入理解索引原理
  • pdf压缩文件大小的方法是什么?word文件怎么批量转换成pdf格式?
  • 论文阅读——FECANet:应用特征增强的上下文感知小样本语义分割网络
  • 数组模拟常见数据结构
  • ADC0832的AD模数转换原理及编程
  • 【工具插件类教学】UnityPackageManager私人定制资源工具包
  • 【软件测试】2023年了还不会接口测试?老鸟总结接口测试面试谁还敢说我不会......
  • 类Vuex轻量级状态管理实现
  • Java 基本数据类型
  • 全网资料最全Java数据结构与算法-----算法分析