使用atop监控系统资源和排查性能问题

2025-04-29 23:27:00
丁国栋
原创 57
摘要:本文记录如何使用atop来监控系统资源和排查性能问题。

服务崩溃和服务器宕机是开发运维人员最头疼的问题之一,特别是在日志没有成功写入磁盘(我遇到过多次syslog和kern.log在服务中断期间内容缺失的情况)的情况。即使系统已经接入了监控系统,但如果监控项不够细致的话,还是难以找到问题的根源。为了能查清楚问题故障期间系统的性能和进程级资源消耗,我们需要借助额外的工具来提供必要的数据支持。


atop (Advanced System & Process Monitor)是一款功能强大的系统监控工具,能够记录系统资源(如 CPU、内存、磁盘、网络等)的详细使用情况,并支持日志回放和分析。以下是关于 atop 及其日志分析工具的详细介绍:


1. atop 命令基础 功能 • 实时监控:动态显示系统资源使用情况(类似 top,但更详细)。

• 日志记录:定期将系统状态保存到日志文件中(默认路径 /var/log/atop),支持后续分析。

• 全面指标:覆盖 CPU、内存、磁盘 I/O、网络、进程级资源消耗等。

安装 • Linux 系统(通过包管理器):

sudo apt install atop # Debian/Ubuntu

sudo yum install atop # CentOS/RHEL

配置

默认配置文件是 /etc/default/atop

默认配置是:


LOGOPTS=""
LOGINTERVAL=600
LOGGENERATIONS=28
LOGPATH=/var/log/atop
LOGINTERVAL 是收集日志的间隔,单位:秒


LOGGENERATIONS 是保存日志的天数,单位:天

修改建议:可以把LOGINTERVAL修改得短一些,比如1分钟或半分钟等。注意如果LOGINTERVAL改的过短,日志可能会很大。


常用命令 

• 实时监控:

 atop

• 查看历史日志(按时间范围):

 atop -r /var/log/atop/atop_20240301 # 指定日志文件

• 过滤特定时间点:

 atop -r /var/log/atop/atop_20240301 -b 14:00 -e 15:00

• 进程级统计:

 atop -P CPU,MEM # 按 CPU 或内存排序进程

关键快捷键(实时模式)

c:切换进程 CPU 视图。

m:切换内存视图。

d:显示磁盘 I/O。

n:显示网络统计。

t:跳转到下一个时间点(日志回放时)。


2. atop 日志分析工具 

日志文件 

• 默认存储路径:/var/log/atop/,文件名如 atop_YYYYMMDD

• 日志通过 cron 任务定期生成(如每小时),由 /etc/cron.d/atop 配置。

分析工具

• 内置回放功能:

 atop -r /path/to/logfile # 交互式查看历史数据

• 生成统计报告:

 atop -r /path/to/logfile -P CPU | head -20 # 输出 CPU 使用最高的 20 个进程

• 导出为 CSV(需额外工具如 atop2csv):

 atop -r /path/to/logfile -P CPU > cpu_stats.csv

第三方工具 

• atop2csv:将二进制日志转换为 CSV 格式。

• atop-analyzer:生成 HTML 报告,可视化资源趋势。

• 自定义脚本:结合 awk/sed 提取关键指标。


3. 典型应用场景

  1. 故障排查

    • 检查磁盘 I/O 瓶颈(如 DSK 视图中的 busy%)。

    • 通过日志回放定位 CPU 峰值或内存泄漏的进程。

  2. 性能分析

    • 长期统计资源使用趋势(如每日 CPU 平均负载)。

    • 对比不同时间段的系统表现。

  3. 安全审计

    • 分析异常进程的活动(如未授权的 sudo 操作)。


4. 注意事项

• 日志轮转:默认配置可能只保留几天日志,需调整 /etc/atop/atop.daily 中的 -r 参数。

• 资源开销:高频记录可能占用磁盘空间,建议根据需求调整采样间隔(如从 10 秒改为 5 分钟)。


5. 替代工具对比

工具 特点
sar 系统活动报告(sysstat 包),适合长期趋势统计,但缺少进程级细节。
htop 实时进程监控,交互友好,但无日志功能。
Prometheus 云原生监控,需配合 Grafana 可视化,适合分布式系统。

以下是针对 atop 日志界面的逐项解析:

1. PRC(进程统计)

PRC | sys 2.12s | user 6.88s | #proc 673 | #trun 3 | #tslpi 2796 | #tslpu 1 | #tidle 172 | #zombie 0 | clones 344 | #exit 67 |

• sys:内核态 CPU 时间(2.12秒)。

• user:用户态 CPU 时间(6.88秒)。

• #proc:总进程数(673个)。

• #trun:正在运行的进程数(3个)。

• #tslpi:可中断睡眠的进程数(2796个,通常是等待 I/O)。

• #tslpu:不可中断睡眠的进程数(1个,如等待磁盘 I/O)。

• #tidle:空闲的线程数(172个)。

• #zombie:僵尸进程数(0个)。

• clones:新创建的进程/线程数(344个)。

• #exit:退出的进程数(67个)。


2. CPU(CPU 使用率)

CPU | sys 23% | user 68% | irq 0% | idle 1904% | wait 6% | steal 0% | guest 0% | curf 1.45GHz |

• sys:内核态 CPU 使用率(23%)。

• user:用户态 CPU 使用率(68%)。

• irq:硬件中断占用率(0%)。

• idle:空闲 CPU 总百分比(1904%,20核 CPU 的 95.2% 平均空闲)。

• wait:I/O 等待 CPU 时间(6%)。

• steal:虚拟机被 hypervisor 占用的 CPU(0%)。

• guest:运行虚拟机的 CPU 时间(0%)。

• curf:当前 CPU 频率(1.45GHz)。


3. CPL(CPU 负载)

CPL | numcpu 20 | avg1 1.95 | avg5 1.16 | avg15 0.98 | csw 116794 | intr 71612 |

• numcpu:CPU 核心数(20个)。

• avg1/5/15:1/5/15 分钟的平均负载(1.95、1.16、0.98)。

• csw:上下文切换次数(116794次)。

• intr:中断次数(71612次)。


4. MEM(内存使用)

MEM | tot 31.2G | free 12.2G | avail 19.7G | cache 6.9G | dirty 1.7M | buff 770.3M | slab 1.1G | slrec 646.1M |

• tot:总内存(31.2GB)。

• free:完全空闲内存(12.2GB)。

• avail:可用内存(含缓存,19.7GB)。

• cache:页缓存(6.9GB)。

• dirty:待写入磁盘的缓存(1.7MB)。

• buff:缓冲区内存(770.3MB)。

• slab:内核 Slab 分配器占用(1.1GB)。

• slrec:可回收的 Slab 内存(646.1MB)。


5. SWP(交换分区)

SWP | tot 8.0G | free 8.0G | swcac 0.0M | zswap 0.0M | vmcom 43.6G | vmlim 23.6G |

• tot/free:交换分区总量/剩余(8.0GB/8.0GB,未使用)。

• swcac:交换缓存(0MB)。

• zswap:压缩交换缓存(0MB)。

• vmcom/vmlim:进程总虚拟内存/限制(43.6GB/23.6GB)。


6. DSK/LVM(磁盘/LVM 统计)

DSK | nvme0n1 | busy 6% | read 2 | write 498 | KiB/w 9 | MBw/s 0.5 | avio 1.16 ms |

• busy:磁盘繁忙时间占比(6%)。

• read/write:读/写次数(2/498次)。

• KiB/w:每次写入的数据量(9KB)。

• MBw/s:写入吞吐量(0.5MB/s)。

• avio:平均 I/O 延迟(1.16毫秒)。


7. NET(网络统计)

NET | enp5s0 | pcki 297 | pcko 90 | sp 1000 Mbps | si 39 Kbps | so 11 Kbps | erri 0 |

• pcki/pcko:收/发包数(297/90个)。

• sp:接口速度(1000Mbps)。

• si/so:接收/发送带宽(39/11 Kbps)。

• erri/erro:收/发错误数(0个)。


以下是 atop 进程列表中各列的详细解释:


1. 进程基础信息

列名 全称/含义 示例/说明
PID Process ID 进程的唯一标识符(如 1234)。
CMD Command 进程名称或命令行(如 nginx/usr/bin/python3 app.py)。
S Process State 进程状态(见下方 ST 的详细说明)。

2. CPU 相关统计

列名 全称/含义 说明
SYSCPU System CPU Time 进程在内核态消耗的 CPU 时间(单位:秒或百分比)。
USRCPU User CPU Time 进程在用户态消耗的 CPU 时间(单位:秒或百分比)。
CPU CPU Usage 进程当前的总 CPU 占用率(百分比,如 68%)。
CPUNR CPU Number 进程正在运行的 CPU 核心编号(如 2 表示运行在核心 2)。

3. 延迟与资源等待

列名 全称/含义 说明
RDELAY Read Delay 进程因等待读 I/O 阻塞的时间(单位:毫秒或百分比)。
BDELAY Block Delay 进程因等待块设备 I/O(如磁盘)阻塞的时间(单位:毫秒或百分比)。

4. 内存相关统计

列名 全称/含义 说明
VGROW Virtual Memory Growth 进程虚拟内存的增量(如 +512K,表示最近采样周期内新增的虚拟内存)。
RGROW Resident Memory Growth 进程常驻内存的增量(如 +256K,表示最近采样周期内新增的物理内存占用)。

5. 权限与状态

列名 全称/含义 说明
RUID Real User ID 启动进程的用户 ID(如 root 或 UID 0)。
EUID Effective User ID 进程实际生效的用户 ID(可能因 setuid 改变,如 www-data)。
ST Process State 进程状态(见下方 详细说明)。
EXC Exit Code 进程退出时的状态码(仅对已终止进程有效)。

6. 线程与状态详情

列名 全称/含义 说明
THR Threads 进程包含的线程数(如 4 表示 4 个线程)。
ST Process State 单字母表示进程状态:
- R:运行中(Running)
- S:可中断睡眠(Sleeping)
- D:不可中断睡眠(Disk Sleep)
- Z:僵尸进程(Zombie)
- T:暂停(Stopped)
- I:空闲(Idle)

关键分析场景

  1. CPU 瓶颈

    • 高 USRCPU + 高 CPU:应用计算密集(如 python 脚本)。

    • 高 SYSCPU:频繁系统调用(如数据库或网络服务)。

  2. I/O 瓶颈

    • 高 RDELAY/BDELAY:磁盘或网络 I/O 阻塞(检查 DSKNET 视图)。

  3. 内存泄漏

    • 持续增长的 VGROW/RGROW:可能内存泄漏(如 Java 应用未释放堆内存)。

  4. 僵尸进程

    ST=Z:僵尸进程需清理(通过 kill -9 PID 父进程)。


过滤操作

• 排序进程:

 atop -P CPU # 按 CPU 排序 atop -P MEM # 按内存排序

• 查看线程:按 t 键切换线程视图。

• 过滤用户进程:

 atop -u root # 仅显示 root 用户的进程

通过结合 atop 的详细日志和工具链,可以高效诊断系统性能问题或进行事后分析。

发表评论
博客分类