性能分析之系统资源饱和度

简介: 【8月更文挑战第17天】性能分析之系统资源饱和度

一、前言

在做性能分析的时候,我们不可避免地判断资源到底够不够用?哪里不够?为什么不够?证据是什么?

能回复得了这些问题并不容易。

今天就来聊聊一下操作系统资源饱和度应该如何衡量?

现在 k8s 盛行,所以这里来借用 k8s 中部署的 Prometheus+Grafana 来直观的看图。

二、CPU 资源

先看一个图:
image.png
一边是 CPU 使用率,一边是 CPU 饱和度。

饱和度如何来算的呢?

看它的 Query 是什么样的:

node:node_cpu_saturation_load1:{
   
   cluster="$cluster"} / scalar(sum(min(kube_pod_info{
   
   cluster="$cluster"}) by (node)))

即是 node_cpu_saturation_load1 来计算的,那这个 node_cpu_saturation_load1 的基础数据是什么?再来它的来源:

 sum by (node) (    
          node_load1{
   
   job="node-exporter"}    
        * on (namespace, pod) group_left(node)    
          node_namespace_pod:kube_pod_info:    
        )    
        /    
        node:node_num_cpu:sum    
      record: 'node:node_cpu_saturation_load1:'

load average 1min 内的数据,node_exporter 同时也实现了 node_load5/node_load15。分别来对应我们常见的 Linux 中的 load average 的 1 分钟、5 分钟、15 分钟。

而这个 load average 从哪里来,在之前的文章中有过描述,同时也说了这个值用来判断系统负载的局限性。这里就不展开了。

知道了这个 CPU 饱和度的来源之后,我们再来看上面的图。即是说,我们在判断 CPU 是否够用的时候,不仅是要看 CPU 使用率,还要看 CPU 饱和度才可以

三、内存资源

如下图:
image.png
这里的内存饱和度后面加了一个 Swap IO。其实了解内存的人会知道,swap 这个词实在是有特定的含义,交换分区,但是在我们在配置 k8s 的时候会知道 swap 是关了的。但是这里 swap 是什么呢?

再来看它的 Query 语句。

node:node_memory_swap_io_bytes:sum_rate{
   
   cluster="$cluster"}

取了 node_memory_swap_io_bytes 这个值,这个值在 prometheus 里是什么呢?

- expr: |    
        1e3 * sum(    
          (rate(node_vmstat_pgpgin{
   
   job="node-exporter"}[1m])    
         + rate(node_vmstat_pgpgout{
   
   job="node-exporter"}[1m]))    
        )    
      record: :node_memory_swap_io_bytes:sum_rate

取了 vmstat 的 page in/out。这就理解了,swap 并不是特指交换分区。而是页交换,没有交换分区不打紧,页交换还是要做的。

而有页交换并不一定就是内存用完了,指内存中找不到要使用的页也是要有 page in 的。而在代码中定义了某个变量或对象的内存大小之后,当不够用时,也照样会 page out。

所以判断内存是否够用,不仅要看内存是否用完,还要看 page in/out 是否产生

四、磁盘资源

image.png

磁盘的 IO 饱和度是比较容易判断的,我们来看看它是如何判断,同样来看看它的 Query:

node:node_disk_saturation:avg_irate{
   
   cluster="$cluster"} / scalar(:kube_pod_info_node_count:{
   
   cluster="$cluster"})

取了 node_disk_staturation,同时计算了 avg_irate。我们来看一下这个值的来源。

- expr: |    
        avg by (node) (    
          irate(node_disk_io_time_weighted_seconds_total{
   
   job="node-exporter",device=~"nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+"}[1m])    
        * on (namespace, pod) group_left(node)    
          node_namespace_pod:kube_pod_info:    
        )    
      record: node:node_disk_saturation:avg_irate

它取了 node_disk_io_time_weighted_seconds_total 的值,这是一个加权累积值。而这个值是来源于 iostat 中的avgqu-sz,这个值是 IO 队列长度。

这样就知道这个饱和度的来源了

五、网络资源

image.png

在网络资源的判断上,这里用了一个非常直接的词 dropped。直观理解就是丢包,来看它的 Query 语句。

node:node_net_saturation:sum_irate{
   
   cluster="$cluster"}

这里调用了 node_net_saturation 的值,而这个值不够直观的知道是什么内容。

再来看看它的来源:

- expr: |    
        sum by (node) (    
          (irate(node_network_receive_drop_total{
   
   job="node-exporter",device!~"veth.+"}[1m]) +    
          irate(node_network_transmit_drop_total{
   
   job="node-exporter",device!~"veth.+"}[1m]))    
        * on (namespace, pod) group_left(node)    
          node_namespace_pod:kube_pod_info:    
        )    
      record: node:node_net_saturation:sum_irate

从这段代码就很清楚地知道了,这是从接收的 drop 来的。好直观的名字。

其实判断网络瓶颈,不止是丢不丢包,也要看队列。如果已经出现丢包了的话,那网络质量就必定差了。

六、总结

其实不管我们用什么工具来看性能数据,都是需要知道它的来源和值的含义,这样才能判断精确。

在很多场合,不管是项目还是做一些分享,我都强调过性能分析中要先理解每个数据的含义再来看所选择的工具中如何展现。

而有些人觉得上一个监控平台或 APM 之类的就可以知道瓶颈点在哪里了,这个理念绝对是有问题的。

打好基础,仍然是学习的重点

目录
相关文章
|
3月前
|
监控 Linux
性能分析之 Linux 系统中 ps&top 中 CPU 百分比不一致?
【8月更文挑战第18天】性能分析之 Linux 系统中 ps&top 中 CPU 百分比不一致?
161 4
|
4月前
|
存储 固态存储 Linux
systemd-analyze:Linux系统启动性能分析的利器
`systemd-analyze`是Linux下分析systemd启动性能的工具,它提供启动时间统计、服务耗时、依赖关系及图形化展示。通过`blame`查看服务启动时间,`critical-chain`显示关键路径,`plot`生成启动时间线图。使用时注意日志完整性,优化服务顺序,并结合最佳实践提升启动效率。
|
4月前
|
Web App开发 缓存 前端开发
页面加载性能分析中,如何确定哪些资源是关键的,哪些可以延迟加载?
页面加载性能分析中,如何确定哪些资源是关键的,哪些可以延迟加载?
|
6月前
|
监控 Linux 测试技术
性能分析之Linux系统平均负载案例分析
【4月更文挑战第20天】在上文性能基础之理解Linux系统平均负载和CPU使用率中,我们详细介绍了 Linux 系统平均负载的相关概念,本文我们来做几个案例分析,以达到加深理解。
95 2
性能分析之Linux系统平均负载案例分析
|
6月前
|
SQL 监控 架构师
linux系统性能分析的目的
【4月更文挑战第19天】在Linux系统中,找到性能瓶颈是关键,涉及应用程序、操作系统、硬件和网络的全面排查。优化方案通常针对应用程序和操作系统,而硬件和网络问题较易定位。目标是平衡资源使用,确保系统响应和稳定性。系统管理员、架构设计人员和开发人员共同参与,通过监控硬件、网络、配置和代码来优化性能。流程包括管理员初步判断,架构师处理结构问题,开发人员优化代码,实现系统资源的均衡利用。
50 1
|
Linux 调度
Linux系统调试篇——Perf性能分析指南
Linux系统调试篇——Perf性能分析指南
|
缓存 监控 Linux
Linux系统性能分析
Linux系统性能分析
4762 2
|
缓存 算法 Linux
系统性能分析从入门到进阶(1)
系统性能分析从入门到进阶
167 0