系统性能分析从入门到进阶(2)

简介: 系统性能分析从入门到进阶

RTFSC




有的时候RTFM已经不够了, 手册包括工具本身的更新没对上内核的节奏, 我们回到上面页面回收的例子, 估计有的同学之前就有疑问, 没有scan哪里来的steal。


#sar -B 1
    11:00:16 AM     pgscank/s pgscand/s pgsteal/s    %vmeff    11:00:17 AM          0.00      0.00   3591.00      0.00    11:00:18 AM          0.00      0.00  10313.00      0.00    11:00:19 AM          0.00      0.00   8452.00      0.00


先看sysstat (sar) 里面的实现, 主要是读取分析/proc/vmstat:


  • pgscand: 对应到pgscan_direct域
  • pgscank: 对应到pgscan_kswapd域
  • pgsteal: 对应到pgsteal_开头的
#gdb --args ./sar -B 1
(gdb) b read_vmstat_paging
(gdb) set follow-fork-mode child
(gdb) r
Breakpoint 1, read_vmstat_paging (st_paging=0x424f40) at rd_stats.c:751
751             if ((fp = fopen(VMSTAT, "r")) == NULL)
(gdb) n
754             st_paging->pgsteal = 0;
(gdb)
757             while (fgets(line, sizeof(line), fp) != NULL) {
(gdb)
759                     if (!strncmp(line, "pgpgin ", 7)) {
(gdb)
763                     else if (!strncmp(line, "pgpgout ", 8)) {
(gdb)
767                     else if (!strncmp(line, "pgfault ", 8)) {
(gdb)
771                     else if (!strncmp(line, "pgmajfault ", 11)) {
(gdb)
775                     else if (!strncmp(line, "pgfree ", 7)) {
(gdb)
779                     else if (!strncmp(line, "pgsteal_", 8)) {
(gdb)
784                     else if (!strncmp(line, "pgscan_kswapd", 13)) {
(gdb)
789                     else if (!strncmp(line, "pgscan_direct", 13)) {
(gdb)
757             while (fgets(line, sizeof(line), fp) != NULL) {
(gdb)



看下/proc/vmstat都有什么:

#grep pgsteal_ /proc/vmstat
pgsteal_kswapd 168563
pgsteal_direct 0
pgsteal_anon 0
pgsteal_file 978205
#grep pgscan_ /proc/vmstat
pgscan_kswapd 204242
pgscan_direct 0
pgscan_direct_throttle 0
pgscan_anon 0
pgscan_file 50583828

最后看看内核的实现, pgsteal和pgscan的逻辑是一样, 除了nr_scanned换成了nr_reclaimed:



 if (current_is_kswapd()) {
        if (!cgroup_reclaim(sc))
            __count_vm_events(PGSCAN_KSWAPD, nr_scanned);
        count_memcg_events(lruvec_memcg(lruvec), PGSCAN_KSWAPD,
                   nr_scanned);
    } else {
        if (!cgroup_reclaim(sc))
            __count_vm_events(PGSCAN_DIRECT, nr_scanned);
        count_memcg_events(lruvec_memcg(lruvec), PGSCAN_DIRECT,
                   nr_scanned);
    }
    __count_vm_events(PGSCAN_ANON + file, nr_scanned);

现在问题很清晰了:


  • 这里sar取得是系统的/proc/vmstat, 而cgroup里面pgscan_kswapd和pgscan_direct只会加到cgroup的统计, 不会加到系统级的统计




  • cgroup里面pgsteal_kswapd和pgsteal_direct同样只会加到cgroup自己的统计




  • 但是主要pgscan_anon, pgscan_file和pgsteal_anon, pgsteal_file都只加到系统级的统计




  • sar读取了pgscan_kswapd, pgscan_direct, 以及pgsteal_*, 这里*还包括了pgsteal_anon和pgsteal_file



这整个逻辑都乱了, 我们有必要解决这个bug让sar的输出变得更加有意义. 那么在cgroup内是不是没问题?


#df -h .
Filesystem      Size  Used Avail Use% Mounted on
cgroup             0     0     0    - /sys/fs/cgroup/memory
#grep -c 'pgscan\|pgsteal' memory.stat
0

这些统计信息在cgroup v1上完全没有输出, 而只在v2版本有输出. 在以前内核没有专门LRU_UNEVICTABLE的时候, 如果有很多比如mlock page的时候, 碰到过不停扫描却不能回收内存的情况, 这个统计会非常有用, 即使是现在我相信这个统计还是有用的, 只是大部分时候还不用看到这么细。




07


多上手




纸上得来终觉浅, 自己动手去做带来很多好处:


  • 回答预设问题. 调试分析就是不断提出问题和验证的过程, 没有上手的话就会一直停留在第一个问题上. 比如我想了解某平台上物理内存是怎么编址的, 没有文档的话只能自己去实验




  • 提出新的问题. 调试分析中不怕有问题, 怕的是提不出问题




  • 会有意外收获. 很多时候并不是有意为之, 比如准备的是分析cpu调频能否降功耗, 上去却发现系统一直运行在最低频率




  • 熟练. 熟练就是效率




  • 改进产品. 可以试想下在整个云环境所有机器上扫描 (类似全面体检) 会发现多少潜在问题
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
3月前
|
监控 Linux
性能分析之 Linux 系统中 ps&top 中 CPU 百分比不一致?
【8月更文挑战第18天】性能分析之 Linux 系统中 ps&top 中 CPU 百分比不一致?
150 4
|
3月前
|
Prometheus Kubernetes 监控
性能分析之系统资源饱和度
【8月更文挑战第17天】性能分析之系统资源饱和度
40 0
性能分析之系统资源饱和度
|
4月前
|
存储 固态存储 Linux
systemd-analyze:Linux系统启动性能分析的利器
`systemd-analyze`是Linux下分析systemd启动性能的工具,它提供启动时间统计、服务耗时、依赖关系及图形化展示。通过`blame`查看服务启动时间,`critical-chain`显示关键路径,`plot`生成启动时间线图。使用时注意日志完整性,优化服务顺序,并结合最佳实践提升启动效率。
|
5月前
|
SQL 存储 关系型数据库
MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)
MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)
|
6月前
|
监控 Linux 测试技术
性能分析之Linux系统平均负载案例分析
【4月更文挑战第20天】在上文性能基础之理解Linux系统平均负载和CPU使用率中,我们详细介绍了 Linux 系统平均负载的相关概念,本文我们来做几个案例分析,以达到加深理解。
92 2
性能分析之Linux系统平均负载案例分析
|
6月前
|
SQL 监控 架构师
linux系统性能分析的目的
【4月更文挑战第19天】在Linux系统中,找到性能瓶颈是关键,涉及应用程序、操作系统、硬件和网络的全面排查。优化方案通常针对应用程序和操作系统,而硬件和网络问题较易定位。目标是平衡资源使用,确保系统响应和稳定性。系统管理员、架构设计人员和开发人员共同参与,通过监控硬件、网络、配置和代码来优化性能。流程包括管理员初步判断,架构师处理结构问题,开发人员优化代码,实现系统资源的均衡利用。
49 1
|
Linux 调度
Linux系统调试篇——Perf性能分析指南
Linux系统调试篇——Perf性能分析指南
|
缓存 监控 Linux
Linux系统性能分析
Linux系统性能分析
4761 2
|
9天前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
43 1
|
9天前
|
缓存 监控 Linux
掌握Linux性能分析:深入探索perf工具
【10月更文挑战第26天】
14 1