CPU百分比超过100的Docker统计数据



我有一个关于docker Stats命令的疑问,如果有人可以帮助我。我是Docker地区的新手,我想监视Docker容器的CPU使用情况。

物理机具有8个核心(CPU0 ... CPU7)。我已经创建了一个容器,并使用以下命令将其CPU资源限制为1核(CPU0):docker run -itd -cpuset -cpus = 0 -p 8081:8080 binfalse/bives -webapp

i通过发送Jmeter的请求,然后通过Docker Stats命令监视容器的CPU使用情况,这使我的值大于100%。

我不明白为什么只有一个核心分配给容器!您对原因有任何想法吗?此CPU值除了容器之外,是否代表某些系统过程的CPU使用?

事先感谢您的帮助。

Docker版本:客户: 版本:17.06.0-ce API版本:1.30 GO版本:GO1.8.3 git提交:02C1D87 建造:2017年6月23日星期五21:23:31 OS/Arch:Linux/AMD64

服务器: 版本:17.06.0-ce API版本:1.30(最小版1.12) GO版本:GO1.8.3 git提交:02C1D87 建造:2017年6月23日星期五21:19:04 OS/Arch:Linux/AMD64 实验:true

Docker信息结果:容器:2 跑步:1 暂停:0 停止:1图像:10服务器版本:17.06.0-ce存储驱动程序:AUFS root dir:/var/lib/docker/aufs 备份文件系统:extfs DIRS:141 dirperm1支持:伐木司机:JSON-FILcgroup驱动程序:cgroupfs插件: 卷:本地 网络:桥梁主机IPVLAN MACVLAN NULL覆盖 日志:awslogs fluentd gcplogs gelf gelf json-file logentries splunk syslog群:不活跃运行时间:runc默认运行时:runc初始化二进制:Docker-Init集装箱版本:CFB82A876ECC11B5CA0977D1733ADBE5859908AARunc版本:2D41C047C83E09A6D61D464906FEB2A2F3C52AA44初始版本:949E6FA安全选项: Apparmor seccomp 配置文件:默认值内核版本:4.4.0-98代操作系统:Ubuntu 16.04.2 LTSOstype:Linux体系结构:X86_64CPU:8总记忆:15.56GIB名称:logTi048131ID:RHOG:IR6N:FVC4:YDI5:A6T4:QA4Y:DDYF:7HZN:AI3L:WVLE:BNHY:6YNVdocker root dir:/var/lib/docker调试模式(客户端):false调试模式(服务器):false注册表:https://index.docker.io/v1/实验:是真的不安全的注册表: 127.0.0.0/8启用了实时还原:false

警告:无掉期限制支持

在Linux上,CGROUP和DOCKER CPU统计数据在CPU的"时间切片"中交易,CPU已使用的纳秒数量。为了获得百分比,将"使用的时间"的容器cgroup值与/proc/stat的"可用时间"的整体系统值进行了比较。

由于存储的"时间切片"值是累积的,因此将电流值与以前的收集值进行比较以获得更瞬时的百分比。我认为这种比较是问题的基础。

Stats Collection

docker stats命令实际上在客户端中为此信息做了很多腿部工作。对所有容器的客户端查询,观察事件的启动/停止的事件,并为每个运行的容器打开单个统计信息流。这些容器统计流的流用于计算流中每个统计数据的百分比。

对于容器统计流,Docker守护程序首先收集使用CPU时间的系统。然后,它使用libcontainer在容器中读取cgroup文件并将文本分析为值。这是所有统计数据结构。然后全部发送给客户端,作为用于处理的JSON响应。

我认为,至少部分问题源于在不同时间阅读和解析/proc/stat系统信息和容器CGroup统计信息。每当读取容器信息的goroutine延迟一点时,与系统相比,该样品中包含更多的纳秒。由于收集过程计划每x秒运行一次,因此下一个读取包含较少的纳秒,以便值可以在繁忙的系统上反弹,然后返回相同的数量,与第二个中没有完整的" tick"样本。

问题使您运行的容器越多,并且系统获得的越繁忙。收集和转发给客户的统计数据似乎是一个相对重量的过程,只有大量容器的docker stats就足以引起更多的不准确性。我最好的猜测是在Goroutines中的争论,它们都试图阅读统计数据。我不确定这是否可以说明Docker所显示的不准确程度。我要么完全错了,要么还有其他问题增加了问题。

linux cgroups

在cgroup中跟踪每个Docker容器的使用情况。可以通过CGROUP文件系统查看CPU会计信息:

→ find /sys/fs/cgroup/cpuacct/docker -type d
/sys/fs/cgroup/cpuacct/docker
/sys/fs/cgroup/cpuacct/docker/f0478406663bb57d597d4a63a031fc2e841de279a6f02d206b27eb481913c0ec
/sys/fs/cgroup/cpuacct/docker/5ac4753f955acbdf38beccbcc273f954489b2a00049617fdb0f9da6865707717
/sys/fs/cgroup/cpuacct/docker/a4e00d69819a15602cbfb4f86028a4175e16415ab9e2e9a9989fafa35bdb2edf
/sys/fs/cgroup/cpuacct/docker/af00983b1432d9ffa6de248cf154a1f1b88e6b9bbebb7da2485d94a38f9e7e15
→ cd /sys/fs/cgroup/cpuacct/docker/f0478406663bb57d597d4a63a031fc2e841de279a6f02d206b27eb481913c0ec
→ ls -l
total 0
-rw-r--r--    1 root     root             0 Nov 20 22:31 cgroup.clone_children
-rw-r--r--    1 root     root             0 Nov 20 04:35 cgroup.procs
-r--r--r--    1 root     root             0 Nov 20 21:51 cpuacct.stat
-rw-r--r--    1 root     root             0 Nov 20 21:51 cpuacct.usage
-r--r--r--    1 root     root             0 Nov 20 22:31 cpuacct.usage_all
-r--r--r--    1 root     root             0 Nov 20 21:51 cpuacct.usage_percpu
-r--r--r--    1 root     root             0 Nov 20 22:31 cpuacct.usage_percpu_sys
-r--r--r--    1 root     root             0 Nov 20 22:31 cpuacct.usage_percpu_user
-r--r--r--    1 root     root             0 Nov 20 22:31 cpuacct.usage_sys
-r--r--r--    1 root     root             0 Nov 20 22:31 cpuacct.usage_user
-rw-r--r--    1 root     root             0 Nov 20 22:31 notify_on_release
-rw-r--r--    1 root     root             0 Nov 20 22:31 tasks
→ cat cpuacct.usage_percpu
3625488147 6265485043 6504277830 

每个值是该CPU上纳米秒内的累积用法。

→ grep -w ^cpu /proc/stat
cpu  475761 0 10945 582794 2772 0 159 0 0 0

值此处是 USER_HZ == 1/100秒,因此在Docker中获得一些转换。

这是Docker统计如何计算CPU百分比的公式:

Docker Project的代码

cpuPercent = (cpuDelta / systemDelta) * onlineCPUs * 100.0 

其中三角洲计算为currentCPUUsage - previousCPUUsage

最新更新