资源分析Skill ResourceAnalysis

该技能用于从sosreport归档中分析系统资源使用数据,提取内存统计、CPU负载平均值、磁盘空间利用率和进程信息,以诊断资源耗尽、性能瓶颈和容量问题。关键词:系统资源分析、sosreport、内存、CPU、磁盘、进程、性能诊断、Linux运维。

DevOps 0 次安装 0 次浏览 更新于 3/14/2026

名称:资源分析 描述:从sosreport归档中分析系统资源使用数据,提取内存统计、CPU负载平均值、磁盘空间利用率和进程信息,从sosreport目录结构中诊断资源耗尽、性能瓶颈和容量问题

资源分析技能

该技能提供从sosreport归档中分析系统资源使用的详细指导,包括内存、CPU、磁盘空间和进程信息。

何时使用此技能

在以下情况使用此技能:

  • 分析 /sosreport:analyze 命令的资源分析阶段
  • 调查性能问题或资源瓶颈
  • 识别资源耗尽问题
  • 将资源使用与系统故障相关联

先决条件

  • Sosreport归档必须解压到工作目录
  • 必须知道sosreport根目录的路径
  • 理解Linux资源管理

Sosreport中的关键资源数据位置

  1. 内存信息

    • sos_commands/memory/free - 内存使用快照
    • proc/meminfo - 详细内存统计
    • sos_commands/memory/swapon_-s - 交换使用
    • proc/buddyinfo - 内存碎片
  2. CPU信息

    • sos_commands/processor/lscpu - CPU架构和特性
    • proc/cpuinfo - 详细CPU信息
    • sos_commands/processor/turbostat - CPU频率和电源状态(如果可用)
    • uptime - 负载平均值
  3. 磁盘信息

    • sos_commands/filesys/df_-al - 文件系统使用
    • sos_commands/block/lsblk - 块设备信息
    • sos_commands/filesys/mount - 挂载的文件系统
    • proc/diskstats - 磁盘I/O统计
  4. 进程信息

    • sos_commands/process/ps_auxwww - 进程列表和详情
    • sos_commands/process/top - 进程快照(如果可用)
    • proc/[pid]/ - 每个进程的信息

实施步骤

步骤1:分析内存使用

  1. 解析free命令输出

    # 检查free输出是否存在
    if [ -f sos_commands/memory/free ]; then
      cat sos_commands/memory/free
    fi
    
  2. 提取内存指标

    # 解析/proc/meminfo获取详细统计
    if [ -f proc/meminfo ]; then
      grep -E "^(MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree|Dirty|Slab):" proc/meminfo
    fi
    
  3. 计算内存使用百分比

    • 总内存 = MemTotal
    • 已用内存 = MemTotal - MemAvailable
    • 使用百分比 = (已用 / 总) * 100
    • free 输出或 meminfo 计算
  4. 检查内存压力指标

    # 在日志中查找OOM事件
    grep -i "out of memory\|oom killer" sos_commands/logs/journalctl_--no-pager 2>/dev/null
    
    # 检查交换使用
    if [ -f sos_commands/memory/swapon_-s ]; then
      cat sos_commands/memory/swapon_-s
    fi
    
  5. 识别内存问题

    • 内存使用 > 90% → 严重
    • 内存使用 > 80% → 警告
    • 高交换使用 (>50% 交换已用) → 性能问题
    • OOM杀手事件 → 关键内存耗尽

步骤2:分析CPU使用

  1. 提取CPU信息

    # 获取CPU数量和型号
    if [ -f sos_commands/processor/lscpu ]; then
      grep -E "^(CPU\(s\)|Model name|Thread|Core|Socket|CPU MHz):" sos_commands/processor/lscpu
    fi
    
  2. 检查负载平均值

    # 解析uptime获取负载平均值
    if [ -f uptime ]; then
      cat uptime
    fi
    
    # 或从proc/loadavg
    if [ -f proc/loadavg ]; then
      cat proc/loadavg
    fi
    
  3. 解释负载平均值

    • 负载平均值格式:1分钟,5分钟,15分钟
    • 与lscpu中的CPU数量比较
    • 负载 > CPU数量 → 系统过载
    • 负载 >> CPU数量 (2倍或更多) → 严重过载
  4. 检查CPU节流

    # 在日志中查找热节流
    grep -i "throttl\|temperature\|thermal" sos_commands/logs/journalctl_--no-pager 2>/dev/null | head -20
    
  5. 识别CPU问题

    • 1分钟负载 > 2倍CPU数量 → 严重
    • 5分钟负载 > CPU数量 → 警告
    • 存在热节流 → 硬件/冷却问题

步骤3:分析磁盘使用

  1. 解析df输出以获取文件系统使用

    if [ -f sos_commands/filesys/df_-al ]; then
      # 跳过标题和特殊文件系统,仅显示常规文件系统
      grep -v "^Filesystem\|tmpfs\|devtmpfs\|overlay" sos_commands/filesys/df_-al | grep -v "^$"
    fi
    
  2. 识别已满或接近满的文件系统

    # 提取使用率 > 85%的文件系统
    if [ -f sos_commands/filesys/df_-al ]; then
      awk 'NR>1 && $5+0 >= 85 {print $5, $6, $1}' sos_commands/filesys/df_-al | grep -v "tmpfs\|devtmpfs"
    fi
    
  3. 检查磁盘I/O错误

    # 在日志中查找I/O错误
    grep -i "i/o error\|read error\|write error\|bad sector" var/log/dmesg 2>/dev/null
    grep -i "i/o error\|read error\|write error" sos_commands/logs/journalctl_--no-pager 2>/dev/null | head -20
    
  4. 分析块设备

    if [ -f sos_commands/block/lsblk ]; then
      cat sos_commands/block/lsblk
    fi
    
  5. 识别磁盘问题

    • 文件系统 > 95% 满 → 严重
    • 文件系统 > 85% 满 → 警告
    • 存在I/O错误 → 硬件问题
    • 根文件系统满 → 系统稳定性风险

步骤4:分析进程信息

  1. 解析ps输出

    if [ -f sos_commands/process/ps_auxwww ]; then
      # 显示标题
      head -1 sos_commands/process/ps_auxwww
    fi
    
  2. 查找顶级CPU消费者

    # 按CPU使用率排序(第3列),显示前10名
    if [ -f sos_commands/process/ps_auxwww ]; then
      tail -n +2 sos_commands/process/ps_auxwww | sort -k3 -rn | head -10
    fi
    
  3. 查找顶级内存消费者

    # 按内存使用率排序(第4列),显示前10名
    if [ -f sos_commands/process/ps_auxwww ]; then
      tail -n +2 sos_commands/process/ps_auxwww | sort -k4 -rn | head -10
    fi
    
  4. 检查僵尸进程

    # 查找Z状态进程
    if [ -f sos_commands/process/ps_auxwww ]; then
      grep " Z " sos_commands/process/ps_auxwww || echo "未找到僵尸进程"
    fi
    
  5. 按状态统计进程

    # 统计进程状态(R=运行,S=睡眠,D=不可中断,Z=僵尸,T=停止)
    if [ -f sos_commands/process/ps_auxwww ]; then
      tail -n +2 sos_commands/process/ps_auxwww | awk '{print $8}' | cut -c1 | sort | uniq -c
    fi
    
  6. 识别进程问题

    • 存在僵尸进程 → 父进程未回收子进程
    • 许多D状态进程 → I/O瓶颈
    • 单个进程使用 >80% 内存 → 内存泄漏或预期行为
    • 许多进程使用高CPU → CPU争用

步骤5:将资源使用与问题关联

  1. 与日志交叉引用

    • 如果内存使用高,检查日志中的OOM事件
    • 如果磁盘使用高,检查磁盘满错误
    • 如果负载高,检查性能相关错误
  2. 识别资源耗尽模式

    • 内存耗尽 → OOM杀手 → 服务崩溃
    • 磁盘满 → 写入失败 → 应用程序错误
    • CPU过载 → 超时 → 请求失败
  3. 构建时间线

    • 资源问题何时开始?
    • 与日志时间戳关联
    • 如果可能,识别触发事件

步骤6:生成资源分析摘要

创建结构化摘要,包含以下部分:

  1. 内存摘要

    • 总内存
    • 已用内存(GB和百分比)
    • 可用内存
    • 交换使用(GB和百分比)
    • 内存压力指标(OOM事件)
  2. CPU摘要

    • CPU数量和型号
    • 负载平均值(1分钟,5分钟,15分钟)
    • 每CPU负载
    • CPU问题(节流、过载)
  3. 磁盘摘要

    • 文件系统和使用百分比
    • 已满或接近满的文件系统
    • I/O错误计数
    • 最满的文件系统
  4. 进程摘要

    • 总进程数
    • 顶级CPU消费者(前5名)
    • 顶级内存消费者(前5名)
    • 僵尸进程数
    • 不可中断睡眠进程(D状态)
  5. 关键资源问题

    • 按严重性列出问题
    • 提供证据(文件路径、指标)
    • 建议修复

错误处理

  1. 缺少资源文件

    • 如果 free 缺失,直接解析 proc/meminfo
    • 如果 ps 缺失,检查 proc/ 获取进程信息
    • 在摘要中记录缺失数据
  2. 解析错误

    • 处理不同输出格式(free -h 与 free -m)
    • 考虑数字格式的区域差异
    • 在计算前验证数据
  3. 不完整数据

    • 某些sosreport可能未包含所有资源文件
    • 指示哪些指标不可用
    • 仅使用可用数据工作

输出格式

资源分析应产生:

资源使用摘要
======================

内存
------
总计:      {total_gb} GB
已用:       {used_gb} GB ({used_pct}%)
可用:  {available_gb} GB ({available_pct}%)
缓冲区:    {buffers_gb} GB
缓存:     {cached_gb} GB
交换总计: {swap_total_gb} GB
交换已用:  {swap_used_gb} GB ({swap_used_pct}%)

状态: {OK|WARNING|CRITICAL}
问题:
  - {memory_issue_description}

CPU
---
型号:        {cpu_model}
CPU数量:    {cpu_count}
线程/核心: {threads_per_core}

负载平均值: {load_1m}, {load_5m}, {load_15m}
每CPU负载:  {load_1m_per_cpu}, {load_5m_per_cpu}, {load_15m_per_cpu}

状态: {OK|WARNING|CRITICAL}
问题:
  - {cpu_issue_description}

磁盘使用
----------
文件系统                   大小  已用  可用  使用%  挂载点
{filesystem}                 {size} {used} {avail} {pct}% {mount}

接近满的文件系统 (>85%):
  - {mount}: {pct}% 满 ({available} 可用)

I/O错误: {count} 个错误在日志中发现

状态: {OK|WARNING|CRITICAL}
问题:
  - {disk_issue_description}

进程
---------
总进程数: {total}
运行中:         {running}
睡眠中:        {sleeping}
僵尸:          {zombie}
不可中断: {uninterruptible}

顶级CPU消费者:
  1. {process_name} (PID {pid}): {cpu}% CPU, {mem}% 内存
  2. {process_name} (PID {pid}): {cpu}% CPU, {mem}% 内存
  3. {process_name} (PID {pid}): {cpu}% CPU, {mem}% 内存

顶级内存消费者:
  1. {process_name} (PID {pid}): {mem}% 内存, {cpu}% CPU
  2. {process_name} (PID {pid}): {mem}% 内存, {cpu}% CPU
  3. {process_name} (PID {pid}): {mem}% 内存, {cpu}% CPU

状态: {OK|WARNING|CRITICAL}
问题:
  - {process_issue_description}

关键资源问题
------------------------
{严重性}: {issue_description}
  证据: {file_path}
  影响: {impact_description}
  建议: {remediation_action}

建议
---------------
1. {actionable_recommendation}
2. {actionable_recommendation}

数据源
------------
- 内存: {sosreport_path}/sos_commands/memory/free
- 内存: {sosreport_path}/proc/meminfo
- CPU: {sosreport_path}/sos_commands/processor/lscpu
- 负载: {sosreport_path}/uptime
- 磁盘: {sosreport_path}/sos_commands/filesys/df_-al
- 进程: {sosreport_path}/sos_commands/process/ps_auxwww

示例

示例1:内存分析

# 解析free命令输出
$ cat sos_commands/memory/free
              total        used        free      shared  buff/cache   available
Mem:       16277396     8123456     2145678      123456     6008262     7654321
Swap:       8388604      512000     7876604

# 解释:
# - 总RAM: ~16 GB
# - 已用: ~8 GB (50%)
# - 可用: ~7.6 GB (47%)
# - 交换已用: ~500 MB (6%)
# 状态: OK - 健康内存使用

示例2:磁盘满检测

# 查找使用率 > 85%的文件系统
$ awk 'NR>1 && $5+0 >= 85' sos_commands/filesys/df_-al
/dev/sda1      50G   45G   5G   90%  /
/dev/sdb1      100G  96G   4G   96%  /var/log

# 严重:根文件系统90%,/var/log 96%
# 所需操作:清理磁盘空间

示例3:高负载调查

# 检查负载平均值
$ cat uptime
14:23:45 up 10 days, 3:42, 2 users, load average: 8.45, 7.23, 6.12

# 使用lscpu显示4个CPU:
# 每CPU负载: 2.1, 1.8, 1.5
# 系统过载(负载 > 2倍CPU数量)

有效分析技巧

  1. 上下文重要:高资源使用不总是坏事 - 考虑工作负载
  2. 寻找趋势:比较1分钟、5分钟、15分钟负载以查看问题是否增长
  3. 关联指标:高负载 + 高内存 + 磁盘满 = 多个问题
  4. 检查比率:使用百分比比绝对值更有意义
  5. 验证发现:与日志分析交叉引用以确认
  6. 考虑容量:系统是否适合其工作负载?

常见资源模式

  1. 内存泄漏:内存使用稳步增加,最终OOM
  2. 磁盘满:应用程序写入失败,日志轮换问题
  3. CPU峰值:负载平均值峰值,可能来自失控进程
  4. I/O瓶颈:高负载但低CPU使用,许多D状态进程
  5. 交换颠簸:高交换使用,性能差
  6. 僵尸积累:父进程错误未回收子进程

严重性分类

指标 OK 警告 严重
内存使用 < 80% 80-90% > 90%
交换使用 < 20% 20-50% > 50%
磁盘使用 < 85% 85-95% > 95%
负载(每CPU) < 1.0 1.0-2.0 > 2.0
根FS使用 < 80% 80-90% > 90%

另请参见

  • 日志分析技能:用于在日志中查找资源相关错误
  • 系统配置分析技能:用于调查服务资源限制
  • 网络分析技能:用于网络相关性能问题