简介:你还在为剖析机器负载高而苦恼?这款 ssar 工具独创 load5s 指标精准定位超硬核。
编者按:本文整顿自龙蜥 SIG 技术周会,作者闻茂泉,阿里云计算平台事业部 SRE 运维专家,是龙蜥社区跟踪诊断 SIG 核心成员。本文带你理解 ssar 的基本功能和应用、初步学习用 ssar 解决单机 OS 问题的诊断。直播视频回放已上线至龙蜥社区官网:首页 - 反对 - 视频,欢送观看。
一、零碎性能剖析工具 ssar 功能定位
说起性能剖析就不得不提到《性能之巅》这本书,它是业界里程碑式的经典书籍。在书中第 4 章观测工具局部,Brendan 通知咱们观测工具次要包含:计数器 (Counters)、跟踪(Tracing)、采样(Profiling) 和监控 (Monitoring) 几大类。
根据数据获取形式和数据实时性两个维度,能够将性能观测工具做个分类:
1)左上角 A 区是间接读取计数器实时数据的一些系统命令,top、ps 这些命令咱们都很罕用,它们读取的是 /proc/ 这个目录的信息,这外面的数据是内核帮咱们记账进去的。
2)左下角 B 区也是基于计数器的,但它是记录历史信息的工具,比如说最罕用的就是 sar 工具,下文咱们统称这类工具为零碎性能监控工具。在阿里外部也有 tsar 工具,国外还有开源软件 atop。零碎性能监控工具一方面能够回溯历史数据,同时也提供实时模式数据。
3)右上角 C 区跟踪采样工具,内核的 tracepoint、kprobe 等就是跟踪类工具,perf 工具次要是采样类工具,下文咱们统称这两类工具为跟踪采样工具。目前这些工具都是只获取实时的数据。如果不联合其余工具,单纯应用它们来追究历史数据,它们是无奈提供的。
4)右下角 D 区,咱们认为能够通过 B 区和 C 区的工具协同应用达到目标。C 区工具只负责获取内核要害数据,B 区工具只负责数据采集和数据获取,二者之间应用规范数据接口。
咱们在性能剖析工程实际中重点聚焦在左下 B 区和右上 C 区蓝框 2 个象限的建设上。明天咱们次要探讨的就是 B 区的零碎性能监控工具建设状况。当前会再给大家介绍 C 区的工具建设状况。
在对系统性能监控和跟踪采样工具的具体了解上,咱们认同如下 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 包提供,其余操作系统能够自行编译打包。
ssar 工具分为采集器、内层的通用查询器、外层的加强查询器和经典查询器几局部。
1)采集器 sresar:C 语言实现的一个常驻过程,将数据记录到本地磁盘,采集数据内容包含:(a) 按文件单位采集的整机数据、meminfo、stat、vmstat 等;(b) 蕴含 24 个指标的过程级数据;(c) 独特的 load5s 指标和具体的 R 或 D 状态线程详情数据;
2)通用查询器 ssar 命令:c++ 语言实现,负责按文件名、某行、某列等通用规定对文件数据进行逻辑解析;
3)古典查询器 tsar2:python 语言实现,对 ssar 命令进行封装,全面兼容 tsar 命令;
4)加强查询器 ssar+:python 语言实现,对 ssar 命令进行封装,布局上是将来 ssar 工具的次要外围,适宜于把较简单的数据逻辑放在 python 语言实现层。
三、零碎性能剖析工具 ssar 反对疾速开发迭代
传统 sar 工具只采集一些固定指标,应用 C 语言采集数据的同时进行指标解析。在这种模式下,不是极难扩大新指标,就是扩大新指标开发迭代周期特地长。
ssar 工具齐全颠覆了传统 sar 工具的架构设计,在产品设计和程序架构上做了很多变动,能够让咱们疾速、低开发成本的减少新的计数器指标。
1)如果咱们须要关注一个新的指标,而这个指标又没有被采集。对于传统的零碎性能监控工具 sar 来说,批改公布迭代周期是十分长的,公布下来可能要数周到数月,两头要通过逐渐的灰度公布过程。在学习内核常识或者解决生产问题的时候,新问题等不起这么久。但 ssar 工具以文件为采集单位,不须要批改代码,间接批改配置文件,重启 srerar 采集过程就能够采集到一个新的数据源文件。新增采集文件可在 sys.conf 文件中的 file 区域减少一行配置项,其中 sre_path 为数据源地位,cfile 为数据文件存储名,turn 为开启采集。
2)ssar 工具把一些通用解决逻辑都形象到通用查询器 ssar 命令里,配置了文件采集后,只需一条 ssar 命令即可查问显示数据,完满实现分钟级周期的开发迭代。其中 cfile 指定存储文件名,line 指定第 3 行,column 指定第 5 到 15 行,metric 指定显示原值,alias 指定指标名称。
3)ssar 会把更加简单的数据逻辑放到外层 python 语言的查询器中实现。这个时候很容易通过在 python 语言中适应数据格式的变动。内核中有些指标的格局会随着内核版本的变动而变动, 比方 TCP 的 TimeWaitOverflow 指标在 3.10、4.9 和 4.19 版中所处的列数就不同。此时通过 python 语言能够轻松获取 column 值,再传递给 ssar 通用查询器。即便面对将来的内核版本中的各种未知格局变动,咱们也能够在 python 语言查询器中轻松应答自若。可随时调试和降级 python 查询器,如 cp tsar2 /tmp/test.py。不论是单机环境 debug,还是脚本批量下发,均可轻量级操作。
四、ssar 工具整机指标应用介绍
ssar 命令显示整机指标信息,其中 /s 结尾的是增量指标,示意以后时刻和上一个时刻的区间内均匀每秒的增量数值。无 /s 结尾的是刻度指标,只示意以后时刻的瞬时值。
应用 help 选项可获取整机指标应用帮忙信息。
各个选项参数的含意如上所示,选项参数有如下一些特点:
1)-f 选项指定显示数据的完结工夫点,-b 选项指定显示数据的开始工夫点,-r 选项指定显示数据的工夫区间长度,三个选项只需指定 2 个即可。-f 选项默认值为以后时刻,-r 选项默认值为 300 分钟。
2)各个选项参数值大多能够反对输出小数,单位别离反对天、时、分、秒,如 1.2d、5.5h、60m 和 1s。如无单位后缀,则默认单位后缀是 m 分钟,如 60 同 60m。
3)- H 选项用于暗藏 header 信息,使输入后果更便于各种 shell 命令的解析,–api 输入 json 格局数据,使输入后果更便于 python 脚本等高级语言解析。
4)小 o 选项用于指定输入数据列的字段信息,多列指标用逗号隔开。对于高频罕用的多个字段输入,还提供字段组合选项,如 –cpu、–mem。大 O 选项用于在既有字段组合输入根底上,追加输入指标信息。因而,大 O 选项可与 –cpu –mem 等同时应用,而小 o 选项和大 O 选项及其他字段组合互斥。
ssar 对整机指标的采集是以文件为单位,通过 toml 格局的配置文件 /etc/ssar/sys.conf 配置及开关文件的采集:
1)src_path=’/proc/stat’ 示意采集数据源文件地位为 /proc/stat;
2)cfile=’stat’ 示意保留的数据文件后缀名为 stat;
3)turn 选项管制以后采集是否开启,设置为 true 开启采集;
4)gzip 选项管制采集文件是否采纳 gzip 压缩格局存储,设置为 true 开启压缩;
ssar 反对两种数据提取形式,预约义形式和自定义形式。
ssar 预约义指标提取数据形式适宜于应用 ssar 命令间接生产数据的场景。预约义指标可在 sys.conf 文件中灵便的配置,上面 2 个例子阐明了如何配置预约义指标:
1)配置项 user 示意指标名为 user,数据文件后缀为 stat,取结尾为 cpu 的行的第 2 列数据的差值,输入字段宽度 10 个字节。
2)配置项 insegs 示意指标名为 insegs,数据文件后缀为 snmp,取第 8 行的第 11 列数据的差值,输入字段宽度 10 个字节。
配置了预约义指标后,能够进一步配置 view 视图,聚合预约义指标到一个视图下。这就是 ssar –cpu 的命令里 –cpu 的起源。
ssar 也反对自定义指标形式提取数据指标,自定义指标提取数据形式适宜于应用 python 语言封装的查询器应用。如下是一些自定义指标形式的应用示例:
1)取 meminfo 中 MemFree 值,字段名命名为 freessar -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 命令。
各个模块的指标汇合:
tsar2 命令岂但性能非常弱小,而且开发成本极低:
1)tsar2 开发周期只有不到 2 周工夫;
2)tsar2 命令兼容 tsar 性能局部的 python 代码实现只有 600 多行;
3)tsar2 在兼容原有根底性能的根底上还新增了 4 组网络诊断指标,不思考后期预研的工夫,4 组指标的代码实现工夫只用了 2 个小时。4 组网络诊断指标:tsar2 –tcpofo、tsar2 –retran、tsar2 –tcpdrop、tsar2 –tcperr。
基于 ssar 良好的扩展性和低扩大开发门槛,针对软中断散布不均这种业界常见问题,应用 python 语言实现了 3 组功能强大的诊断性能:
1)首先,tsar2 的 cputop 子命令能够将各个核软中断 CPU 使用率 (sirq) 最高的核排序进去。N1 示意排序最高的 CPU 信息,N2 示意排序次高的 CPU 信息。比方 11:35 这个时刻下 N1 的三个值示意 54 号核 CPU 的 sirq 软中断使用率为第 54 号核 CPU 资源的 21.84%。从图中显示的局部数据看 54 号核频繁呈现软中断 sirq 应用较高的状况。
2)如果咱们不确定找到 54 号核 CPU 是否精确,还能够通过 tsar2 命令的 cpu 视图中指定察看 cpu54 核的 sirq 的变动。
3)一旦确定软中断 CPU 使用率异样的 CPU 核号,能够通过 tsar2 的 irqtop 子命令查找引起问题的具体软中断信息。在 irqtop 子命令中指定 54 号 CPU,并排序出软中断次数最多的 irq 号是 155,对应的 irq 名称是 virtio3-input.1,并且看到 11:50:48 秒的软中断次数高达 1.9K。
irqtop 子命令默认只反对实时模式。如需开启历史模式可去掉命令中 - l 选项,同时还须要批改配置文件 sys.conf,开启 interrupts 数据文件的采集。
如此弱小的 cputop 和 irqtop 子命令同样也是在 python 语言中,通过 400 行代码轻松实现。这里也同样表明了在 ssar 架构下,开发新的零碎性能监控性能的灵便劣势。
五、ssar 工具过程指标应用介绍
ssar 的 procs 子命令能够显示多过程信息,成果相当于能够显示任意历史时刻的 linux ps 命令的输入。
ssar 的 procs 子命令选项可参考 ssar procs - h 命令,选项参数有如下一些特点:
1)-f、- b 和 - r 选项同样只需指定 2 个选项即可,- f 选项默认值为以后时刻,- r 选项默认值为 5 分钟。多过程子命令状况下,只会在开始和完结时刻别离取 2 个时刻数据进行比照。刹时的刻度类指标只显示完结时刻值。
2)弱小的字段排序功能反对多字段顺次排序,先按第一个字段排序,雷同值按第二个字段排序。排序字段前减号示意降序排序,排序字段前加号示意升序排序。每个字段都有零碎内建排序规定,通常数据类指标按降序排序,如 rss,属性指标按升序排序,如 pid。
3)所有过程排序后,- l 选项可限度输入过程的行数。
4)两个特色的指标组合 –job 和 –sched,用于过程组和调度问题排查。
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 点 02 分 sleep.sh 过程还没启动,右尖括号 > 示意 7 点 22 分过程已完结。此性能能够帮助判断一个特定过程的开始和完结工夫范畴。
上面通过一个简略的例子,来阐明下如何通过 ssar 过程级指标诊断线程数打满问题。Linux 内核有个参数 kernel.pid_max = 131072,这个参数会设置机器的总线程数下限。
1)一台机器在非工作时段产生了异样过程创立大量线程将线程数打爆的状况。凌晨 3 点整,整机线程数飙升到了 131.1K,且持续时间极短,3 点 1 分曾经复原。
2)传统条件下,这种场景的产生基本来不及期待人工登录下来抓取现场信息。现在有了 ssar 工具对历史信息的主动采集,咱们能够等到工作工夫,应用 ssar 的多过程子命令轻松获取过程级起因。NLWP(Number of light weight process)示意一个过程的线程数,应用 - k 选项数按 nlwp 字段排序能够发现是 pid 为 1045 的 Java 过程引起线程数打满。
3)不释怀的同学,还能够应用 awk 将这个问题时刻 2021-03-30T03:00:00 的所有线程数相加,和为 131024,印证了的确等同于过后机器总线程数 plit 值 131.1K。
六、ssar 工具 load 指标应用介绍
传统的零碎性能监控工具中的 load1 指标只管比 load5 和 load15 指标更精准,依然不能满足排查问题时对工夫范畴的精准度的要求。ssar 在国内外全行业独创了 load5s 指标,该指标能够让咱们将 load 的准确性晋升到 5 秒级的精度。load5s 指标的准确性绝不仅体现在采集频率上,简略说 load5s 指标就是 R+D 的线程数,也是内核数据结构中的全局变量 active 值。为了精确了解 linux load 和 load5s 指标,执行如下试验操作:
找一台试验机器,先编译一个能够模仿 D 状态线程的程序 uninterruptible。而后用 stress 命令启动 100 个过程执行 30 秒后退出。大概再等 20 秒左右再批量循环启动 1000 个 uninterruptible 过程。执行完结后,成果如下图所示。
1)绿色工夫区域,5 分 52 秒时 load5s 和 load1 都处于一个低水位,毫无疑问阐明过后机器负载压力很低。
2)第一个红色工夫区域,随同着 stress 命令开始执行,load5s 和 load1 都同时升高,6 分 07 秒时刻,load5s 值曾经达到 78,load1 开始升高到 6.27,然而这个 load1 的值远远不能体现出以后机器上并发运行的线程的情况。随着工夫的推移,6 分 32 秒这个时刻,load1 的值迟缓升到了 39.22。
3)第一个蓝色工夫区域,随同着 stress 命令过程退出,load5s 曾经迅速跌回到一个低水位,6 分 37 秒这个时刻的 load5s 值也同时迅速升高到了很低的值 0,机器的 R + D 状态线程曾经简直没有了,零碎齐全没有任何压力。但此时 load1 还放弃在 36.08 的高值。显著能够看出传统的 load1 指标在零碎负载压力隐没后,还肯定的滞后性。
在前面 2 个红色区域和 2 个蓝色区域,也能够察看到同样的景象。独特的法则是红色区域开始时刻,代表 R + D 状态线程数的 load5s 值显著很高,但雷同时刻的 load1 却还较低。蓝色区域开始时刻,代表 R + D 状态线程数的 load5s 值曾经为 0,但雷同时刻 load1 却还较高。
下面这个试验充分说明 load5s 才是更能精确反映零碎负载压力的指标,而单纯用 load1 值判断机器的负载是不精确的。所以咱们须要用 load5s 指标代替 load1 指标来精准判断机器负载产生的工夫范畴。这里强调一下,load5s 指标齐全在用户态通过工程化的办法奇妙获取,没有对内核模块的任何依赖。
除 load5s 指标外,下面的解决方案中,还提供了一组指标用于全面的评估零碎负载状况。其中 load5s 是 R+D 状态的线程数之和,runq 是过后的 R 状态线程数,threads 是所有状态线程数总和,因而 threads 值是 load5s 值的天花板,threads 最大值受内核参数设置限度。
ssar 工具还会依据 load5s 和 CPU 核数之比的大小,来触发对 load 详情的采集,前边的 actr 是采集到的并发 R 状态线程数,actd 是采集到的并发 D 状态线程数,act 是 actr 和 actd 数之和。当咱们须要理解 load 形成的具体因素时,能够借助 load2p 子命令进一步显示 actr 和 actd 的详情信息。
未触发 load 详情采集的采集时刻,act 值不存在,显示为短横线 -。能够用 - z 选项过滤出 load5s 子命令输入后果中 act 存在值的时刻,即 ssar load5s -z。
而后再用 load2p 子命令显示更加具体的 load 详情信息,选项 -c 指定须要显示的 load 详情的时刻值。load2p 子命令一共可输入 6 个视图的信息,loadrd、stack、loadr、loadd、psr 和 stackinfo。
1)loadrd 视图显示指定时刻所有 R 和 D 状态的线程信息,每个线程包含线程状态、线程 ID、过程 ID、CPU 核号、线程调度优先级和命令名称。ssar 只采集 R 和 D 状态的线程信息。
2)stack 视图显示抽样后的 D 状态调用栈,最多抽样 100 个。每个 D 状态线程调用栈蕴含线程 ID、过程 ID、过程名称、栈顶函数地位、栈顶函数名和残缺的调用栈。
3)基于以上 2 个视图的信息,load2p 子命令又聚合了 4 个视图信息,并且默认只显示这 4 个聚合视图 loadr、loadd、psr 和 stackinfo。Loadr 视图按 pid 聚合 R 状态线程信息,适宜诊断 loadR 高时的过程级因素。
4)loadd 视图按 pid 聚合 D 状态线程信息,适宜诊断 loadD 高时的过程级因素。
5)psr 视图按 CPU 核号 psr 聚合,适宜诊断绑核不均的状况。
6)stackinfo 视图按调用栈聚合,对 loadD 高时,诊断 D 状态线程产生的起因特地有用。
七、ssar 工具配置文件阐明
ssar 工具的主配置文件是 /etc/ssar/ssar.conf,其中分为 [main]、[load] 和[proc]三局部。
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 命令,如图所示。
了解 CPU Usage 指标:
1)在 A 终端上,期待 stress 执行完结 2 分钟后,执行 tsar2 命令。23 时 25 分的 user 值为 75.60,它的含意示意 23 时 24 分到 23 时 25 分这 60 秒内的均匀 user CPU 应用为 75.60%。这里看出 tsar2 的 user 值等同于 top 命令的 us 值 75.2,区别就是 tsar2 的是 60 秒平均值,top 的是运行时刻的之前 3 秒的平均值,但因为三个 stress 命令运行安稳,top 的 3 秒平均值也根本代表 60 秒的均值。
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 数。
3)咱们能够查看 tsar2 的 python 源码,可能理解到 tsar2 的 user 值是 ssar 的 user 值占 ssar 所有 CPU 使用量之和的百分比。
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 统一。
5)这里咱们能够看到这样的数据关系 301.25 ≈ 100 + 100 + 100 + 3.3,只不过整机 user CPU 值 301.35 是天然工夫乘以了 100HZ,过程级 CPU 是乘以了百分比的 100。应用 ssar –cpu 和 ssar procs –cpu 两个命令,曾经能够将整机总体的 CPU 应用状况和过程级别 CPU 应用状况的关联起来。
6)最初 top 命令中的 us 值和过程信息中的 %CPU 的关系也就天然建设起来了。一点不同就是 top 中是将整体 CPU 应用状况进一步计算了一次百分占比。
九、ssar 工具内存回收案例
在 load 高的各种场景中,有一种 R 状态线程数并发多的 load 高是因为 sys CPU 使用率偏高引起的。ssar 全面的指标体系,从多个角度将这种场景产生过程进行了透彻的出现。为了精确的阐明问题,有必要回顾下内核内存回收的相干概念。如图所示,当整机 free 内存低于黄线 low 阈值时,内核的异步内存回收线程 kswapd 开始被唤醒,kswapd 会在其余过程申请内存的同时回收内存。当整机 free 内存触达红线 min 阈值时,触发整机间接内存回收,所有来自用户空间的内存申请将被阻塞住,线程状态同时转换为 D 状态。此时只有来自内核空间的内存申请能够持续应用 min 值以下的 free 内存。后续当整机 free 内存逐渐复原到绿线 high 阈值以上后,kswapd 线程进行内存回收工作。
上面以 ssar 的数据指标为根据,一步一步的展现了当整机内存缓和后是如何引起 sys CPU 高,并进而引发 load 高的残缺过程:
1)用户空间 java 过程在 20 点 43 分到 20 点 45 分 2 分钟内大量申请 24GB 内存;
2)整机内存 used 在 20 点 43 分到 20 点 45 分 2 分钟内迅速增长了 26GB,同时整机 free 内存迅速缩小了 14GB;
3)free 内存在 20 点 45 分时只有 3GB,低于 low 阈值,pgscan_kswapd/ s 值非 0 表明触发 kswapd 异步内存回收。
4)kswapd 异步内存回收跟不上过程内存申请的速度,当 free 内存低至 min 阈值时,pgscan_direct/ s 值非 0 表明触发间接内存回收,用户空间内存申请过程开始 D 住。栈顶函数 sleep_one_page 和 congestion_wait 等都表明产生了间接内存回收。
5)20 点 44 分到 20 点 45 分呈现大量网络吞吐,每秒进出流量别离达到 1.5G 和 1.0G。网络流量吞吐会伴有内核空间内存申请,持续耗费 min 阈值以下(橙色局部)free 内存。
6)内核网络模块会申请 order3 阶内存,20 点 45 分时刻 buddyinfo 中 order3 以上高阶内存耗费殆尽,残余的 3GB free 内存处于碎片化状态。内核空间申请的内存是间断内存,尽管 order2 和 order1 有库存,但申请 order3 时是无奈被调配的,内核只能处于忙等状态。
7)触发内核态忙等,同时会引发 20 点 44 分到 20 点 45 分的 sys CPU 升高,sys CPU 均匀每秒占总 CPU 资源的 89.61%,挤占用户空间既有过程 CPU 资源,同期用户态 CPU 应用从原来的 72.59% 升高到 7.73%。
8)触发间接内存回收时,会引发大量 D 状态线程,后续 order3 库存枯竭引发 sys CPU 高后,会持续引发大量 R 状态线程。load5s 子命令看到的景象就是先呈现 load5s 指标升高,再呈现 load5s 和 runq 同时升高。
内存回收是生产环境较常见的一个状况。除以上场景外,生产中还会产生其余场景的内存回收, 数据指标的体现上也有差别。还须要借助其余性能剖析工具,联合内核代码进一步剖析。
原文链接
本文为阿里云原创内容,未经容许不得转载。