热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Prometheus+grafana监控:cAdvisor输出的容器CPU相关的指标的解读

概述对容器中的服务进行监控,常见方案是采用Prometheusgrafana。其中对容器服务的CPU的监控有一组指标,本文对它们进行了一些分析和解读&

概述

对容器中的服务进行监控,常见方案是采用Prometheus+grafana。其中对容器服务的CPU的监控有一组指标,本文对它们进行了一些分析和解读,并做了一些试验。


查看cAdvisor输出的容器CPU监控指标

我们使用kubernetes进行管理,自带了容器监控cAdvisor exporter,可以直接通过页面查看监控指标,例如直接访问一台IP为172.18.12.188的node节点:

http://172.18.12.188:4194/metrics

直接在页面中搜索以 container_cpu 开头的指标,如下表所示:


名称类型单位说明
container_cpu_usage_seconds_totalcounter

秒数

该容器服务针对每个CPU累计消耗的CPU时间。如果有多个CPU,则总的CPU时间需要把各个CPU耗费的时间相加

container_cpu_user_seconds_totalcounter

秒数

该容器服务累计消耗的用户(user)CPU时间

container_cpu_system_seconds_totalcounter

秒数

该容器服务累计消耗的系统(system)CPU时间

container_cpu_cfs_throttled_seconds_totalcounter

秒数

cfs 是完全公平调度器(Completely Fair Scheduler)的缩写,是Linux的一种控制CPU资源占用的机制,可以按指定比例分配调度CPU 的使用时间。这个指标指的是该容器服务被限制使用的CPU时间

container_cpu_cfs_throttled_periods_totalcounter

个数

文档注释是:“Number of throttled period intervals.”,解释为被限制/节流的CPU时间周期数。

container_cpu_cfs_periods_totalcounter

个数 

文档注释是:“Number of elapsed enforcement period intervals。”,应该解释为已经执行的CPU时间周期数。

container_cpu_load_average_10sgauge 文档注释是:“Value of container cpu load average over the last 10 seconds.”应该解释为过去10秒内的CPU负载的平均值。

 


用Grafana查看容器CPU指标

以我们部署在容器中的某自己开发的服务 cloud-bdp-interface为例,在grafana的dashborad中配置如下查询:

因为CPU指标是计数器(counter)类型,所以grafana 的metrics的配置用到 rate函数:

rate(container_cpu_usage_seconds_total{name=~"k8s_cloud-bdp-interface.*"}[5m])rate(container_cpu_user_seconds_total{name=~"k8s_cloud-bdp-interface.*"}[5m])

grafana查到的原始数据是:


container_cpu_usage_seconds_total

{beta_kubernetes_io_arch="amd64",beta_kubernetes_io_os="linux",container_name="cloud-bdp-interface",cpu="cpu00",id="/kubepods/burstable/pod84ab880d-bc9f-11e8-abe2-fa163e6f3f6b/93069e41ed1ac7181fa69732736f927ebe8764b560ba281c9d392a5333c30020",image="reg.docker.tb/huawei/bdp@sha256:975ac36a806f39d75ea992967b63ded54bd7b9798e2f5109511953681cc1fe53",instance="k8s-node-1",job="kubernetes-cadvisor",kubernetes_io_hostname="k8s-node-1",name="k8s_cloud-bdp-interface_cloud-bdp-interface-5b9bbc567f-xkvpj_docker-new40_84ab880d-bc9f-11e8-abe2-fa163e6f3f6b_0",namespace="docker-new40",pod_name="cloud-bdp-interface-5b9bbc567f-xkvpj"}

同一个节点上的同一个服务,不同cpu的占用时间都有计量和统计,如下:

由此可见,要得到该容器服务的CPU使用的总的情况,需要对所有CPU求和,即:

sum(rate(container_cpu_usage_seconds_total{name=~"k8s_cloud-bdp-interface.*"}[5m]))

 


container_cpu_user_seconds_total 

{beta_kubernetes_io_arch="amd64",beta_kubernetes_io_os="linux",container_name="cloud-bdp-interface",id="/kubepods/burstable/pod84ab880d-bc9f-11e8-abe2-fa163e6f3f6b/93069e41ed1ac7181fa69732736f927ebe8764b560ba281c9d392a5333c30020",image="reg.docker.tb/huawei/bdp@sha256:975ac36a806f39d75ea992967b63ded54bd7b9798e2f5109511953681cc1fe53",instance="k8s-node-1",job="kubernetes-cadvisor",kubernetes_io_hostname="k8s-node-1",name="k8s_cloud-bdp-interface_cloud-bdp-interface-5b9bbc567f-xkvpj_docker-new40_84ab880d-bc9f-11e8-abe2-fa163e6f3f6b_0",namespace="docker-new40",pod_name="cloud-bdp-interface-5b9bbc567f-xkvpj"}
 

从返回的数据看, container_cpu_user_seconds_total 不再区分不同的CPU,已经针对所有CPU进行了合并,是个总的user CPU时间。直接用 rate 就可以得到不同容器服务的CPU的user时间。


一些试验

我们用了一个自己开发的测试容器服务 cloud-bdp-interface。虽然虚机节点的CPU是8核,但我们用k8s限制其使用为2核。我们可以用实验测试一下,在实际运行时,这个2核的限制是否有效。具体方法如下:

登录到该容器服务中,可参见文章:https://blog.csdn.net/palet/article/details/82627658

在命令行输入如下命令,模拟一个无限循环的进程,把所有能用的CPU占满:

echo 'while True: pass'|python &

用top命令,可以看到CPU占用为99.9%,可以理解为占用了CPU的1核

进一步加大压力,同时运行三个无限循环的进程:

echo 'while True: pass'|python &
echo 'while True: pass'|python &
echo 'while True: pass'|python &

用top命令看CPU占用情况如下: 

可以看到每个进程占用66.6%,三个进程加起来占用约200%,应该就是CPU的2核。

进一步查看grafna监控的指标,metrcs设置是:

sum(rate(container_cpu_usage_seconds_total{name=~"k8s_cloud-bdp-interface.*"}[5m]))
rate(container_cpu_user_seconds_total{name=~"k8s_cloud-bdp-interface.*"}[5m])
rate(container_cpu_system_seconds_total{name=~"k8s_cloud-bdp-interface.*"}[5m])
rate(container_cpu_cfs_throttled_seconds_total{name=~"k8s_cloud-bdp-interface.*"}[5m])

 监控结果如下:

可以看到,该容器服务的CPU占用,usage指标和user指标都约等于2.0, 也就是占用了2个CPU核心


小结

一般要对指定的容器服务进行监控,看一下 container_cpu_usage_seconds_total 指标就可以了。指标的格式如下:

sum(rate(container_cpu_usage_seconds_total{name=~"xxxxxxxxxxxxxxx.*"}[5m]))

要深入分析,可以再单独看 user CPU时间, system CPU时间等等,用如下指标格式:

rate(container_cpu_user_seconds_total{name=~"xxxxxxxxxxxxxxx.*"}[5m])

rate(container_cpu_system_seconds_total{name=~"xxxxxxxxxxxxxxx.*"}[5m])

 


附:CPU相关指标的原始注释

# HELP container_cpu_usage_seconds_total Cumulative cpu time consumed per cpu in seconds.
# TYPE container_cpu_usage_seconds_total counter

 

# HELP container_cpu_user_seconds_total Cumulative user cpu time consumed in seconds.
# TYPE container_cpu_user_seconds_total counter

 

# HELP container_cpu_cfs_periods_total Number of elapsed enforcement period intervals.
# TYPE container_cpu_cfs_periods_total counter

 

# HELP container_cpu_cfs_throttled_periods_total Number of throttled period intervals.
# TYPE container_cpu_cfs_throttled_periods_total counter

 

# HELP container_cpu_cfs_throttled_seconds_total Total time duration the container has been throttled.
# TYPE container_cpu_cfs_throttled_seconds_total counter

 

# HELP container_cpu_load_average_10s Value of container cpu load average over the last 10 seconds.
# TYPE container_cpu_load_average_10s gauge

 

# HELP container_cpu_system_seconds_total Cumulative system cpu time consumed in seconds.
# TYPE container_cpu_system_seconds_total counter

 

 


推荐阅读
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 点击上方“新机器视觉”,选择加”星标”或“置顶”重磅干货,第一时间送达很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习,做 ... [详细]
  • 现象:[root@localhost~]#dockerrun-d-p9000:80centos:httpdbinsh-cusrlocalbinstart.shd5b2bd5a7bc ... [详细]
author-avatar
泽儿0818_833
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有