名称:资源分析 描述:从sosreport归档中分析系统资源使用数据,提取内存统计、CPU负载平均值、磁盘空间利用率和进程信息,从sosreport目录结构中诊断资源耗尽、性能瓶颈和容量问题
资源分析技能
该技能提供从sosreport归档中分析系统资源使用的详细指导,包括内存、CPU、磁盘空间和进程信息。
何时使用此技能
在以下情况使用此技能:
- 分析
/sosreport:analyze命令的资源分析阶段 - 调查性能问题或资源瓶颈
- 识别资源耗尽问题
- 将资源使用与系统故障相关联
先决条件
- Sosreport归档必须解压到工作目录
- 必须知道sosreport根目录的路径
- 理解Linux资源管理
Sosreport中的关键资源数据位置
-
内存信息:
sos_commands/memory/free- 内存使用快照proc/meminfo- 详细内存统计sos_commands/memory/swapon_-s- 交换使用proc/buddyinfo- 内存碎片
-
CPU信息:
sos_commands/processor/lscpu- CPU架构和特性proc/cpuinfo- 详细CPU信息sos_commands/processor/turbostat- CPU频率和电源状态(如果可用)uptime- 负载平均值
-
磁盘信息:
sos_commands/filesys/df_-al- 文件系统使用sos_commands/block/lsblk- 块设备信息sos_commands/filesys/mount- 挂载的文件系统proc/diskstats- 磁盘I/O统计
-
进程信息:
sos_commands/process/ps_auxwww- 进程列表和详情sos_commands/process/top- 进程快照(如果可用)proc/[pid]/- 每个进程的信息
实施步骤
步骤1:分析内存使用
-
解析free命令输出:
# 检查free输出是否存在 if [ -f sos_commands/memory/free ]; then cat sos_commands/memory/free fi -
提取内存指标:
# 解析/proc/meminfo获取详细统计 if [ -f proc/meminfo ]; then grep -E "^(MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree|Dirty|Slab):" proc/meminfo fi -
计算内存使用百分比:
- 总内存 = MemTotal
- 已用内存 = MemTotal - MemAvailable
- 使用百分比 = (已用 / 总) * 100
- 从
free输出或meminfo计算
-
检查内存压力指标:
# 在日志中查找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 -
识别内存问题:
- 内存使用 > 90% → 严重
- 内存使用 > 80% → 警告
- 高交换使用 (>50% 交换已用) → 性能问题
- OOM杀手事件 → 关键内存耗尽
步骤2:分析CPU使用
-
提取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 -
检查负载平均值:
# 解析uptime获取负载平均值 if [ -f uptime ]; then cat uptime fi # 或从proc/loadavg if [ -f proc/loadavg ]; then cat proc/loadavg fi -
解释负载平均值:
- 负载平均值格式:1分钟,5分钟,15分钟
- 与lscpu中的CPU数量比较
- 负载 > CPU数量 → 系统过载
- 负载 >> CPU数量 (2倍或更多) → 严重过载
-
检查CPU节流:
# 在日志中查找热节流 grep -i "throttl\|temperature\|thermal" sos_commands/logs/journalctl_--no-pager 2>/dev/null | head -20 -
识别CPU问题:
- 1分钟负载 > 2倍CPU数量 → 严重
- 5分钟负载 > CPU数量 → 警告
- 存在热节流 → 硬件/冷却问题
步骤3:分析磁盘使用
-
解析df输出以获取文件系统使用:
if [ -f sos_commands/filesys/df_-al ]; then # 跳过标题和特殊文件系统,仅显示常规文件系统 grep -v "^Filesystem\|tmpfs\|devtmpfs\|overlay" sos_commands/filesys/df_-al | grep -v "^$" fi -
识别已满或接近满的文件系统:
# 提取使用率 > 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 -
检查磁盘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 -
分析块设备:
if [ -f sos_commands/block/lsblk ]; then cat sos_commands/block/lsblk fi -
识别磁盘问题:
- 文件系统 > 95% 满 → 严重
- 文件系统 > 85% 满 → 警告
- 存在I/O错误 → 硬件问题
- 根文件系统满 → 系统稳定性风险
步骤4:分析进程信息
-
解析ps输出:
if [ -f sos_commands/process/ps_auxwww ]; then # 显示标题 head -1 sos_commands/process/ps_auxwww fi -
查找顶级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 -
查找顶级内存消费者:
# 按内存使用率排序(第4列),显示前10名 if [ -f sos_commands/process/ps_auxwww ]; then tail -n +2 sos_commands/process/ps_auxwww | sort -k4 -rn | head -10 fi -
检查僵尸进程:
# 查找Z状态进程 if [ -f sos_commands/process/ps_auxwww ]; then grep " Z " sos_commands/process/ps_auxwww || echo "未找到僵尸进程" fi -
按状态统计进程:
# 统计进程状态(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 -
识别进程问题:
- 存在僵尸进程 → 父进程未回收子进程
- 许多D状态进程 → I/O瓶颈
- 单个进程使用 >80% 内存 → 内存泄漏或预期行为
- 许多进程使用高CPU → CPU争用
步骤5:将资源使用与问题关联
-
与日志交叉引用:
- 如果内存使用高,检查日志中的OOM事件
- 如果磁盘使用高,检查磁盘满错误
- 如果负载高,检查性能相关错误
-
识别资源耗尽模式:
- 内存耗尽 → OOM杀手 → 服务崩溃
- 磁盘满 → 写入失败 → 应用程序错误
- CPU过载 → 超时 → 请求失败
-
构建时间线:
- 资源问题何时开始?
- 与日志时间戳关联
- 如果可能,识别触发事件
步骤6:生成资源分析摘要
创建结构化摘要,包含以下部分:
-
内存摘要:
- 总内存
- 已用内存(GB和百分比)
- 可用内存
- 交换使用(GB和百分比)
- 内存压力指标(OOM事件)
-
CPU摘要:
- CPU数量和型号
- 负载平均值(1分钟,5分钟,15分钟)
- 每CPU负载
- CPU问题(节流、过载)
-
磁盘摘要:
- 文件系统和使用百分比
- 已满或接近满的文件系统
- I/O错误计数
- 最满的文件系统
-
进程摘要:
- 总进程数
- 顶级CPU消费者(前5名)
- 顶级内存消费者(前5名)
- 僵尸进程数
- 不可中断睡眠进程(D状态)
-
关键资源问题:
- 按严重性列出问题
- 提供证据(文件路径、指标)
- 建议修复
错误处理
-
缺少资源文件:
- 如果
free缺失,直接解析proc/meminfo - 如果
ps缺失,检查proc/获取进程信息 - 在摘要中记录缺失数据
- 如果
-
解析错误:
- 处理不同输出格式(free -h 与 free -m)
- 考虑数字格式的区域差异
- 在计算前验证数据
-
不完整数据:
- 某些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分钟、5分钟、15分钟负载以查看问题是否增长
- 关联指标:高负载 + 高内存 + 磁盘满 = 多个问题
- 检查比率:使用百分比比绝对值更有意义
- 验证发现:与日志分析交叉引用以确认
- 考虑容量:系统是否适合其工作负载?
常见资源模式
- 内存泄漏:内存使用稳步增加,最终OOM
- 磁盘满:应用程序写入失败,日志轮换问题
- CPU峰值:负载平均值峰值,可能来自失控进程
- I/O瓶颈:高负载但低CPU使用,许多D状态进程
- 交换颠簸:高交换使用,性能差
- 僵尸积累:父进程错误未回收子进程
严重性分类
| 指标 | 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% |
另请参见
- 日志分析技能:用于在日志中查找资源相关错误
- 系统配置分析技能:用于调查服务资源限制
- 网络分析技能:用于网络相关性能问题