使用atop监控系统资源和排查性能问题
- 2025-04-29 23:27:00
- 丁国栋
- 原创 56
服务崩溃和服务器宕机是开发运维人员最头疼的问题之一,特别是在日志没有成功写入磁盘(我遇到过多次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/atopLOGINTERVAL 是收集日志的间隔,单位:秒
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. 典型应用场景
-
故障排查
• 检查磁盘 I/O 瓶颈(如
DSK
视图中的busy%
)。• 通过日志回放定位 CPU 峰值或内存泄漏的进程。
-
性能分析
• 长期统计资源使用趋势(如每日 CPU 平均负载)。
• 对比不同时间段的系统表现。
-
安全审计
• 分析异常进程的活动(如未授权的
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) |
关键分析场景
-
CPU 瓶颈
• 高USRCPU
+ 高CPU
:应用计算密集(如python
脚本)。• 高
SYSCPU
:频繁系统调用(如数据库或网络服务)。 -
I/O 瓶颈
• 高RDELAY
/BDELAY
:磁盘或网络 I/O 阻塞(检查DSK
和NET
视图)。 -
内存泄漏
• 持续增长的VGROW
/RGROW
:可能内存泄漏(如 Java 应用未释放堆内存)。 -
僵尸进程
•ST=Z
:僵尸进程需清理(通过kill -9 PID
父进程)。
过滤操作
• 排序进程:
atop -P CPU # 按 CPU 排序 atop -P MEM # 按内存排序
• 查看线程:按 t
键切换线程视图。
• 过滤用户进程:
atop -u root # 仅显示 root 用户的进程
通过结合 atop
的详细日志和工具链,可以高效诊断系统性能问题或进行事后分析。