首页 > 其他分享 >性能分析之OS资源饱和度

性能分析之OS资源饱和度

时间:2023-04-03 14:33:02浏览次数:29  
标签:node saturation 性能 cluster 饱和度 pod OS sum

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

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

今天就来絮叨一下OS资源饱和度应该如何衡量。

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


  • CPU资源:

先看一个图:

性能分析之OS资源饱和度_丢包

一边是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:'

也即是说使用了node_load1来取的数据。这个通过node_exporter的可以知道是来自于load average 1min内的数据,node_exporter同时也实现了node_load5/node_load15。分别来对应我们常见的linux中的load average的1分钟、5分钟、15分钟。

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

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


  • 内存资源:

再上图

性能分析之OS资源饱和度_数据_02

这里的内存饱和度后面加了一个Swap IO。其实了解内存的人会知道,swap这个词实在是有特定的含义,交换分区,但是在我们在配置kubernets的时候会知道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是否产生。


  • 磁盘资源:

性能分析之OS资源饱和度_丢包_03

磁盘的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队列长度。

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


  • 网络资源:

性能分析之OS资源饱和度_数据_04

在网络资源的判断上,这里用了一个非常直接的词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来的。好直观的名字。

这个值。

其实判断网络瓶颈,不止是丢不丢包,也要看队列。如果已经出现丢包了的话,那网络质量就已经非常差了,并且丢包的原因众多,有些是配置或代码bug的原因。所以在性能分析中,只看丢包还是不够的。


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

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

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

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


标签:node,saturation,性能,cluster,饱和度,pod,OS,sum
From: https://blog.51cto.com/u_15181572/6166354

相关文章

  • 性能工具之JMeter两个Java API Demo
    概述本文演示两个通过JavaAPI执行JMeter脚本的示例主要功能在线生成jmx脚本(demo1)加载本地已有jmx脚本(demo2)运行多个Sampler将生成的TestPlan存储为.jmx文件执行单机压测将测试执行结果存储为.jtlor.csv文件示例Maven配置为了开始使用JMeterAPI,我们首先需要将它添加到......
  • 性能工具之Taurus场景使用(进阶篇)
    前言在上两文中介绍了安装和入门使用,本文我们来看看Taurus一些进阶的玩法。性能工具之Taurus入门(安装篇)性能工具之Taurus使用(入门篇)复杂场景统一测试复杂场景的压力测试,如果有多个同学从事脚本开发,则有时必须使用多个测试脚本文件。这意味着将多个测试脚本需要集成到单个压力测试......
  • 【论文速递】MMM2020 - 电子科技大学提出一种新颖的局部变换模块提升小样本分割泛化性
    【论文速递】MMM2020-电子科技大学提出一种新颖的局部变换模块提升小样本分割泛化性能【论文原文】:ANewLocalTransformationModuleforFew-shotSegmentation【作者信息】:YuweiYang,FanmanMeng,HongliangLi,QingboWu,XiaolongXuandShuaiChen获取地址:https://arxi......
  • 【论文速递】WACV2023 - CellTranspose:用于细胞实例分割的小样本域自适应
    【论文速递】WACV2023-CellTranspose:用于细胞实例分割的小样本域自适应【论文原文】:CellTranspose:Few-shotDomainAdaptationforCellularInstanceSegmentation获取地址:https://openaccess.thecvf.com/content/WACV2023/papers/Keaton_CellTranspose_Few-Shot_Domain_Adap......
  • 【论文速递】ECCV2022 - PETR: Position Embedding Transformation for Multi-View 3D
    【论文原文】:PETR:用于多视图3D对象检测的位置嵌入变换论文:https://arxiv.org/abs/2203.05625代码:https://github.com/megvii-research/PETR博主关键词:小样本学习,语义分割,图注意力网络,互监督,目标检测,三维视觉摘要在本文中,我们开发了用于多视图3D对象检测的位置嵌入变换(PET......
  • 30分钟带你熟练性能优化的那点儿事儿(案例说明)
    前言性能优化是数据库运维人员和中、高级软件开发人员的必备技能,很多时候老司机和新司机的区别就在写出的东西是否优化。博主接触过近千家客户的系统,这些系统都存在着各种各样的性能问题。那么如何透彻的了解我们的数据库性能问题?今天就用一个案例来说明性能优化的那点......
  • Java-Day-1(Java了解 + DOS)
    Java-Day-1JAVA分辨了解Java创始人之一:詹姆斯·高斯林解释性语言,编译出.class后是有一个解释器的(编译性语言:C/C++——编译后的代码已经是二进制可以由机器直接执行了)面向对象的(oop)健壮的跨平台性的一个.java编译好的.class文件,无需再次编译,便既能在windows上......
  • Microsoft.SqlServer.Management.SqlMgmt.SimpleJobSchedule”上的属性访问器“Schedu
    标题:MicrosoftSQLServerManagementStudio对象“Microsoft.SqlServer.Management.SqlMgmt.SimpleJobSchedule”上的属性访问器“ScheduleRecurrenceAndTimes”发生以下异常:“对象“Microsoft.SqlServer.Management.SqlMgmt.SimpleJobSchedule”上的属性访问器“StartTimeOfD......
  • Microsoft Visual Studio 企业应用开发高效编程
    有一个假设在大自然中人和动物们比赛,比谁跑的"快".其实想想也知道,我们绝对不可能拿第一,毕竟跑的比人快的动物多的去了,老虎,狮子,猎豹,就连素食的羚羊跑的也比我们快不少.人类之所以将自己凌驾于动物之上,一方面智商使然,另一方面我们利用我们的智慧创造了原本没有的东西"工具".......
  • Kerberos 安装
    Kerberos安装1.Kerberos服务端安装服务端重点三个配置文件:/etc/krb5.conf/var/kerberos/krb5kdc/kdc.conf/var/kerberos/krb5kdc/kadm5.acl注意点:防止配置文件格式错误,如编辑过程中导致内容缺失。查询软件对加密算法的支持程度,如降低版本hadoop需要去除掉aes和......