直播回顾:准确性提升到 5 秒级,ssar 独创的 load5s 指标有多硬核?| 龙蜥技术…

一、系统性能分析工具 ssar 功能定位

说起性能分析就不得不提到《性能之巅》这本书,它是业界里程碑式的经典书籍。在书中第 4 章观测工具部分,Brendan 告诉我们观测工具主要包括:计数器(Counters)、跟踪(Tracing)、采样(Profiling)和监控(Monitoring)几大类。

在对系统性能监控和跟踪采样工具的具体理解上,我们认同如下 3 个理念:

1)内核计数器(Counters)信息获取代价低,无额外开销。相比较而言,跟踪采样工具或多或少都有一些运行开销,如 kprobe 的使用还可能会引起一些稳定性风险。因此,我们倾向于最大化挖掘计数器信息的价值。比如要获知机器直接内存回收的信息时,内核计数器已经提供了更低代价获取的直接内存回收和异步内存回收的指标,就完全没必要使用 ftrace 监控直接内存回收的情况了。另一方面,对于内核计数器不能涵盖的细颗粒度内核数据,还必须要依赖内核跟踪采样工具获取。比如当 IOPS 较高时,我们想了解具体的每一个 IO 读写的具体文件信息,内核计数器中完全没有相关信息。只有让跟踪采样工具专注于自己的核心任务,才更有条件打磨出更加稳定和可靠的精品工具。

2)现有的系统性能监控工具,除单机监控工具外,还有很多白屏化的监控平台。白屏化监控平台一般都是将数据采集到中心数据库,然后再集中展示。白平化监控平台采集更详细的计数器信息时,不可避免的都会遇到存储成本的问题,不宜将过多数据采集到白屏化监控平台。但同时对于一些高频使用的常规指标,如 CPU、内存和 络使用率情况,使用白屏化监控平台展示,确实可以大大提升可观测性。所以高频常规指标使用白屏化监控平台的同时,仍然需要一个数据指标更加丰富的单机系统性能监控工具配合使用。在一些关键时刻,还必须依赖这些低频数据来分析和定位问题。

3)传统的黑屏系统性能监控工具,多年来一直相对比较固化,历数 2010 年、2015 年、2020 年指标内容变化不是特别大。举个例子,新版本内核的计数器中, 络扩展指标多达 400 多个,仅 TCP 扩展指标就有 116 个,但是实际上常规的系统性能监控在TCP 络指标这一块,也就使用了不超过 15 个指标,大部分指标价值并没有被挖掘出来。这些 络的内核计数器指标,在很多 络相关问题发生时,都很有实用价值。

基于这些理念,我们认为研发一款数据指标更全、迭代周期更短、性能更加稳定的系统性能监控工具,以应对日益复杂的系统性能问题是很必要的。

今天我们要介绍的阿里自研 ssar 工具,就是这样一款系统性能监控类工具,并且已经在知名的操作系统 区龙蜥开源。它几乎涵盖了传统系统性能监控 sar 工具的所有功能,同时扩展了更多的整机级别的指标,新增了进程级指标和特色的 load 指标、load 高问题的诊断是这个工具一个独特的功能。

开源软件 atop 也是这样一个类似功能的系统性能监控工具。公开渠道了解到友商也在大规模部署 atop 工具,这说明在业界其他互联 公司也感受到了拥有这样一个功能定位的监控工具的重要性。

二、系统性能分析工具 ssar 简介

系统性能监控工具 ssar 开源地址(见文末),其中 Reference_zh-CN.md 是更详细的中文帮助手册,package 目录中有 rpm 和 deb 包提供,其他操作系统可以自行编译打包。

2)ssar 工具把一些通用处理逻辑都抽象到通用查询器 ssar 命令里,配置了文件采集后,只需一条 ssar 命令即可查询显示数据,完美实现分钟级周期的开发迭代。其中cfile指定存储文件名,line 指定第 3 行,column 指定第 5 到 15 行,metric 指定显示原值,alias指定指标名称。

使用 help 选项可获取整机指标使用帮助信息。

ssar 支持两种数据提取方式,预定义方式和自定义方式

ssar 预定义指标提取数据方式适合于使用 ssar 命令直接消费数据的场景。预定义指标可在 sys.conf 文件中灵活的配置,下面 2 个例子说明了如何配置预定义指标:

1)配置项 user 表示指标名为 user,数据文件后缀为 stat,取开头为 cpu 的行的第 2 列数据的差值,输出字段宽度 10 个字节。

2)配置项insegs表示指标名为 insegs,数据文件后缀为 snmp,取第 8 行的第 11 列数据的差值,输出字段宽度 10 个字节。

ssar 也支持自定义指标方式提取数据指标,自定义指标提取数据方式适合于使用python语言封装的查询器使用。如下是一些自定义指标方式的使用示例:

1)取 meminfo 中 MemFree 值,字段名命名为 free

ssar -o ‘metric=c|cfile=meminfo|line_begin=MemFree:|column=2|alias=free’

2)取 snmp 中第 8 行第 13 列值的差值

ssar -o ‘metric=d:cfile=snmp:line=8:column=13:alias=retranssegs’

3)显示 cpu0 到 cpu15 的 idle 的实时模式数据

ssar -o ‘metric=d|cfile=stat|line=2-17|column=5|alias=idle_{line};’ -f +100

自定义方式使用方法说明:

1)cfile 用来指定数据文件中的后缀名,需要同 sys.conf 配置文件中的 [file] 部分的 cfile 的值保持一致;

2)line 直接指定指标所在的行数,line 与 line_begin 不能同时指定;

3)line_begin 指定指标所在行的行首匹配关键字符串,需要保证在整个文件中独一无二;

4)column 指定指标在特定行所处的列数,列以空格为分隔符;

5)metric 用于指定按以上规则获取到值后是原值输出,还是取相邻时间的差值输出,值为c表示原值输出,为d表示取差值输出;

6)alias 用于指定当前指标输出的标题名或 json 格式中的 key 值.

tsar工具是阿里集团的一款经典系统性能监控工具。基于ssar命令的整机自定义指标方式,使用python语言封装的 tsar2 命令几乎完全兼容tsar命令。

2)如果我们不确定找到 54 核 CPU 是否准确,还可以通过 tsar2 命令的 cpu 视图中指定观察 cpu54 核的 sirq 的变化。

irqtop子命令默认只支持实时模式。如需开启历史模式可去掉命令中-l选项,同时还需要修改配置文件 sys.conf,开启 interrupts 数据文件的采集。

如此强大的cputop和irqtop子命令同样也是在python语言中,通过400行代码轻松实现。这里也同样表明了在ssar架构下,开发新的系统性能监控功能的灵活优势。

五、ssar工具进程指标使用介绍

ssar 的 procs 子命令可以显示多进程信息,效果相当于可以显示任意历史时刻的 linux ps 命令的输出。

ssar 的 proc 子命令显示单进程纵向历史时刻信息。

1)-p选项为必选参数,用于指定需要显示的进程的 pid 信息。

2)-f选项指定结束时间点,-b选项指定开始时间点,-r选项指定时间跨度,三个选项只需指定2个即可。-f默认值为当前时刻,-r默认值为 300 分钟。

3)-H选项隐藏header信息更便于shell脚本解析,–api选项输出json格式数据更便于python脚本等高级语言解析。

4)小 o 选项用于指定输出数据列的字段,多列指标用逗 隔开。对于高频常用的多字段同时输出,还提供字段组合选项,如 –cpu、–mem。大 O 选项用于在既有字段组合输出基础上,追加输出字段指标。因此,大 O 选项可与 –cpu  –mem 等同时使用,而小 o 选项和大 O 选项及其他字段组合互斥。

5)左尖括  < > 表示7点22分进程已结束。此功能可以协助判断一个特定进程的开始和结束时间范围。

下面通过一个简单的例子,来说明下如何通过 ssar 进程级指标诊断线程数打满问题。Linux 内核有个参数 kernel.pid_max = 131072,这个参数会设置机器的总线程数上限。

1)一台机器在非工作时段发生了异常进程创建大量线程将线程数打爆的情况。凌晨3点整,整机线程数飙升到了131.1K,且持续时间极短,3点1分已经恢复。

3)不放心的同学,还可以使用 awk 将这个问题时刻2021-03-30T03:00:00的所有线程数相加,和为 131024,印证了确实等同于当时机器总线程数plit值131.1K。

找一台实验机器,先编译一个可以模拟 D 状态线程的程序 uninterruptible。然后用 stress 命令启动 100 个进程执行 30 秒后退出。大约再等 20 秒左右再批量循环启动 1000 个 uninterruptible 进程。执行结束后,效果如下图所示。

2)stack视图显示抽样后的D状态调用栈,最多抽样100个。每个D状态线程调用栈包含线程ID、进程ID、进程名称、栈顶函数位置、栈顶函数名和完整的调用栈。

4)loadd视图按pid聚合D状态线程信息,适合诊断loadD高时的进程级因素。

6)stackinfo视图按调用栈聚合,对loadD高时,诊断D状态线程发生的原因特别有用。

1)[main]部分配置选项主要用于设置ssar工具整体的一些选项内容,[load]和[proc]分别对应load信息采集和进程信息采集部分的选项,整机信息的配置选项在前文介绍的/etc/ssar/sys.conf文件中独立设置。

2)duration_threshold选项设置最多保留168小时。inode_use_threshold、 disk_use_threshold和disk_available_threshold这3个选项任意一个条件不满足时,则停止数据采集,并且开始从时间最老的数据到最新的逐步删除数据,以试图使刚才不成立的条件成立,一直删除到只剩最新的一个小时数据目录为止。ssar工具的这种磁盘空间处理逻辑可以说不占用额外的磁盘空间。

3) load5s_flag、 proc_flag和sys_flag分别控制采集器三部分数据的采集,嵌入式系统中可以同时关闭load5s_flag和proc_flag后再配置sys.conf,从而做到只采集自己关注的数据源。

4) scatter_second选项用于在大规模集群中,使各个主机的采集时间分散化。

5) load5s_threshold设置load详情采集触发阈值,不同角色的服务器此阈值需要根据各自特点个性化设置。

八、ssar工具CPU使用率综合分析

Linux top命令中有2处%Cpu,一处是在头部,另外是在每个进程信息中。关于两者之间的关系,我们借助ssar工具的使用简单介绍一下。

为了准确理解linux CPU Usage指标,在一台4核机器上执行如下实验。A终端执行命令   stress -t 120 -c 3,执行时间为23时23分20秒,120秒后会结束。B终端同时执行top命令,如图所示。

2)在A终端上继续执行ssar命令,23时25分的user/s值为301.35。ssar的cpu值是取自/proc/stat,单位是内核tick数。x86_64系统每秒100个tick,即100HZ。4颗CPU总数就是每秒400个tick, 23:25时间的user值是301.35,它的含义表示23时24分到23时25分这60秒内的平均每秒user CPU使用量为301.35 tick数。

4)在A终端上继续执行ssar procs子命令。23时25分的三个stress进程的pucpu值都为100.0。这里的每一个100.0的含义是这个进程在23时24分到23时25分这60秒内的进程的平均用户空间CPU使用率为100.0。计算过程是用进程的cpu时间片除以自然时长,再乘以100,即百分比的100。这个算法和top命令下半部分的进程级别的%CPU一致。

下面以ssar的数据指标为依据,一步一步的展示了当整机内存紧张后是如何引起sys CPU高,并进而引发load高的完整过程:

1)用户空间java进程在20点43分到20点45分2分钟内大量申请24GB内存; 

3)free内存在20点45分时只有3GB,低于low阈值,pgscan_kswapd/s值非0表明触发kswapd异步内存回收。

5)20点44分到20点45分出现大量 络吞吐,每秒进出流量分别达到1.5G和1.0G。 络流量吞吐会伴有内核空间内存申请,继续消耗min阈值以下(橙色部分)free内存。

7)触发内核态忙等,同时会引发20点44分到20点45分的sys CPU升高,sys CPU平均每秒占总CPU资源的89.61%,挤占用户空间既有进程CPU资源,同期用户态CPU使用从原来的72.59%降低到7.73%。

内存回收是生产环境较常见的一个情况。除以上场景外,生产中还会发生其他场景的内存回收,数据指标的表现上也有差异。还需要借助其他性能分析工具,结合内核代码进一步分析。

系统性能监控工具 ssar 开源地址:

https://gitee.com/anolis/tracing-ssar.git

龙蜥 区视频回顾地址链接:

https://openanolis.cn/video/#440154235973681288

使用文档详细链接地址(点击阅读原文直达):

https://gitee.com/anolis/tracing-ssar/blob/master/Reference_zh-CN.md

敲重点啦

关于龙蜥 区

龙蜥 区(OpenAnolis)是由企事业单位、高等院校、科研单位、非营利性组织、个人等在自愿、平等、开源、协作的基础上组成的非盈利性开源 区。龙蜥 区成立于 2020 年 9 月,旨在构建一个开源、中立、开放的Linux 上游发行版 区及创新平台。

龙蜥 区成立的短期目标是开发龙蜥操作系统(Anolis OS)作为 CentOS 停服后的应对方案,构建一个兼容国际 Linux 主流厂商的 区发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。

目前,龙蜥OS 8.4已发布,支持 X86_64 、Arm64、LoongArch 架构,完善适配飞腾、海光、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密支持。

欢迎下载:

https://openanolis.cn/download

加入我们,一起打造面向未来的开源操作系统!

https://openanolis.cn

往期精彩推荐

1.龙蜥 区理事长展望操作系统 2022:加速驶向快车道,云、XPU和开源成“催化剂”

2.知名高性能计算软件服务商加入,联科集团携手龙蜥 区繁荣开源生态

3.优炫软件正式加入龙蜥 区,携手共建 络安全新生态

4.仅剩1天,2021 年度优秀开发者评选 名活动就要截止啦!| 一周动态

5.澎峰科技加入,龙蜥 区再添高性能计算领域新伙伴

535b5ed0c909522140a1f2ae54a68f99.png

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览93121 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年1月20日
下一篇 2022年1月20日

相关推荐