石家庄大型网站建设,商铺装修找谁,确定网站建设目标,海洋seo简介#xff1a; 你还在为分析机器负载高而苦恼#xff1f;这款 ssar 工具独创 load5s 指标精准定位超硬核。
编者按#xff1a;本文整理自龙蜥SIG技术周会#xff0c;作者闻茂泉#xff0c;阿里云计算平台事业部SRE运维专家#xff0c;是龙蜥社区跟踪诊断SIG核心成员…简介 你还在为分析机器负载高而苦恼这款 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采集器 sresarC 语言实现的一个常驻进程将数据记录到本地磁盘采集数据内容包括(a) 按文件单位采集的整机数据、meminfo、stat、vmstat等 (b) 包含 24 个指标的进程级数据(c) 独特的 load5s 指标和详细的 R 或 D 状态线程详情数据
2通用查询器 ssar 命令c 语言实现负责按文件名、某行、某列等通用规则对文件数据进行逻辑解析
3古典查询器tsar2python 语言实现对 ssar 命令进行封装全面兼容 tsar 命令
4增强查询器ssarpython 语言实现对 ssar 命令进行封装规划上是未来 ssar 工具的主要核心适合于把较复杂的数据逻辑放在 python 语言实现层。
三、系统性能分析工具 ssar 支持快速开发迭代
传统 sar 工具只采集一些固定指标使用 C 语言采集数据的同时进行指标解析。在这种模式下不是极难扩展新指标就是扩展新指标开发迭代周期特别长。
ssar工具完全颠覆了传统 sar工具的架构设计在产品设计和程序架构上做了很多变化可以让我们快速、低开发成本的增加新的计数器指标。
1如果我们需要关注一个新的指标而这个指标又没有被采集。对于传统的系统性能监控工具sar来说修改发布迭代周期是非常长的发布下来可能要数周到数月中间要经过逐步的灰度发布过程。在学习内核知识或者解决生产问题的时候新问题等不起这么久。但 ssar 工具以文件为采集单位不需要修改代码直接修改配置文件重启 srerar 采集进程就可以采集到一个新的数据源文件。新增采集文件可在 sys.conf 文件中的 file 区域增加一行配置项其中 sre_path 为数据源位置cfile 为数据文件存储名turn 为开启采集。
2ssar 工具把一些通用处理逻辑都抽象到通用查询器 ssar 命令里配置了文件采集后只需一条 ssar 命令即可查询显示数据完美实现分钟级周期的开发迭代。其中cfile指定存储文件名line 指定第 3 行column 指定第 5 到 15 行metric 指定显示原值alias指定指标名称。
3ssar 会把更加复杂的数据逻辑放到外层 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 配置及开关文件的采集
1src_path/proc/stat 表示采集数据源文件位置为/proc/stat
2cfilestat表示保存的数据文件后缀名为 stat
3turn 选项控制当前采集是否开启设置为 true 开启采集
4gzip 选项控制采集文件是否采用 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 metricc|cfilememinfo|line_beginMemFree:|column2|aliasfree
2取 snmp 中第 8 行第 13 列值的差值ssar -o metricd:cfilesnmp:line8:column13:aliasretranssegs
3显示 cpu0 到 cpu15 的 idle 的实时模式数据
ssar -o metricd|cfilestat|line2-17|column5|aliasidle_{line}; -f 100
自定义方式使用方法说明
1cfile 用来指定数据文件中的后缀名需要同 sys.conf 配置文件中的 [file] 部分的 cfile 的值保持一致
2line 直接指定指标所在的行数line 与 line_begin 不能同时指定
3line_begin 指定指标所在行的行首匹配关键字符串需要保证在整个文件中独一无二
4column 指定指标在特定行所处的列数列以空格为分隔符
5metric 用于指定按以上规则获取到值后是原值输出还是取相邻时间的差值输出值为c表示原值输出为d表示取差值输出
6alias 用于指定当前指标输出的标题名或 json 格式中的 key 值.
tsar工具是阿里集团的一款经典系统性能监控工具。基于ssar命令的整机自定义指标方式使用python语言封装的 tsar2 命令几乎完全兼容tsar命令。
各个模块的指标集合
tsar2 命令不但功能十分强大而且开发成本极低
1tsar2开发周期只有不到2周时间
2tsar2命令兼容 tsar 功能部分的python代码实现只有600多行
3tsar2在兼容原有基础功能的基础上还新增了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 指标就是 RD 的线程数也是内核数据结构中的全局变量 active 值。为了准确理解 linux load 和 load5s 指标执行如下实验操作 找一台实验机器先编译一个可以模拟 D 状态线程的程序 uninterruptible。然后用 stress 命令启动 100 个进程执行 30 秒后退出。大约再等 20 秒左右再批量循环启动 1000 个 uninterruptible 进程。执行结束后效果如下图所示。 1绿色时间区域5 分 52 秒时 load5s 和 load1 都处于一个低水位毫无疑问说明当时机器负载压力很低。
2第一个红色时间区域伴随着stress命令开始执行load5s 和 load1 都同时升高6分07秒时刻load5s 值已经达到78load1 开始升高到 6.27但是这个 load1 的值远远不能体现出当前机器上并发运行的线程的状况。随着时间的推移6分32秒这个时刻load1的值缓慢升到了39.22。
3第一个蓝色时间区域伴随着stress命令进程退出load5s已经迅速跌回到一个低水位6分37秒这个时刻的 load5s 值也同时迅速降低到了很低的值0机器的RD状态线程已经几乎没有了系统完全没有任何压力。但此时load1还保持在36.08的高值。明显可以看出传统的 load1 指标在系统负载压力消失后还一定的滞后性。
在后面2个红色区域和2个蓝色区域也可以观察到同样的现象。共同的规律是红色区域开始时刻代表RD状态线程数的load5s值明显很高但相同时刻的load1却还较低。蓝色区域开始时刻代表RD状态线程数的load5s值已经为0但相同时刻load1却还较高。
上面这个实验充分说明 load5s 才是更能准确反映系统负载压力的指标而单纯用 load1 值判断机器的负载是不准确的。所以我们需要用 load5s 指标替代 load1 指标来精准判断机器负载发生的时间范围。这里强调一下load5s指标完全在用户态通过工程化的方法巧妙获取没有对内核模块的任何依赖。
除 load5s 指标外上面的解决方案中还提供了一组指标用于全面的评估系统负载情况。其中 load5s 是 RD 状态的线程数之和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。
1loadrd视图显示指定时刻所有R和D状态的线程信息每个线程包括线程状态、线程ID、进程ID、CPU核号、线程调度优先级和命令名称。ssar 只采集 R 和 D 状态的线程信息。 2stack视图显示抽样后的D状态调用栈最多抽样100个。每个D状态线程调用栈包含线程ID、进程ID、进程名称、栈顶函数位置、栈顶函数名和完整的调用栈。 3基于以上2个视图的信息load2p子命令又聚合了4个视图信息并且默认只显示这4个聚合视图 loadr、loadd、psr 和stackinfo。Loadr 视图按 pid 聚合 R 状态线程信息适合诊断 loadR 高时的进程级因素。
4loadd视图按pid聚合D状态线程信息适合诊断loadD高时的进程级因素。
5psr视图按CPU核号psr聚合适合诊断绑核不均的情况。
6stackinfo视图按调用栈聚合对loadD高时诊断D状态线程发生的原因特别有用。
七、ssar工具配置文件说明
ssar工具的主配置文件是/etc/ssar/ssar.conf其中分为[main]、[load]和[proc]三部分。 1[main]部分配置选项主要用于设置ssar工具整体的一些选项内容[load]和[proc]分别对应load信息采集和进程信息采集部分的选项整机信息的配置选项在前文介绍的/etc/ssar/sys.conf文件中独立设置。
2duration_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 3free内存在20点45分时只有3GB低于low阈值pgscan_kswapd/s值非0表明触发kswapd异步内存回收。 4kswapd异步内存回收跟不上进程内存申请的速度当free内存低至min阈值时pgscan_direct/s值非0表明触发直接内存回收用户空间内存申请进程开始D住。栈顶函数sleep_one_page和congestion_wait等都表明发生了直接内存回收。
520点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同时升高。 内存回收是生产环境较常见的一个情况。除以上场景外生产中还会发生其他场景的内存回收,数据指标的表现上也有差异。还需要借助其他性能分析工具结合内核代码进一步分析。
原文链接
本文为阿里云原创内容未经允许不得转载。