CPU 百分比超过 100 的 Docker 统计信息

2024-04-01

我有一个关于 docker stats 命令的问题,如果有人可以帮助我。我是 Docker 领域的新手,我想监控 docker 容器的 cpu 使用情况。

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

我通过从 Jmeter 发送请求来对容器施加压力,然后通过 docker stats 命令监控容器的 CPU 使用情况,该命令给出的值大于 100%。

我不明白为什么即使只有一个核心分配给容器,它也会给出超过 100% 的结果!你知道原因吗?这个cpu值是否代表了除了容器之外的一些系统进程的cpu使用率?

在此先感谢您的帮助。

码头工人版本:客户: 版本:17.06.0-ce API版本:1.30 Go版本:go1.8.3 Git 提交:02c1d87 建成时间:2017 年 6 月 23 日星期五 21:23:31 操作系统/架构:linux/amd64

服务器: 版本:17.06.0-ce API版本:1.30(最低版本1.12) Go版本:go1.8.3 Git 提交:02c1d87 建成时间:2017 年 6 月 23 日星期五 21:19:04 操作系统/架构:linux/amd64 实验:真实

码头工人信息结果:容器:2 跑步:1 暂停:0 已停止:1 图片:10 服务器版本:17.06.0-ce 存储驱动:aufs 根目录:/var/lib/docker/aufs 支持文件系统:extfs 目录:141 Dirperm1 支持:true 日志记录驱动程序:json-file Cgroup 驱动程序:cgroupfs 插件: 音量:本地 网络:桥接主机 ipvlan macvlan null 覆盖 日志:awslogs fluidd gcplogs gelf Journald json-file logentries splunk syslog 群:不活跃 运行时:runc 默认运行时:runc 初始化二进制文件:docker-init 容器版本:cfb82a876ecc11b5ca0977d1733adbe58599088a runc版本:2d41c047c83e09a6d61d464906feb2a2f3c52aa4 初始化版本:949e6fa 安全选项: 阿帕莫尔 安全计算 配置文件:默认 内核版本:4.4.0-98-generic 操作系统:Ubuntu 16.04.2 LTS 操作系统类型:linux 架构:x86_64 CPU:8 总内存:15.56GiB 名称: logti048131 ID: RHOG:IR6N:FVC4:YDI5:A6T4:QA4Y:DDYF:7HZN:AI3L:WVLE:BNHY:6YNV Docker 根目录:/var/lib/docker 调试模式(客户端): false 调试模式(服务器): false 注册表:https://index.docker.io/v1/ https://index.docker.io/v1/实验:真实 不安全的注册表: 127.0.0.0/8 启用实时恢复: false

警告:不支持交换限制


在 Linux 上,cgroups 和 Docker CPU 统计数据处理 CPU 的“时间片”,即 CPU 已使用的纳秒数。要获取百分比,请将容器 cgroup 的“已用时间”值与“可用时间”的整体系统值进行比较:/proc/stat.

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

统计数据收集

The docker stats命令实际上在客户端中为这些信息做了很多跑腿工作。客户端查询所有容器,监视容器启动/停止的事件以及打开个人统计数据流 https://docs.docker.com/engine/api/v1.33/#operation/ContainerStats对于每个正在运行的容器。这些容器统计数据流用于计算百分比 https://github.com/docker/cli/blob/1401d5daf2f49a97791487dd5c5a8598907f0bf1/cli/command/container/stats_helpers.go#L168-L185在流中的每个统计数据转储上。

对于容器统计数据流,Docker 守护进程收集系统使用的CPU时间 https://github.com/moby/moby/blob/76531ccdeb5850156150b88c6a4a56bb8c35dc44/daemon/stats/collector.go#L75第一的。然后它使用 libcontainer 来读入容器 cgroup 文件并将文本解析为值 https://github.com/opencontainers/runc/blob/52454cf90807727923b375afd7d84ac8fd523959/libcontainer/cgroups/fs/cpuacct.go#L72。这里有所有统计数据结构 https://github.com/opencontainers/runc/blob/7139b61f7fdb904d0acb8db825709aa8d2d2ef36/libcontainer/cgroups/stats.go。然后将其作为 JSON 响应发送到客户端进行处理。

我相信至少部分问题源于阅读和解析/proc/stat不同时间的系统信息和容器 cgroup 统计信息。每当读取容器信息的 goroutine 延迟一点时,与系统相比,该样本中会包含更多的纳秒。由于收集过程计划每 X 秒运行一次,因此下一次读取将包含更少的总纳秒,因此这些值可以在繁忙的系统上反弹,然后回落相同的量,因为第二次读取中没有包含完整的“刻度”样本。

运行的容器越多,系统就越繁忙,这个问题就会变得更加复杂。统计数据收集和转发给客户端似乎是一个相对重量级的过程,只是docker stats大量容器足以导致更多的不准确性。我最好的猜测是所有试图读取统计数据的 goroutine 中存在争用。我不确定这是否能解释 Docker 显示的不准确程度。我要么完全错了,要么还有其他问题加剧了这个问题。

Linux cgroup

每个 Docker 容器的使用情况都在cgroup https://en.wikipedia.org/wiki/Cgroups。 CPU记账信息可以通过cgroup文件系统查看:

→ 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 http://man7.org/linux/man-pages/man5/proc.5.html== 1/100 秒,因此在 Docker 中进行一些转换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CPU 百分比超过 100 的 Docker 统计信息 的相关文章

随机推荐

  • SwiftUI 表在 macOS Big Sur 上没有动画解雇

    我希望工作表解雇动画就像外观一样 但相反 我想这也是标准行为 例如 当您创建新文件时 您可以在 Xcode 中看到它 但正如你所看到的 它只是消失而没有动画 这是我的代码 struct ContentView View State var
  • 如何通过 PHP 执行 WKHTMLTOPDF?

    以前已经在某种程度上问过这个问题 但没有解决方案或可接受的答案 我想尝试更全面地回答我的问题 因此 我正在尝试通过 PHP 在共享服务器上启动并运行 WKHTMLTOPDF 在本例中为 MediaTemple gs 根据主机的说法 这没有理
  • 您可以在 Google Big Query 中使用带空格的字段别名吗

    我们需要为字段创建描述性别名 理想情况下 我们希望创建带有空格的别名的视图 这可能吗 我们应该怎么做 例子 选择单词 单词数 字数 来自 publicdata samples shakespeare LIMIT 1000 不 BigQuer
  • jQuery:仅当元素没有类名时才选择它

    如何使用 jQuery 仅在没有任何类的情况下选择元素 我正在编写一个页面 允许 html 作者通过向元素添加一个类来覆盖默认的 jQuery 操作 它应该是任何班级 所以标记可能是 ul li class override li li l
  • Visual Studio 2013 和 TFS Build 2015:Devenv.exe 无法生成 MSI 文件

    我们正在将 TFS 2013 服务器升级到 TFS 2015 在这方面 当我尝试使用我们的 XAML 模板构建脚本 已创建 在新版本的构建代理上执行应用程序构建时遇到了问题在 TFS 2013 中 我们的大多数解决方案在构建时都使用上述模板
  • jQuery jeditable 点击触发

    我需要在我的应用程序中使用内联编辑 为此 我使用 jQuery 的 Jeditable 插件 我想仅在单击元素时触发该元素的可编辑模式 这是我的代码 不起作用 var tet edit client click function event
  • 使用 gradle 编译时如何将构建目录作为 intellij 中的源目录包含在内

    默认情况下 gradle idea 插件将构建文件夹标记为排除 如何将此文件夹包含为源文件夹 或者避免排除它 因为它似乎是默认的 在我的模块 build gradle 文件中 我尝试了以下两种配置 idea module excludeDi
  • Tkinter Grid:如何定位小部件以使它们不会粘在一起

    我正在尝试创建两个位于测试用户界面左上角和右上角的标签小部件 问题是小部件粘在一起 我希望它们之间有空间 在我的研究中 我遇到了使用 Sticky padx 和 pady 选项的建议 但无论我传递给 grid 的参数是什么 我似乎都无法在小
  • 为什么弹出到 root 在此示例代码 SwiftUI 中不起作用?

    为了解决这个问题 我提供了最少的示例代码来重新创建错误 只需复制 粘贴即可运行 import SwiftUI final class Popper ObservableObject Published var shouldProceed S
  • 由于 REPO url 被阻止,Primefaces 依赖项无法导入

    我正在开发一个基于 Maven 的 Spring 项目 我为 Primefaces 添加了以下依赖项
  • Angular Reactive Forms Control:如何绑定单选按钮?

    我在用着ReactiveFormsModuleAngular2 创建一个包含表单的组件 这是我的代码 foo component ts constructor fb FormBuilder this myForm fb group name
  • Android WebView 需要打开外部 URL 的权限吗?

    我正在尝试以下示例 但使用外部 URL 使用 WebView http android developers blogspot com 2008 09 using webviews html 该示例展示了如何从资产文件夹 file url
  • 2 个 div 50% 内联块彼此不相邻

    我对这个盒子模型有疑问 我只在 Blackberry 4 6 上遇到此问题 但在 jsbin jsfiddle 上也出现此问题 这 2 个 div 应该是 50 因此直接相邻 但最后一个出现故障 jsbin http jsbin com o
  • 在 C++ 中实现等价关系(使用 boost::disjoint_sets)

    假设您有许多元素 并且需要跟踪它们之间的等价关系 如果元素A等价于元素B 则它等价于B所等价的所有其他元素 我正在寻找一种有效的数据结构来编码这些信息 应该可以通过与现有元素的等价来动态添加新元素 并且根据该信息应该可以有效地计算新元素等价
  • F# 类型提供程序用例

    我很难掌握类型提供者 我想获得一些关于类型提供程序方法对于以下用例的有用性的反馈 非常不幸的是 我们的遥测 API 返回对象为List
  • (Python) Flask - request.args.get 返回 NoneType

    我需要完成这个网站的就是让它抓住n and s来自输入的值 但是执行时request get args每次都返回 None 这是代码 my website py import sqlite3 from flask import Flask
  • ConstraintLayout 1.1.0 与 1.0.2 不同,是一个 bug 吗?

    如果我使用1 0 2 则3个图像的宽度是平均的 并且它们的高度是由我设置的收音机计算的 如果我使用1 1 0 它们的高度是0dp我什么也看不见 除非我设置 android layout height match parent 在根部Cons
  • 在Java中如何比较双精度数序列都“近似相等”?

    我在java中有一个返回双精度数字的方法 我想比较每次调用该方法 比如5次 返回的每个双精度数字 这样我就可以得出结论 每次返回的数字几乎相同 我怎样才能做到这一点 public static boolean almostEqual dou
  • Spring Data Elastic 从 3.x 迁移到 4.x 的索引问题

    在我们使用的整体应用程序中JHIPSTER 6 10 5 我们正在使用Spring Data Elastic 版本 3 3 1 with 弹性搜索版本 6 8 8 我们有多个 ManyToOne and OneToMany与 100 多个实
  • CPU 百分比超过 100 的 Docker 统计信息

    我有一个关于 docker stats 命令的问题 如果有人可以帮助我 我是 Docker 领域的新手 我想监控 docker 容器的 cpu 使用情况 物理机有 8 个核心 CPU0 CPU7 我已经创建了一个容器 并使用以下命令将其 c