文章摘要:本文详细介绍了使用atop工具监控Linux系统的方法,涵盖安装配置、实时/历史指标查看、日志分析及生产环境优化。主要内容包括: 安装与配置:支持多种Linux发行版,提供yum/dnf/apt安装命令,并指导设置开机自启和日志参数调整(采样频率、保留天数)。 功能使用: 实时监控:通过交互式界面查看CPU、内存、磁盘等资源占用,支持排序(如按内存/CPU排序)和进程级详情分析。 历史日志:解析二进制日志文件(/var/log/atop/),支持时间跳转和指定时间段查询。 高级应用: 通过atop
真实案例:突然接到消息服务器崩溃了,这时候又进不了linux,只能强制重启,但是没有捕捉的服务器崩溃,经过阿里云提交工单,给了我实质性建议安装atop,说下次遇到问题就可以导出日志分析原因了,下面是安装和体验过程记录,希望对大家有帮助!
一、使用atop工具监控Linux系统指标
更新时间:2026-08-04 22:57:13
atop允许用户通过交互界面即时洞察系统状态,还能作为后台服务运行,以指定频率记录系统与进程的活动快照,并将其保存为二进制日志,帮助用户精确回溯并诊断系统问题。
1.安装atop
- 使用Workbench登录Linux实例。
- 安装atop。
【服务器类型1】Alibaba Cloud Linux 4/3/2、CentOS 7/8 Fedora
bash
# 更新软件包
sudo yum update -y
# 安装 atop
sudo yum install atop -y
【服务器类型2】Ubuntu / Debian
bash
# 更新软件包
sudo apt update -y
# 安装 atop
sudo apt install atop -y
【服务器类型3】CentOS Stream 9、Rocky Linux 9
bash
# 更新软件包
sudo dnf update -y
# 安装 EPEL 源
sudo dnf install epel-release -y
# 安装 atop
sudo dnf install atop -y
【服务器类型4】openSUSE
bash
# 更新软件包
sudo zypper update -y
# 安装 atop
sudo zypper install atop atop-daemon -y
- 启动 atop 服务。
bash
sudo systemctl start atop
- 验证atop是否启动成功。
bash
sudo systemctl status atop
执行sudo systemctl status atop查看服务状态,若回执信息包含active(running),表示启动成功。

5.设置开机自动启动
bash
sudo systemctl enable atop
2.使用atop查看实时指标
2.1 查看前10占用进程【very good】
bash
# 查看内存占用前十的进程
ps aux --sort=-%mem | head -10
# 或使用 atop 的内存排序模式(按 m 键)

使用 atop 的内存排序模式(按 m 键),如下图所示:

2.2 执行atop实时采集【ok】
-
执行
atop [采样间隔秒数] [采样次数]命令进入交互模式。以默认配置查看(10秒刷新一次)。
atop
每5秒查看一次系统指标。
atop 5
以10秒为间隔,采集30次系统指标。
atop 10 30
以30秒为间隔,采集10次,并结果写入文件。
atop 30 10 > /tmp/atop.mem
-
系统资源概览:汇总了CPU、内存、交换空间、磁盘I/O和网络的整体使用情况。
ATOP - 2025/09/17 15:04:49 ---------------- 10s elapsed
PRC | sys 0.07s | user 0.07s | | #proc 102 | #trun 1 | #tslpi 202 | | #tslpu 40 | #zombie 0 | clones 4 | | #exit 0
CPU | sys 1% | user 1% | | irq 1% | | idle 198% | wait 0% | steal 0% | | guest 0% | | curf 2.50GHz
cpu | sys 0% | user 0% | | irq 0% | | idle 99% | cpu000 w 0% | steal 0% | | guest 0% | | curf 2.50GHz
cpu | sys 0% | user 1% | | irq 0% | | idle 99% | cpu001 w 0% | steal 0% | | guest 0% | | curf 2.50GHz
CPL | avg1 0.01 | | avg5 0.03 | avg15 0.04 | | | csw 43494 | | intr 22870 | | | numcpu 2 |
MEM | tot 1.9G | free 240.7M | | cache 1.1G | dirty 0.3M | buff 51.8M | slab 104.4M | slrec 69.4M | shmem 2.0M | shrss 0.0M | shswp 0.0M | | numnode 1
| vmcom 728.4M | | vmlim 952.1M |
SWP | tot 0.0M | | free 0.0M | swcac 0.0M | | | | | | | | |
DSK | vda | busy 0% | | read 0 | write 4 | | discrd 0 | KiB/r | KiB/w 19 | KiB/d 0 | MBr/s 0 | MBw/s | | avq 0.50 avio 0.50 ms
NET | transport | tcpi 89 | tcpo 131 | udpi 13 | | udpo 13 | tcpao 9 | tcppo 0 | tcprs 0 | tcpie 0 | tcpor 0 | | udpnp 0 | udpie 0
NET | network | ipi 102 | | ipo 108 | ipfrw 0 | | deliv 102 | | coll 0 | mlti 0 | erri 0 | | icmpi 0 | icmpo 0
NET | eth0 ---- | pcki 108 | pcko 110 | | sp 0 Mbps | si 17 Kbps | so 66 Kbps | | | | erri 0 | erro 0 | drpi 0 | drpo 0 -
进程级详情:展示了各个进程的资源消耗详情。
PID TID TCPRCV TCPRASZ TCPSND TCPSASZ UDPRCV UDPRASZ UDPSND UDPSASZ BANDWI BANDWO NET CMD 1/
6605 - 38 193 33 1569 4 205 4 126 6 Kbps 41 Kbps 57%
6660 - 25 183 33 676 5 204 5 106 4 Kbps 18 Kbps 27%
7429 - 12 507 17 125 4 142 4 101 5 Kbps 2 Kbps 9%
1588 - 10 70 10 396 0 0 0 0 0 Kbps 3 Kbps 4%
1179 - 4 58 2 1792 0 0 0 0 0 Kbps 2 Kbps 4%
1201 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7486 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
17891 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7539 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
2116 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
641 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7157 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
1108 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
979 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
652 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
11 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
12 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
29 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
31 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
90 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
129 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
130 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
157 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
352 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7107 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7186 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7631 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
17612 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
- 在交互模式下,可使用单个字母键切换视图或者排序。
|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|
| 按键 | 功能 | 用途 |
| c | 显示完整命令行 | 查看进程启动的具体参数。 |
| g | 通用视图(默认) | 综合查看 CPU、内存增长、磁盘 I/O。 |
| m/M | 内存视图/按内存排序 | 用于分析内存使用、页错误,排查内存泄漏。 |
| d/D | 磁盘视图/按磁盘排序 | 用于分析磁盘 I/O,定位磁盘读写高的进程。 |
| n/N | 网络视图/按网络排序(需安装并加载netatop内核模块) | 用于分析网络流量,定位网络流量大的进程。 |
| a | 聚合视图 | 将一个程序的所有线程/进程资源消耗聚合在一起。 |
| C | 按 CPU 排序 | 快速定位消耗 CPU 最多的进程。 |
| h | 显示帮助 | 查看更多快捷键。 |
| q | 退出 | 退出交互模式。 |
3.使用atop查看历史指标
atop服务成功运行后,会定期在/var/log/atop/目录下生成以atop_YYYYMMDD格式命名的二进制日志文件。
atop的日志是二进制文件,使用cat、less或vim等文本编辑器打开会显示乱码。
3.1 读取历史日志
- 读取历史日志文件。
使用atop -r <日志文件>命令加载指定的日志文件。
# 查看当天的日志,atop会自动查找当天的日志文件
atop -r
# 查看指定日期的日志
atop -r /var/log/atop/atop_YYYYMMDD
- 在日志中跳转到指定时间点。
加载日志后,界面显示的是该日志文件的第一个时间点快照。
- 按 t 键:向后跳转到下一个时间点的快照。
- 按 T 键(大写):向前跳转到上一个时间点的快照。
- 按 b 键:输入具体时间(格式 HH:MM),直接跳转到该时间点。
- 直接通过命令行指定时间段查看历史日志。
若需查看特定时间段内的系统资源占用情况(例如排查固定时间点的异常),可在加载日志时通过 -b 和 -e 参数直接指定起止时间,无需在交互界面中逐步翻页。
atop -r /var/log/atop/atop_YYYYMMDD -b HH:MM -e HH:MM
参数说明:
|----------------------------------|----------------------------------------------|
| 参数 | 说明 |
| -r /var/log/atop/atop_YYYYMMDD | 指定要读取的历史日志文件,YYYYMMDD 为目标日期,例如 20250815。 |
| -b HH:MM | 指定查看的开始时间(Begin time),格式为 24 小时制,例如 09:00。 |
| -e HH:MM | 指定查看的结束时间(End time),格式为 24 小时制,例如 09:30。 |
示例:查看 2026 年 8 月 05 日 10:00 至 10:30 的系统资源占用情况:
bash
atop -r /var/log/atop/atop_20260805 -b 10:00 -e 10:30

3.2 优化 atop 日志记录行为
在分析历史日志时,若发现默认的日志记录频率(10分钟一次)对于某些问题来说太过宽泛,或者默认的28天保留时长不能满足监控需求,可通过修改 atop 的配置文件来调整其后台日志的记录频率、保留天数和存储路径。
-
使用
vim或其他文本编辑器打开配置文件。- RHEL 及其衍生版(Alibaba Cloud Linux,CentOS,Fedora,Rocky Linux)。
sudo vim /etc/sysconfig/atop
-
Debian 及其衍生版(Ubuntu, Debian),openSUSE。
sudo vim /etc/default/atop
-
默认配置文件的内容如下:
LOGOPTS=""
LOGINTERVAL=600
LOGGENERATIONS=28
LOGPATH=/var/log/atop
LOGOPTS:额外的日志记录选项。例如,设置-L可在日志轮转时创建一个指向最新日志的符号链接 /var/log/atop/atop_current,方便快速访问。LOGINTERVAL:日志记录的采样间隔,单位是秒。默认值通常是 600(即10分钟),表示每10分钟记录一次系统快照。LOGGENERATIONS:日志文件的生命周期,单位是天。默认值通常是 28,表示 atop 会自动删除28天前的旧日志文件。LOGPATH:日志文件存储路径,默认为/var/log/atop。
如果修改此路径,请确保新目录已存在且 atop 进程有写入权限。
-
配置修改后,需重启atop服务让配置生效。
sudo systemctl restart atop
4.生成指标报告
atopsar是atop工具包中的一个非交互式的命令行工具,用于从atop记录的二进制日志文件中提取数据并生成系统性能报告。
4.1 使用示例
-
查看当前系统在 1 分钟内(12 次,间隔 5 秒)的CPU使用率指标报告。
atopsar -c 5 12
-
查看当天指定时间段的内存指标报告。
查看当天18:00至18:01的内存指标报告
atopsar -m -b 18:00 -e 18:01
-
查看指定日期内,指定时间段的内存指标报告。
查看2025年8月15日 18:00至18:01的内存指标报告。
atopsar -m -r /var/log/atop/atop_20250815 -b 18:00 -e 18:01
4.2 atopsar命令基本语法
atopsar [options] [interval] [count]
- options :用于指定报告类型的标志,例如
-c(CPU),-m(内存),-d(磁盘)。 - interval:指定输出报告的时间间隔,单位为秒。
- count:指定输出报告的次数。
5.指标解读
5.1 系统资源概览
|---|---|---|---|
| | | | |
|------------------------------------------|-----------------------|--------------------------------------|----------------|
| 指标类别 | 指标 | 详细说明 | 单位 |
| ATOP | 主机名, 日期 | 显示当前主机名、采样日期和时间。 | - |
| ATOP | 采样间隔 | 显示两次采样之间的时间间隔。 | 秒 |
| PRC(进程总体情况) | sys | 在采样间隔内,所有进程在内核模式下消耗的CPU总时间。 | 秒 |
| PRC(进程总体情况) | user | 在采样间隔内,所有进程在用户模式下消耗的CPU总时间。 | 秒 |
| PRC(进程总体情况) | #proc | 系统当前的总进程数量。 | 个 |
| PRC(进程总体情况) | #trun | 处于运行中状态的平均线程数。 | 个 |
| PRC(进程总体情况) | #tslpi | 处于可中断睡眠状态的线程数。 | 个 |
| PRC(进程总体情况) | #tslpu | 处于不可中断睡眠状态的线程数。 | 个 |
| PRC(进程总体情况) | #zombie | 僵尸进程的数量。 | 个 |
| PRC(进程总体情况) | clones | 在采样间隔内,通过clone系统调用创建的新进程/线程数。 | 个/秒 |
| PRC(进程总体情况) | #exit | 在采样间隔内,退出的进程数量。 | 个/秒 |
| CPU/cpu(CPU整体/单个CPU核心) | %sys | CPU在内核模式下花费的时间百分比。 | % |
| CPU/cpu(CPU整体/单个CPU核心) | %user | CPU在用户模式下花费的时间百分比。 | % |
| CPU/cpu(CPU整体/单个CPU核心) | %irq | CPU处理硬件中断(irq)和软件中断(softirq)的时间百分比。 | % |
| CPU/cpu(CPU整体/单个CPU核心) | %idle | CPU处于完全空闲状态的时间百分比。 | % |
| CPU/cpu(CPU整体/单个CPU核心) | %wait | CPU因等待磁盘I/O完成而处于空闲状态的时间百分比。 | % |
| CPU/cpu(CPU整体/单个CPU核心) | %steal | 虚拟CPU等待物理CPU时间的百分比(被宿主机或其他虚拟机占用的时间)。 | % |
| CPU/cpu(CPU整体/单个CPU核心) | %guest | 运行虚拟机所花费的CPU时间的百分比。 | % |
| CPU/cpu(CPU整体/单个CPU核心) | %freq | CPU的平均运行频率,相对于其最大频率的百分比。 | % |
| CPL(CPU负载) | avg1/avg5/avg15 | 过去1分钟/5分钟/15分钟的系统平均负载。 | - |
| CPL(CPU负载) | csw | 在采样间隔内,上下文切换的次数。 | 次/秒 |
| CPL(CPU负载) | intr | 在采样间隔内,发生的中断总次数。 | 次/秒 |
| MEM(物理内存) | tot | 系统物理内存总量。 | GiB/MiB |
| MEM(物理内存) | free | 完全未被使用的空闲内存量。 | GiB/MiB |
| MEM(物理内存) | cache | 用作页面缓存的内存量,用于缓存文件数据。 | GiB/MiB |
| MEM(物理内存) | dirty | 在页面缓存中,已被修改但尚未写回磁盘的脏页大小。 | MiB |
| MEM(物理内存) | buff | 用作缓冲区缓存的内存量,用于缓存块设备元数据。 | MiB |
| MEM(物理内存) | slab | 内核用于自身数据结构(slab分配器)的内存量。 | MiB |
| MEM(物理内存) | shmem | 共享内存(包括tmpfs)的大小。 | MiB |
| MEM(物理内存) | vmbal | (仅限32位系统)用于虚拟内存区域的平衡内存量。 | MiB |
| SWP(交换分区) | tot | 交换分区的总大小。 | GiB/MiB |
| SWP(交换分区) | free | 空闲的交换分区大小。 | GiB/MiB |
| SWP(交换分区) | swcac | 已被换出但同时又被缓存的内存大小。 | MiB |
| SWP(交换分区) | vmcom | 已被应用程序申请的虚拟内存总量。 | GiB/MiB |
| SWP(交换分区) | vmlim | 允许申请的虚拟内存上限。 | GiB/MiB |
| PAG(分页活动) | scan | 内核在采样间隔内为回收内存而扫描的页数。 | 页/秒 |
| PAG(分页活动) | steal | 内核在扫描后成功回收的页数。 | 页/秒 |
| PAG(分页活动) | stall | 内核因内存不足而停滞以等待页面回收的次数。 | 次/秒 |
| PAG(分页活动) | swin | 从交换分区换入到物理内存的页面数。 | 页/秒 |
| PAG(分页活动) | swout | 从物理内存换出到交换分区的页面数。 | 页/秒 |
| DSK(磁盘) LVM(逻辑卷) | busy | 磁盘繁忙的时间百分比。达到100%表示磁盘饱和。 | % |
| DSK(磁盘) LVM(逻辑卷) | read/write | 在采样间隔内,完成的读/写请求数量。 | 个/秒 |
| DSK(磁盘) LVM(逻辑卷) | KiB/r/KiB/w | 每个读/写请求的平均数据大小。 | KB |
| DSK(磁盘) LVM(逻辑卷) | Msec/r/Msec/w | 每个读/写请求的平均耗时(包括排队和服务时间)。 | 毫秒 |
| DSK(磁盘) LVM(逻辑卷) | avio | 平均I/O请求的服务时间(不含排队时间)。 | 毫秒 |
| NET(网络) | transport | TCP和UDP层的收发包统计。 | 包/秒 |
| NET(网络) | network | IP层的收发包、转发包统计。 | 包/秒 |
| NET(网络) | *if* | 显示每个网络接口的活动情况。 | - |
| NET(网络) | pcki/pcko | 接口接收/发送的数据包数量。 | 包/秒 |
| NET(网络) | spdi/spdo | 接口接收/发送的速率。 | Mbps |
| NET(网络) | erri/erro | 接口接收/发送时发生的错误数。 | 个/秒 |
| NET(网络) | drpi/drpo | 接口接收/发送时丢弃的数据包数。 | 个/秒 |
5.2 进程级详情
|---|---|---|---|
| | | | |
|----------------------|-------------------|---------------------------------------------|----------------|
| 视图 | 指标 | 详细说明 | 单位 |
| 通用视图(默认) | PID | 进程ID。系统的唯一进程标识符。 | - |
| 通用视图(默认) | S | 进程状态。R-运行中, S-可中断睡眠, D-不可中断睡眠, Z-僵尸, E-已退出。 | - |
| 通用视图(默认) | CPU% | CPU使用率。 | % |
| 通用视图(默认) | MEM% | 内存使用率。 | % |
| 通用视图(默认) | THR | 线程数。 | 个 |
| 通用视图(默认) | PAG | 主要缺页错误。表示进程需要从磁盘读取数据到内存的次数,是衡量磁盘I/O压力的一个指标。 | 次/秒 |
| 通用视图(默认) | CMD | 命令名。进程的可执行文件名。按 c 键后会显示完整命令行。 | - |
| 内存视图 | VSIZE | 虚拟内存大小。进程向系统申请的虚拟地址空间总大小。 | KiB/MiB/GiB |
| 内存视图 | RSIZE | 常驻内存大小。进程当前实际占用物理内存的大小。 | KiB/MiB/GiB |
| 内存视图 | SHR | 共享内存大小。 | KiB/MiB/GiB |
| 内存视图 | RGROW | 常驻内存增长量。正数表示内存消耗在增加,负数表示在减少。 | KiB |
| 内存视图 | VGROW | 虚拟内存增长量。 | KiB |
| 磁盘视图 | DSK% | 磁盘活动百分比。进程产生的磁盘I/O繁忙时间占总磁盘繁忙时间的百分比。 | % |
| 磁盘视图 | RDDSK/WRDSK | 读取/写入的磁盘数据。 | KiB/MB |
| 磁盘视图 | WCANCL | 取消的写入量。进程写入页面缓存后,在数据被同步到磁盘前又被删除的数据量。 | KiB/MB |
| 网络视图 | NET% | 网络活动百分比。进程产生的网络流量占所有进程总流量的百分比。 | % |
| 网络视图 | TCPSND/TCPRCV | TCP发送/接收量。 | KiB/MB |
| 网络视图 | UDPSND/UDPRCV | UDP发送/接收量。 | KiB/MB |
6.应用于生产环境
- 磁盘空间规划 :
atop日志大小与采集频率、系统进程数和保留天数正相关。通过ls -lh /var/log/atop/命令观察单个日志文件的大小,然后乘以LOGGENERATIONS的值来估算总空间需求。 - 监控间隔 :对于需要更细粒度分析的场景,可将默认配置
LOGINTERVAL调整为30秒。但请注意,缩短间隔会增加磁盘 I/O 和 atop 进程的 CPU 开销,请根据实例负载合理配置。
7.常见问题
7.1 执行 atop -r时提示 stat raw file: No such file or directory******,是什么原因?******
这个错误表示atop找不到指定日期的日志文件。可能的原因有:
- 指定的日期
atop服务并未运行。 - 日志文件因轮转策略已被删除(超过了
LOGGENERATIONS设置的保留数量)。 - 查询的是未来的日期。
请检查/var/log/atop目录下实际存在的日志文件列表。
7.2 如何减少 atop占用的磁盘空间?
可通过修改配置减少磁盘空间占用,修改配置后,需重启atop服务:
- 减少日志保留天数 :在配置文件中调低
LOGGENERATIONS的值,例如从28改为14。 - 降低采集频率 :在配置文件中调高
LOGINTERVAL的值,例如从600改为1200。
7.3 为什么在 atop交互界面按 n键看不到按进程统计的网络流量?
atop默认不包含按进程统计网络流量的功能。要启用此功能,需要额外安装并加载netatop内核模块。
1.安装内核开发包及编译所需软件环境。
sudo yum install -y kernel-devel dkms elfutils-libelf-devel
-
下载netatop源码至指定目录。
cd /usr/src/ && sudo wget https://www.atoptool.nl/download/netatop-3.2.2.tar.gz
-
解压源码并进入源码目录。
sudo tar -zxvf netatop-3.2.2.tar.gz && cd netatop-3.2.2
-
基于源码构建并安装模块和守护程序。
sudo make && sudo make install
-
启动
netatop服务。sudo systemctl start netatop
-
验证
netatop是否安装成功。
执行atop进入交互操作界面,按n键查看,若进程详情列表中包含NET列,表示安装成功。
ATOP - 7 2025/09/17 15:04:49 -------------------- 10s elapsed
PRC | sys 0.07s | user 0.07s | | | #proc 102 | #trun 1 | #tslpi 202 | | #tslpu 40 | #zombie 0 | clones 4 | | #exit 0
CPU | sys 1% | user 1% | | irq 1% | | | idle 198% | wait 0% | steal 0% | | guest 0% | | curf 2.50GHz
cpu | sys 0% | user 0% | | irq 0% | | | idle 99% | cpu000 w | steal 0% | | guest 0% | | curf 2.50GHz
cpu | sys 0% | user 1% | | irq 0% | | | idle 99% | cpu001 w | steal 0% | | guest 0% | | curf 2.50GHz
CPL | avg1 0.01 | | avg5 0.03 | avg15 0.04 | | | csw 43494 | | intr 22870 | | | | numcpu 2
MEM | tot 1.9G | free 240.7M | cache 1.1G | dirty 0.3M | buff 51.8M | slab 104.4M | slrec 69.4M | shmem 2.0M | shrss | shswp 0.0M | | vmcom 728.4M | | vmlim 952.1M
SWP | tot 0.0M | | free 0.0M | swcac 0.0M | | | | | | | | | |
DSK | vda | busy 0% | read 0 | write 4 | | discrd 0 | KiB/r | KiB/w 19 | KiB/d | MBr/s 0 | MBw/s 0 | | avq 0.50 | avio 0.0 ms
NET | transport | tcpi 89 | tcpo 131 | udpi | | udpo 13 | tcpao 9 | tcppo 0 | tcprs | tcpie | | | udpnp |
NET | network | ipi 102 | | ipo 108 | ipfrw 0 | | deliv 102 | | | coll 0 | mlti 0 | erro | icmpo |
NET | eth0 ---- | pcki 108 | pcko 110 | | sp 0 Mbps | si 17 Kbps | so 66 Kbps | | | | | | |
PID TID TCPRCV TCPRASZ TCPSND TCPSASZ UDPRCV UDPRASZ UDPSND UDPSASZ BANDWI BANDWO NET CMD 1/1
6605 - 38 193 33 1569 4 205 4 126 6 Kbps 41 Kbps 57%
6660 - 25 183 33 676 5 204 5 106 4 Kbps 18 Kbps 27%
7429 - 12 507 17 125 4 142 4 101 5 Kbps 2 Kbps 9%
1588 - 10 70 10 396 0 0 0 0 0 Kbps 3 Kbps 4%
1179 - 4 58 2 1792 0 0 0 0 0 Kbps 2 Kbps 4%
1201 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7486 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
17891 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7539 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
2116 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
641 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7157 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
1108 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
979 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
652 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
11 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
12 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
29 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
31 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
90 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
129 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
130 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
157 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
352 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7107 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7186 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7631 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
17612 - 0 0 0 0 0 0 0 0 0 Kbps 0 Kbps 0%
7.4 为什么 ECS 重启后无法查看导致故障的历史进程?
Linux 系统默认不记录进程级的历史资源占用,且重启会释放内存中的进程信息,因此在未安装监控工具的情况下,无法回溯重启前故障现场(包括系统夯死、内存不足、kswapd0 高负载、I/O 打满等问题)。要在下次故障发生时能够通过历史日志定位根因,需提前完成以下配置:
-
参照本文安装 atop 工具,并设置开机自启(
sudo systemctl enable atop),确保服务器重启后 atop 持续记录进程快照。sudo systemctl enable atop
-
配置完成后,下次故障发生时可通过
atop -r /var/log/atop/atop_YYYYMMDD加载历史日志,定位故障根因。atop -r /var/log/atop/atop_20260805
二、deepseek实战分析
124黄埔军校执行 atop监控:
bash
ATOP - iZ7xv67xk******puh7xwbZ 2026/08/05 10:05:54 ----a-1---------- 10s elapsed
PRC | sys 0.33s | | user 0.91s | | | #proc 176 | #trun 1 | | #tslpi 1457 | #tslpu 53 | | #zombie 0 | clones 4/s | | | #exit 0/s | |
CPU | sys 3% | | user 8% | irq 4% | | | | idle 386% | wait 0% | | steal 0% | | guest 0% | | | curf 2.50GHz | |
cpu | sys 1% | | user 2% | irq 1% | | | | idle 96% | cpu000 w 0% | | steal 0% | | guest 0% | | | curf 2.50GHz | |
cpu | sys 1% | | user 2% | irq 1% | | | | idle 96% | cpu002 w 0% | | steal 0% | | guest 0% | | | curf 2.50GHz | |
cpu | sys 1% | | user 2% | irq 1% | | | | idle 96% | cpu001 w 0% | | steal 0% | | guest 0% | | | curf 2.50GHz | |
cpu | sys 1% | | user 1% | irq 1% | | | | idle 97% | cpu003 w 0% | | steal 0% | | guest 0% | | | curf 2.50GHz | |
CPL | avg1 0.06 | | avg5 0.49 | | avg15 0.66 | | | | csw 12990/s | | | intr 7060/s | | | | numcpu 4 | |
MEM | tot 14.9G | free 1.6G | cache 5.0G | dirty 0.0M | | buff 250.7M | slab 392.3M | slrec 322.3M | | shmem 22.4M | shrss 0.0M | shswp 0.0M | | | | | numnode 1 |
SWP | tot 0.0M | | free 0.0M | | swcac 0.0M | | | | | | | | | vmcom 12.9G | | vmlim 7.4G | |
DSK | vda | busy 0% | | read 0/s | write 9/s | | discrd 0/s | KiB/r 16 | | KiB/w 6 | KiB/d 0 | MBr/s 0.0 | | MBw/s 0.1 | avq 3.00 | | avio 0.23 ms |
NET | transport | tcpi 65/s | | tcpo 116/s | udpi 1/s | | udpo 1/s | tcpao 2/s | | tcppo 2/s | tcprs 0/s | tcpie 0/s | | tcpor 0/s | udpnp 0/s | | udpie 0/s |
NET | network | | ipi 67/s | ipo 72/s | | ipfrw 0/s | | deliv 67/s | | | | | | | icmpi 0/s | icmpo 0/s | |
NET | eth0 ---- | | pcki 106/s | pcko 61/s | | | sp 0 Mbps | si 749 Kbps | so 661 Kbps | | coll 0/s | mlti 0/s | erri 0/s | | erro 0/s | drpi 0/s | drpo 0/s |
NET | lo ---- | | pcki 12/s | pcko 12/s | | | sp 0 Mbps | si 9 Kbps | so 9 Kbps | | coll 0/s | mlti 0/s | erri 0/s | | erro 0/s | drpi 0/s | drpo 0/s |
PID CID SYSCPU USRCPU RDELAY VGROW RGROW RDDSK WRDSK RUID EUID ST EXC THR S CPUNR MEM CMD 1/5
6437 host-------- 0.04s 0.09s 0.00s 0B 0B 0B/s 819B/s root root -- - 144 S 0 7% java
3639 host-------- 0.03s 0.17s 0.00s 0B 0B 0B/s 2.0K/s root root -- - 47 S 2 7% java
133927 host-------- 0.01s 0.01s 0.00s 0B 0B 0B/s 0B/s root root -- - 147 S 1 6% java
3797 host-------- 0.03s 0.04s 0.00s 0B 0B 0B/s 410B/s root root -- - 45 S 0 5% java
5639 host-------- 0.01s 0.04s 0.00s 0B 0B 0B/s 3.2K/s root root -- - 286 S 1 5% java
8075 host-------- 0.03s 0.07s 0.00s 0B 0B 0B/s 0B/s root root -- - 111 S 3 5% java
7490 host-------- 0.03s 0.08s 0.00s 0B 0B 0B/s 0B/s root root -- - 104 S 0 4% java
7048 host-------- 0.01s 0.08s 0.00s 0B 0B 0B/s 410B/s root root -- - 85 S 0 3% java
7886 host-------- 0.03s 0.07s 0.00s 0B 0B 0B/s 0B/s root root -- - 103 S 3 3% java
2453 host-------- 0.00s 0.02s 0.00s 0B 0B 0B/s 0B/s mysql mysql -- - 28 S 2 2% mysqld
213745 host-------- 0.05s 0.03s 0.00s 0B 0B 0B/s 0B/s root root -- - 1 R 2 1% atop
483 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 12K/s root root -- - 1 S 3 1% systemd-journa
158132 c08102088d8f 0.01s 0.02s 0.00s 0B 0B 0B/s 2.4K/s systemd- systemd- -- - 33 S 1 1% mongod
157798 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s root root -- - 24 S 0 1% dockerd
158156 18998e4e5946 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s redis redis -- - 11 S 2 1% next-router-wo
3259 host-------- 0.02s 0.10s 0.00s 0B 0B 0B/s 0B/s root root -- - 30 S 1 0% AliYunDunMonit
158545 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s root root -- - 10 S 1 0% containerd
881 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s root root -- - 1 S 2 0% nginx
882 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s root root -- - 1 S 1 0% nginx
879 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s root root -- - 1 S 1 0% nginx
880 host-------- 0.00s 0.01s 0.00s 0B 0B 2.8K/s 819B/s root root -- - 1 S 2 0% nginx
157615 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 410B/s root root -- - 3 S 1 0% rsyslogd
1072 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 410B/s root root -- - 10 S 3 0% runner
157507 host-------- 0.00s 0.02s 0.00s 0B 0B 0B/s 0B/s root root -- - 4 S 3 0% tuned
1973 host-------- 0.01s 0.03s 0.00s 0B 0B 0B/s 0B/s root root -- - 12 S 3 0% AliYunDun
158197 295b628bd664 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s systemd- systemd- -- - 1 S 3 0% postgres
1067 host-------- 0.00s 0.02s 0.00s 0B 44.0K 0B/s 410B/s root root -- - 10 S 0 0% aliyun-service
796 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s promethe promethe -- - 8 S 3 0% node_exporter
157627 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s polkitd polkitd -- - 8 S 1 0% polkitd
786 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s root root -- - 3 S 0 0% NetworkManager
158101 host-------- 0.00s 0.00s 0.00s 0B -32.0K 0B/s 0B/s root root -- - 12 S 3 0% containerd-shi
877 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s root root -- - 1 S 3 0% nginx
158157 host-------- 0.00s 0.00s 0.00s 0B 64.0K 0B/s 0B/s root root -- - 12 S 0 0% containerd-shi
158070 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s root root -- - 11 S 2 0% containerd-shi
1 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s root root -- - 1 S 0 0% systemd
213558 host-------- 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s root root -- - 1 S 0 0% atop
858 host-------- 0.00s 0.01s 0.00s 0B 0B 0B/s 0B/s redis redis -- - 5 S 0 0% redis-server
158350 295b628bd664 0.00s 0.00s 0.00s 0B 0B 0B/s 0B/s systemd- systemd- -- - 1 S 3 0% postgres
很好!ATOP显示当前系统完全正常,CPU整体使用率仅11%(sys 3% + user 8%),idle高达386%(4核总计)。
📊 ATOP关键数据分析
✅ 健康状态确认
|---------------|-------------------------------|------------|
| 指标 | 当前值 | 状态 |
| CPU整体 | sys 3% + user 8% | ✅ 极低 |
| 负载 | 0.06 / 0.49 / 0.66 | ✅ 远低于4核阈值 |
| 内存 | 14.9G总, 1.6G free, 5.0G cache | ✅ 充足 |
| 交换 | 0.0M (未使用) | ✅ 无内存压力 |
| 磁盘 | busy 0%, 读写极低 | ✅ 空闲 |
| 网络 | 749Kbps in / 661Kbps out | ✅ 正常 |
🎯 你的目标进程(PID 8075)
在ATOP输出中:
PID 8075: SYSCPU 0.03s, USRCPU 0.07s, MEM 5%, THR 111
- CPU使用率极低(10秒内合计0.1秒)
- 内存占用5%(约745MB,符合预期)
- 111个线程(稍多但可接受)
🚨 但有个隐藏问题需要注意
观察MEM部分的vmcom 12.9G和vmlim 7.4G:
vmcom 12.9G | vmlim 7.4G
⚠️ 含义
- vmcom = 所有进程已承诺的内存总量(已申请但可能未实际分配): 12.9GB
- vmlim = 系统允许的最大承诺内存(RAM + SWAP * 1.5): 7.4GB
vmcom (12.9G) > vmlim (7.4G),意味着如果所有进程同时申请它们已承诺的全部内存,系统会触发OOM Killer!
🔍 为什么会这样?
因为你的系统没有配置Swap:
SWP | tot 0.0M | free 0.0M
当物理内存耗尽时,没有任何缓冲,直接OOM。
🔧 立即行动建议
添加Swap(缓解OOM风险)
# 创建4GB swap文件
dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 永久生效
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 验证
free -h
找出谁在申请大量内存
bash
# 查看各进程的承诺内存
for pid in $(pgrep java); do
echo -n "PID $pid: "
cat /proc/$pid/status 2>/dev/null | grep VmSize | awk '{print $2/1024 " MB"}'
done
# 或使用smem
smem -rs vss | head -20
重点关注高内存进程
从ATOP看,内存占用最大的几个:
|--------------|------------------------|--------------|-----------------|
| PID | 进程 | MEM% | 推测RSS |
| 6437 | 8083-system | 7% | ~1.04GB |
| 3639 | tomcat-8092 | 7% | ~1.04GB |
| 133927 | (另一个Java) | 6% | ~894MB |
| 3797 | tomcat-8090 | 5% | ~745MB |
| 5639 | Nacos | 5% | ~745MB |
| 8075 | 8087-esupplier | 5% | ~745MB |
所有Java进程RSS总和约5-6GB,加上系统其他进程,物理内存还能撑住,但vmcom超限是隐患。
📋 针对8087-esupplier的优化
当前JVM参数问题
-Xms128m -Xmx512m -XX:MaxMetaspaceSize=256m
但RSS已经745MB,说明:
- 堆内存使用可能已到512MB上限
- Metaspace可能在256MB附近
- 还有堆外内存(DirectBuffer、Native线程等)
优化建议
# 建议调整为
java -Xms512m -Xmx1024m \
-XX:MaxMetaspaceSize=256m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/home/fsxz/tenant/8087-esupplier/logs/heapdump.hprof \
-Xloggc:/home/fsxz/tenant/8087-esupplier/logs/gc.log \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-Dio.netty.leakDetectionLevel=advanced \
-jar bcsc-tenant-esupplier-start-2.4.6.jar
🔍 下次CPU飙升时的现场抓取脚本
#!/bin/bash
# 保存为 /tmp/cpu_emergency.sh
PID=8075
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_DIR=/home/fsxz/tenant/8087-esupplier/logs
echo "=== CPU Emergency Dump $TIMESTAMP ==="
# 1. 系统状态
top -b -n 1 > $LOG_DIR/top_$TIMESTAMP.log
vmstat 1 10 > $LOG_DIR/vmstat_$TIMESTAMP.log
# 2. 进程CPU统计
ps -p $PID -o pid,%cpu,%mem,vsz,rss,etime,cmd > $LOG_DIR/process_$TIMESTAMP.log
# 3. 线程CPU排行
ps -mp $PID -o THREAD,tid,time,%cpu,rss,size > $LOG_DIR/threads_$TIMESTAMP.log
# 4. 线程dump
jstack $PID > $LOG_DIR/jstack_$TIMESTAMP.log
# 5. GC状态
jstat -gcutil $PID 1 5 > $LOG_DIR/gc_$TIMESTAMP.log
# 6. 高CPU线程分析(自动提取TOP3)
echo "=== TOP3 CPU Threads ===" >> $LOG_DIR/cpu_analysis_$TIMESTAMP.log
ps -mp $PID -o THREAD,tid,time,%cpu | sort -rn -k4 | head -4 >> $LOG_DIR/cpu_analysis_$TIMESTAMP.log
echo "紧急dump完成: $LOG_DIR/"
💡 总结
- 当前状态:系统健康,CPU不是问题
- 潜在风险:无Swap + vmcom超限,有OOM风险
- 建议动作 :
- ✅ 立即:添加4GB Swap
- ✅ 近期:调整JVM参数(增加Xmx)
- ✅ 长期:部署监控告警,配置自动dump
本文参考文档:使用atop工具监控Linux系统指标
使用atop工具监控Linux系统指标-云服务器 ECS(ECS)-阿里云帮助中心