【升职加薪秘籍】我在服务监控方面的实践(3)-机器监控

大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到github.com/HobbyBear/performance-analyze,接下来这段时间我将在之前内容的基础上,结合自己在公司生产上构建监控系统的经验,详细的展示如何对线上服务进行监控,内容涉及到的指标设计,软件配置,监控方案等等你都可以拿来直接复刻到你的项目里,这是一套非常适合中小企业的监控体系。

在前一节我们搭建好了监控组件,今天我们就来完成机器这一层次的监控。目前已经有现有的暴露系统指标的软件node-exporter ,并且我们在上一节已经搭建完毕, 在这一节里,我将会讲解如何利用暴露出来的这些指标构建一个自定义的系统监控模板。

本节构建的自定义的监控模板文件已经上传到github,可直接导入使用

github.com/HobbyBear/easymonitor/blob/main/grafanadashbord/system_dashboard.json

监控指标

如何选择node-exporter暴露的监控指标,我们可以按照四大黄金指标给出的维度进行筛选,并且promql语句也不用我们从头写,已经有现有的监控模板可使用。 我们只需要搭建好prometheus ,grafana后导入模板即可。我们用到的监控模板是node exporter full。

导入导出模板的步骤网上很多教程,我就不再重复造轮子了。

2061688700369_.pic.jpg

由于node exporter full模板里的监控面板实在太多,我们只需要选取其中的某些面板即可。

注意下,虽然使用的是别人已经写好的监控模板,但是我们仍然是以四大黄金指标为指导,选择监控的维度以及监控面板。四大黄金指标分别是延迟,流量,饱和度,错误数。

cpu

接着我们来挨个分析下需要用到的监控指标,首先我们来看下对cpu的监控。一般硬件指标是没有延迟这个维度,所以我们看流量,饱和度,错误数。**针对cpu而言,其实主要就是看饱和度和错误数,饱和度也就是cpu的使用率,如果cpu的使用率越高,说明cpu越趋于饱和。

cpu的使用率是通过读取proc文件系统获取的。一般会将cpu的使用率按用途进行分类,用top命令也可以看到cpu使用率的分类情况

%Cpu(s):  2.4 us,  1.0 sy,  0.0 ni, 96.2 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st

我们挨个看下各种分类的含义:

1, us 代表用户态进程消耗的cpu。

2,sy 代表 内核态程序消耗的cpu。

3,ni 代表低优先级的进程消耗的cpu,当我们使用renice命令调低某个用户进程的优先级时,该用户进程cpu占用率会从us里分到ni里。这样当一批非常吃CPU的进程被调整nice值后,调整的人就能非常清楚的知道,这些进程现在占用多少CPU了。

4,id 代表代表空闲cpu的占用率。

5,wa 代表进程等待cpu执行所花的时间占cpu周期的时长。

6, hi 代表处理硬件中断的cpu占用率。

7,si 代表软中断的cpu使用率,在linux上,会运行一个特定的进程ksoftirqd 处理软中断的逻辑,软中断你可以把它理解成也是一段程序,不过这段程序运行特点的某些软中断的任务,linux内核为了方便观察这些任务的耗时,专门在cpu使用率里分出一个类别来记录这些软中断的任务运行的cpu占用率。 软中断的任务有多种类型,比如定时器,网络数据包的处理等。

8,st 代表从其他操作系统那里偷取到的cpu,一般在虚拟化环境比如物理主机上部署多台虚拟机或者云主机的条件下,一台虚拟机能够从另一台虚拟机那里抢占cpu,st就代表抢占cpu的时长。

在node exporter full里我们选用了一个cpu的面板,把上述cpu的使用率及其分类后的使用率表现了出来。

截屏2023-07-07 13.47.33.png

其中用到的prometheus的查询语句promql有8个,分别对应8种cpu使用率的分类,其中irq就是我们说的硬件中断cpu占用率,其余分类都是我们刚刚介绍的分类的完整名称。

拿其中一个计算cpu内核态程序cpu使用率的promql举例:

sum by(instance) (irate(node_cpu_seconds_total{instance="$node",job="$job", mode="system"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance="$node",job="$job"}[$__rate_interval])))

node_cpu_seconds_total 指标是我们部署的node-exporter 服务暴露给prometheus服务器的指标,指标类型是counter类型。__rate_interval 是grafana的内置变量,grafana会根据样本的抓取间隔和面板筛选的时间范围自动算出一个合适的值作为rate函数的参数,以便我们得到合适的曲线。

整个promql语句代表的含义就是看 内核态程序在过去__rate_interval 时间内的cpu使用周期占cpu过去__rate_interval 时间内 总的周期时长 的百分比作为内核态程序cpu的占用率。

其余分类的cpu使用率和这个例子的promql语句类似,就不一一分析了。

内存

再来看看内存的指标是怎么样的, 对于内存而言,没有流量以及延迟 饱和度是内存使用空间大小,错误数我们主要看缺页错误以及oom kill的次数

内存占用空间大小

看内存使用空间,我们拿top命令输出的内容举例

KiB Mem : 24521316 total,   327428 free, 18130784 used,  6063104 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4672160 avail Mem 

第一行分别代表了total 总内存字节,free 空闲内存字节数,used已经使用的内存字节数,buff/cache 缓存的内存字节数,buff/cache 一般是指读写磁盘或者读写文件时,内核为了平衡写入内存与写入磁盘的速率差引入的缓冲区。

第二行代表的是交换空间的信息,交换空间是指内核为了防止进程突增的内存超过系统内存引入的一片磁盘空间,它能够在内存不足时 将内存中的信息交换到磁盘,在内存空闲时,将磁盘中的信息换回到内存里。

total代表交换空间总的大小,free是交换空间可用的字节大小,used代表使用了的交换空间字节数,avail Mem代表可以交换到磁盘上的物理内存大小,当物理内存不足时,会将这部分内存交换到磁盘上。

内存的监控面板同样我们也是从node exporter full 里找一个就行。

2081688713660_.pic.jpg
由于内存是可增可减的,所以是个guage类型的指标,相应的指标信息也是从proc文件系统获取到的,其路径是 /proc/meminfo ,对应的promql语句不用使用什么函数只需要将对应的指标值加减即可,比较容易理解,我就不具体分析,下面是其中一个时间线的查询语句:

node_memory_Cached_bytes{instance="$node",job="$job"} + node_memory_Buffers_bytes{instance="$node",job="$job"} + node_memory_SReclaimable_bytes{instance="$node",job="$job"}

page fault 和oom kill次数

其中page fault分major fault和minor fault 。

major fault是指在分配内存时,内存地址即不在虚拟地址空间也不在物理内存中的情况,这种情况需要将数据从磁盘读到物理内存里并建立映射关系。

minor fault 是指分配内存时,内存地址不在虚拟地址空间,但是已经在物理内存中了,这种情况只需要将虚拟地址和物理地址建立映射就行,比如多个进程共享内存的情况,可能某些进程还没有建立起映射关系,所以访问时会出现minor page fault。

监控面板如下:

2221688968695_.pic.jpg
oom killer 显示的就是进程由于内存溢出被系统内核kill掉的次数。

这两个指标都是递增的,索引是counter类型,我们可以使用irate或者rate函数就能构建其随时间变化的速率了,具体promql语句我就不再解释了。

磁盘

紧接着,我们来看看对磁盘的监控,磁盘可以通过磁盘的iops,吞吐量显示流量,通过磁盘的空间反映饱和度,通过等待读写磁盘请求的时间来侧面反应延迟情况。

涉及到几个指标具体含义如下:

1,磁盘的使用空间 : 这个很容易理解,当磁盘要满了,就必然存不进新的数据了。

2, iops : 这个指标是指磁盘每秒读写请求的次数,一般我们在云服务商那里都能看到对应磁盘的这个值,当达到峰值时,会影响磁盘的读写性能。

3, 吞吐量: 这个值代表磁盘每秒写入写出的流量,也就是每秒读写了多少字节数,这个值也是不同磁盘有不同的极限值,当磁盘吞吐量达到最大值后,也会影响到磁盘的性能。

4, 等待时间: 磁盘的读写请求本质上也是排队进行的,它们在队列中会有一个等待时间。

同样的,我们从node exporter full这个模板里选择4个面板来监控它们,

截屏2023-07-07 15.26.58.png

2091688715032_.pic.jpg

2101688715090_.pic.jpg

2231688971299_.pic.jpg

磁盘空间是一个guage类型的指标,而iops和吞吐量,等待时长都是一个counter类型用irate函数取的速率,promql语句比较简单,这里就不再继续展开了。

网络

接着,我们看下在网络方面应该对哪些指标进行监控,网络数据包的发送涉及到网卡的能力,网卡能力也是有极限的,网络的延迟一般体现在接口上,我们不用在系统层面展示,流量可以用pps来表示,饱和度可以用带宽来表示,错误数可以通过网卡以及tcp层面暴露的错误信息来表示 ,涉及到的指标含义如下:

1,带宽 :这个和磁盘吞吐量比较类似,是单位时间内传输的字节数,不过单位一般是bit/s 和字节的换算 8 * bit/s = 1 B/s

2, pps : 每秒的收发包数量。

这两个值也是在你购买不同规格的网络时有不同的极限值,我们需要注意监控指标是否和极限值比较接近的情况,达到极限值后会影响网络的性能。

这两个指标同样能够从监控模板里找到对应的面板,

2111688716099_.pic.jpg

2121688716156_.pic.jpg
两个指标都是counter类型,promql表达式用rate或者irate取值既可以看到pps或者流量速率了。

网卡层面和tcp层面暴露的错误信息

网卡层面暴露的错误原理和ifconfig 看到网卡的错误次数一致, RX errors 和 TX errors分别代表读写发生错误的次数。

// ifconfig 输出结果
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.94  netmask 255.255.255.0  broadcast 192.168.0.255
        ether fa:16:3e:ed:d6:94  txqueuelen 1000  (Ethernet)
        RX packets 218761044009  bytes 151837637636460 (138.0 TiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 198948059963  bytes 110561548482730 (100.5 TiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tcp 层面错误统计原理是从/proc/net/netstat读取到相关信息。

2161688719371_.pic.jpg
我们可以从监控面板中直接看出tcp出现错误最多的地方,在我这个面板里,目前是高峰期出现重传的情况比较多。

对连接的监控

但是仅仅用上面的监控只是从宏观上看到网络的拥塞情况。我们有时可能更需要考虑在tcp层的饱和情况。

所以我们在此基础上又加了连接数的监控。

2131688718659_.pic.jpg

这个面板能够展示tcp当前链接数,当前链接是处于 ESTABLISHED 和 CLOSE-WAIT 状态的 TCP 连接数。

下面这个面板是展示了主动建立连接和被动建立连接的情况

2141688718673_.pic.jpg

上述指标和用netstat -s 看tcp的信息是一致的,node exporter服务也是采用用netstat工具类似的原理,从proc文件系统的/proc/net/netstat 目录读取到相关信息。

对进程状态的监控

除了上述监控指标外,我们还加上了对整个系统内部进程状态的监控,这是鉴于之前某些服务会产生异常子进程的情况才考虑添加的。主要对系统内各个时刻的进程状态进行监控计数。

2241688972602_.pic.jpg

系统资源限制监控

除了上述监控外,系统内部还有一些资源不是无限的,也需要记录下系统当前使用这些资源的情况,比如已经使用的文件描述符,pid号,连接表nf_conntrack的大小(这个表满了会产生丢包),线程数等等,我都统一归纳为资源限制监控了。具体面板就不在这里粘贴了。这些资源限制资源以后是我们创建报警时重点关注的指标。

总结

在这一节,我们通过node exporter 建立起了对机器层级的监控,涉及cpu,内存,磁盘,网络,其中涉及的监控面板来自于现有的监控模板node exporter full,不过由于node exporter full 数量实在太多,我们挑选了一些组成了最终的监控模版,模版的json文件已经放到了文章开头, 你完全可以将它直接导入到你的grafana项目里,建立起对机器层级的监控。

在万千人海中,相遇就是缘分,为了这份缘分,给作者点个赞👍🏻不过分吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/46109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言---动态内存管理

C语言—动态内存管理 文章目录 C语言---动态内存管理1. 为什么要进行动态内存分配1.1 动态内存管理所在的区域 2. 动态内存函数的介绍2.1 malloc2.1.1 malloc语法2.1.2 malloc具体实例 2.2 free2.2.1 free语法2.2.2 free具体实例 2.3 calloc2.3.1 calloc语法2.3.2 calloc具体实…

42. 接雨水

题目介绍 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

OpenShift 4 - 可观测性之用 OpenTelemetry+Jaeger 实现 Distributed Tracing

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.13 的环境中验证 文章目录 技术架构部署 Distributed Tracing 运行环境安装测试应用并进行观测跟踪参考 说明&#xff1a; 本文使用的测试应用采用的是 “手动 Instrumentation” 方式在…

Linux系列---【CentOS 7通过MSTSC连接远程桌面】

安装对应的yum源 yum list lightdm xorgxrdp xrdp 可以看到这些软件都在epel中&#xff0c;如果没有的话&#xff0c;请先安装对应的yum源。命令如下&#xff1a; yum install -y epel-release 确认yum源没有问题之后&#xff0c;我们就可以进行安装了。 安装lightdm xorgxrdp…

【C语言】嵌入式C语言项目管理利器:深入理解Makefile的应用与实践

目录 一、makedile的概述 1、案例引入 2、makefile 3、Makefile优点 二、makefile的语法规则 1、语法规则 2、简单实战 三、makefile的变量 1、自定义变量 2、系统环境变量 3、预定义变量 4、高级makefile 一、makedile的概述 1、案例引入 gcc a.c b.c c.c ‐o …

EasyExcel写出包含多个sheet页的Excel

EasyExcel导出包含多个sheet页的Excel 1.引入依赖 引入如下的EasyExcel的依赖&#xff0c;或直接下载jar包 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></depende…

RT-Thread快速入门-定时器管理

1时钟节拍 任何操作系统都需要提供一个时钟节拍&#xff0c;以供系统处理所有和时间有关的事件&#xff0c;如延时、线程的时间片轮转调度以及定时器超时等。时钟节拍&#xff08;OS Tick&#xff09;是操作系统中最小的时间单位。 时钟节拍是特定的周期性中断&#xff0c;这…

Spring Boot 整合 分布式搜索引擎 Elastic Search 实现 搜索、分页与结果过滤

文章目录 ⛄引言一、酒店搜索和分页⛅需求分析⚡源码编写 二、酒店结果过滤⌚需求分析⏰修改搜索业务 ✅效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据…

【java实习评审】对热门小说更新时的聚集访问流量进行性能优化优化,有较好的设计

大家好&#xff0c;本篇文章分享一下【校招VIP】免费商业项目“推推”第一期书籍详情模块java同学的文档周最佳作品。该同学来自西安建筑科技大学软件工程专业。 本项目亮点难点&#xff1a;1 热门书籍在更新点的访问压力&#xff0c;2 书籍更新通知的及时性和有效性&#xff…

浅谈能源管理系统在水泥行业中设计分析

安科瑞 华楠 摘要&#xff1a;水泥企业作为我国产业结构中重要的耗能产业&#xff0c;同时对环境的污染也比较大&#xff0c;因此在水泥企业中建立能源管理系统&#xff0c;对水泥企业的生产过程过程进行全过程的监控和管理&#xff0c;对于降低企业的能源消耗和提高企业的经济…

24 鼠标常用事件

鼠标进入&#xff1a;enterEvent鼠标离开&#xff1a;leaveEvent鼠标按下&#xff1a;mousePressEvent鼠标释放&#xff1a;mouseRelaseEvent鼠标移动&#xff1a;mouseMoveEvent 提升为自定义控件MyLabel 代码&#xff1a; //mylabel.h #ifndef MYLABEL_H #define MYLABEL_H#…

ESP32(MicroPython) 两轮差速五自由度机械臂小车

这次的项目在软件上没多少调整&#xff0c;但本人希望分享一下硬件上的经验。 小车使用两轮差速底盘&#xff0c;驱动轮在小车中间&#xff0c;前后都要万向轮。这种形式可以实现0转弯半径&#xff0c;但受万向轮及用于加高的铜柱的规格限制&#xff0c;两个万向轮难以调到相同…

基于netlify生成custom SSL certificate

&#xff08;1&#xff09;腾讯云申请 &#xff08;2&#xff09;域名控制台解析 &#xff08;3&#xff09;Nginx下载&#xff08;crt: CA certificate Chain)

C++教程 从0开始

0基础C教程 从0开始 课堂现在开始 如需学习 请订阅该标签 什么是C&#xff1f; 这个不是太重要 自行查看该链接即可 C_百度百科C&#xff08;c plus plus&#xff09;是一种计算机高级程序设计语言&#xff0c;由C语言扩展升级而产生&#xff0c;最早于1979年由本贾尼斯特劳…

轻量级Firefox Send替代方案Gokapi

想不到一个域名的变动会影响这么大&#xff0c;访问量出现断崖式下跌。由此可见&#xff0c;平时的访问应该只是一些 RSS 的访问而已。 上面是 Pageviews&#xff0c;下面是 Uniques 今天略有回升 难怪那些大公司要花钱买域名了&#xff0c;不过老苏是个佛系的人&#xff0c;一…

使用MQ发送对象错误

说明&#xff1a;使用RabbitMQ发送消息&#xff0c;消息是对象&#xff0c;出现下面这样的错误&#xff1b; 错误信息&#xff1a;Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.hmall.item.pojo.Item (no Cr…

通过问题解决者手册推动你的结果 - 提高思维能力的 17 种方法

大部分人对产品管理的理解都是解决问题&#xff0c;这是他们的主要工作——找出客户的问题是什么并解决它们。但现在&#xff0c;热衷于解决问题的问题是&#xff0c;当我们看到问题时&#xff0c;本能反应是“我该如何解决它&#xff1f;” 这意味着&#xff1a;当我试图自己解…

SPEC CPU 2006 docker gcc:4 静态编译版本 Ubuntu 22.04 LTS 测试报错Invalid Run

runspec.sh #!/bin/bash source shrc ulimit -s unlimited runspec -c gcc41.cfg -T all -n 1 int fp > runspec.log 2>&1 & tail -f runspec.log runspec.log 由于指定了-T all&#xff0c;导致-n 1 失效&#xff0c;用例运行了三次&#xff08;后续验证&…

iptables的备份和还原

iptables的备份和还原 1、写在命令行当中的都是临时设置 2、把规则配置写在服务的文件当中&#xff0c;形成永久有效 备份&#xff1a;把iptables里面所有的配置都保存在/opt/ky30.bak中 iptables-save > /opt/ky30.bak 例&#xff1a; 默认配置文件在/etc/sysconfig/ip…

自然语言处理NLP介绍——NLP简介

目录 内容先进性说明内容大纲概要云服务器的使用 内容先进性说明 内容大纲概要 云服务器的使用