Linux系统的资源使用情况,你可以通过使用命令如free
、top
和netstat
来实时监控内存、CPU及端口的使用状态。对于需要追踪历史资源消耗动态的场景,atop
命令则能有效帮助用户查看过去的系统负载情况。
本篇教程的灵感源自一位小伙伴的真实经历:她曾遇到服务器不定期卡顿的问题,没想到腾讯云的客服指导她使用 atop
进行故障排查,结果发现是 dnf-makecache
周期性执行导致的系统卡顿。腾讯云客服的专业性让人印象深刻。鉴于此,本次使用腾讯云的轻量应用服务器详解 atop
的使用,更好地监控服务器性能。
什么是 atop
atop
是一个用于Linux和Unix类操作系统的时间间隔内系统活动分析工具。看它的名字,很容易联想到 Linux 自带的 top
,其实确实挺像的,不过与 top
更像的,应该是 btop
和 htop
。atop
主要是允许用户从命令行界面上查看系统过去的CPU使用率、磁盘I/O、内存与交换分区使用情况。甚至可以记录进程统计以及网络接口活动在内的多种信息。
atop
的 GitHub 项目地址: https://github.com/Atoptool/atop/
对比 top
我们先来看看 top
命令:
# Linux 上 使用 top -h 输出
top -h
procps-ng 3.3.17
Usage:
top -hv | -bcEeHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]
比如: 我们想看 mintimate
用户的进程占用,就可以使用:
top -u mintimate
发现 chromium
的进程比较多,这个时候,还可以用 ps
命令查看端口号:
# ps 命令查看
ps aux | grep 'chromium'
# 再秀一下(o′ω`o)ノ,ps 过滤 chromium 并 kill
ps aux | grep 'chromium' | grep -v grep | awk '{ print $2 }' | xargs kill
你可以看到,top
命令是一个实时展示 Linux 系统中进程活动及其资源占用情况的动态监视工具,无法查看历史数据。
至于 atop
的主要特点包括:
- 自动周期性记录:它可以定期捕获系统活动快照,这些快照可以存储在日志文件中以供日后分析。
- 历史数据回放:用户能够以类似于“即时”视图的方式浏览过去的数据,其实就是回看历史快照。
- 丰富的信息展示:提供丰富的系统性能指标,涵盖系统层面的各种活动。
- 灵活的查询选项:支持对特定时间段内的数据进行筛选和查询。
因此,那些需要深入了解其系统过去一段时间内行为的系统管理员来说,atop
是一个非常有价值的工具。
你可以理解为,是加强且命令行版本的腾讯云控制台监控曲线:
区别在于,腾讯云轻量应用服务器控制台的曲线是宏观的,但是 atop
的信息更加细致,可以到进程级别。
选择 atop?
主要的原因,还是 atop
的历史数据回放功能。虽然我们自己也可以用 crontab 来定时记录系统活动快照,但是,atop
的 systemctl
服务,可以自动记录系统活动快照,而且,atop
还可以自动删除过期的系统活动快照,非常方便。与其自己造造轮子,不如直接使用 atop
的 systemctl
服务。
其次,还有一个很有趣的事情: 就是粉丝用户的反馈,她说她在用腾讯云的轻量应用服务器,总是不知道为什么,服务器卡顿,腾讯云的客服教她使用 atop 排障,最后发现是服务器内 dnf-makecache 周期性执行,导致系统卡顿,感觉腾讯云的客服很专业,很细心;同时,她想更了解这个工具。
我是很惊讶的,没想到腾讯云的客服这么专业; 而且这个问题本身,我认为是超出腾讯云服务范围的,本来就是用户自己的事情,但是腾讯云的售后客服还是给出专业的解决方案,让人感觉挺有温度的,也有点小惊喜(o′ω`o)ノ;
我甚至发现腾讯云的官方文档,也有提到 atop
的使用方法: https://cloud.tencent.com/document/product/213/61086。既然官方都这么推荐,我也就详细介绍一下 atop
的使用方法。
操作前提
其实,作为一个命令行工具,atop
本身没什么要求: atop
的第一个发行版本 1.20 版本,对内核的最低要求是 2.6.2。只要你用的是目前主流 Linux,都可以运行 atop
,可能版本有所差异,但是不会影响使用。
当然,我推荐使用腾讯云的轻量应用服务器,目前腾讯云的轻量应用服务器 Linux 系统的内核版本都是足够新的,用来实操本教程都是没有问题的:
目前正好腾讯云的轻量应用服务器的有活动,可以进去探索一下:
比如:我就趁机买了这台轻量应用服务器,体验一下 atop
的使用方法:
建议新建一台服务器后,登录服务器后,第一时间更新一次软件包管理器。这倒不是腾讯云的轻量应用服务器有问题,而是更新软件包管理器,可以保证软件包是最新的,避免一些潜在的 bug:
# Debian/Ubuntu 系统
apt update && apt upgrade -y
# CentOS/RedHat/OpenCloudOS 系统
yum update && yum upgrade -y
atop 基础使用
其实,atop
大体可以分为两个模式:
- 实时检测模式: 直接使用
atop
进入atop
的交互界面,查看实时的数据,并且可以使用命令进行交互。 - 历史数据模式: 通过预先设定的监控定时器配置,查看历史数据快照。
历史数据模式其实就是历史的实时检测模式快照,所以我们使用 atop
命令,只需要知道 atop
交互模式如何使用,以及配置历史数据模式即可。
交互模式
我们直接使用 atop
进入类似于 top
的交互模式,查看实时数据:
# 进入 atop 交互模式
atop
上方是 CPU、内存、磁盘、网络、GPU 的利用率以及使用量。下方是进程列表,以及进程的详细信息。介绍一下常用的字段含义:
- PID: 进程 ID(Process ID),唯一标识一个进程的编号。
- CID/POD: 容器 ID 或 Pod 名称,表示进程所属的容器或 Pod。
- SYSCPU: 系统 CPU 时间,进程在内核态运行所消耗的 CPU 时间。
- USRCPU: 用户 CPU 时间,进程在用户态运行所消耗的 CPU 时间。
- RDELAY: 资源延迟时间,进程等待资源(如 CPU、内存、I/O 等)所消耗的时间。
- BDELAY: 块设备延迟时间,进程等待块设备(如磁盘 I/O)所消耗的时间。
- VGROW: 虚拟内存增长量,进程的虚拟内存使用量的变化。
- RGROW: 常驻内存增长量,进程的常驻内存(物理内存)使用量的变化。
- RDDSK: 读取磁盘的数据量,进程从磁盘读取的数据量。
- WRDSK: 写入磁盘的数据量,进程向磁盘写入的数据量。
- RNET: 接收网络数据量,进程从网络接收的数据量。
- SNET: 发送网络数据量,进程向网络发送的数据量。
- RUID: 实际用户 ID(Real User ID),启动进程的用户的 ID。
- EUID: 有效用户 ID(Effective User ID),进程当前运行时的用户 ID。
- ST: 进程状态(State),表示进程的当前状态(如运行、睡眠、僵尸等)。
- EXC: 进程的退出代码(Exit Code),进程终止时的退出状态码。
- THR: 线程数(Threads),进程中当前运行的线程数量。
- S: 进程的调度优先级(Scheduling priority),进程的调度优先级。
- CPUNR: CPU 编号(CPU Number),进程当前运行的 CPU 编号。
- MEM: 内存使用量,进程当前使用的内存量。
- CMD: 命令行,启动进程的命令行。
这些字段提供了关于系统中各个进程的详细信息,帮助用户监控和分析系统性能。
这个时候,你按下 q
即可退出,或者按住 Ctrl + C
退出。如果你保持这个界面,并不退出,可以按 h
或者 ?
查看帮助信息:
给大家翻译一下:
显示模式:
'B' - 显示系统利用率的条形图(切换)
文本模式下关于 cgroups v2 的信息:
'G' - cgroups v2 指标
2-7 - cgroups 树级别选择(默认 7)
8 - 显示与相关进程的 cgroups,除了内核进程
9 - 显示与相关进程的 cgroups
'a' - 显示所有 cgroups/进程,而不仅仅是活跃的(切换)
'C' - 按 CPU 活动排序
'M' - 按内存利用率排序
'D' - 按磁盘传输速率排序
文本模式下关于进程的信息:
'g' - 通用信息(默认)
'm' - 内存详情
'd' - 磁盘详情
'n' - 网络详情
's' - 调度和线程组信息
'e' - GPU 详情
'v' - 各种信息(父进程 ID、用户/组、日期/时间、状态、退出码)
'c' - 每个进程的完整命令行
'o' - 使用自定义的输出行定义
按以下顺序排序进程列表:
'C' - CPU 活动
'M' - 内存消耗
'D' - 磁盘活动
'N' - 网络活动
'E' - GPU 活动
'A' - 最活跃的系统资源(自动模式)
累积的进程数据:
'u' - 每个用户的总资源消耗
'p' - 每个程序的总资源消耗(即相同进程名)
'j' - 每个容器/Pod 的总资源消耗
'U' - 聚焦于特定用户名(正则表达式)
'P' - 聚焦于特定程序名(正则表达式)
'J' - 聚焦于特定容器/Pod 名
'/' - 聚焦于特定命令行字符串(正则表达式)
'I' - 聚焦于特定进程 ID (PID)
'Q' - 聚焦于特定进程/线程状态
系统资源选择(在标题行中显示的按键):
'S' - 聚焦于特定系统资源(正则表达式)
屏幕处理:
^L - 重绘屏幕
PgDn - 显示进程列表的下一页(或 ^F)
PgUp - 显示进程列表的上一页(或 ^B)
ArDn - 向下箭头,显示进程列表的下一行
ArUp - 向上箭头,显示进程列表的上一行
ArRt - 向右箭头,显示完整命令行的下一个字符
ArLt - 向左箭头,显示完整命令行的上一个字符
展示(在标题行中显示的按键):
'a' - 显示所有进程/线程(而不是活跃的)(切换)
'y' - 显示进程内的线程(线程视图)(切换)
'Y' - 排序线程(与线程视图结合使用时)(切换)
'f' - 显示固定数量的标题行(切换)
'F' - 禁止排序系统资源(切换)
'X' - 在输出中禁止显示已终止的进程(切换)
'x' - 不使用颜色来表示高占用(切换)
'1' - 显示每秒平均值而不是总值(切换)
'R' - 计算比例集大小 (PSIZE)(切换)
'W' - 确定每个线程的 WCHAN(切换)
其他命令:
'i' - 更改间隔计时器(0 = 仅手动触发)
't' - 手动触发以强制下一个采样
'r' - 将计数器重置为启动时的值
'z' - 暂停按钮以冻结当前采样(切换)
'l' - 限制每个 CPU、磁盘和接口资源的行数
'k' - 终止一个进程(即发送信号)
'V' - 版本信息
'?' - 帮助信息
'h' - 帮助信息
'q' - 退出此程序
可以看到,命令还是很强大的。通常使用,我们只需要进入交互模式,之后排序一下进程列表,然后查看进程的详细信息即可。
比如: 如果你想看那个进程占用了最多的 CPU,那么我们只需要进入交互模式,然后按 C
(按 CPU 消耗资源排序) 排序,然后按 g
(显示通用信息) 查看进程信息,这个时候,你可以按 z
冻结刷新,观察好后按 q
退出即可。
在进入交互模式的时候,你可以直接追加参数,就不用进入交互模式后,再按相关指令排序进程列表或者切换展示视图了:
# 进入交互模式并按使用 CPU 占用率排序
atop -C
# 进入交互模式并按使用内存的占用率排序
atop -M
接下来,我们看几个具体使用的场景。
kill 进程
我们使用 atop
的时候,如果想杀掉某个进程,那么使用 atop
也是可以操作的。先使用 z
冻结刷新,之后你可以选择资源排序(比如: 按 C
就是使用 CPU 占用率排序[默认],按 M
就是使用内存的占用率排序):
我们只需要按 k
(终止一个进程) ,进入选择进程的输入界面:
比如,我们这里 kill 掉 chromium 进程,输入进程的 PID: 619981
之后,询问发送的信号:
Signal [15]
默认情况,我们直接填 15
就可以了,也就是我们 kill 「pid」
的默认信号。如果无法 kill
可以考虑使用 root
权限运行 atop
,或者使用 9
:
- SIGKILL (9):强制终止信号。不能被捕获或忽略,进程必须立即终止。
- SIGTERM (15):终止信号。通常用于请求进程正常终止。
就可以杀掉这个进程了。
查看网络流量
首先,网络模块 netatop
并不是 atop
自带的模块。是需要手动安装的,和 atop
不同的是,它使用 动态内核模块支持(DKMS) 来装载到 atop
。安装方法,可以看下一个章节的 网络扩展插件 。
在安装好后,我们只需要进入交互模式,然后按 n
(网络流量) 排序,就可以看到网络流量了。
不过可能会出现错误 Module 'netatop' or 'netatop-bpf' not active or no root privs; request ignored!
:
这个时候,有两种可能:
- 权限不足:
atop
没有权限查看网络流量,这个时候,我们只需要使用 root 权限运行 atop 即可。 netatop
进程没有启动:atop
会自动关联netatop
进程,如果netatop
进程没有启动,那么就会报错。可以使用systemctl status netatop
查看netatop
进程是否启动,如果没启动,那么可以使用 systemctl start netatop 启动 netatop 进程。
安装 atop
安装好后的 atop
主要包括两个部分:
atop
命令: 用于实时查看系统负载状态。atop
的systemnctl
服务: 用于定期记录系统活动快照。如果要查看历史数据,atop
的systemctl
服务是必不可少的。
至于安装 atop
, 方法很多,主要有:
- 软件包管理器安装:
atop
已经在各个软件包管理器内发布,不过版本可能不是最新的。 - 源码编译安装: 下载
atop
的源码,可以直接安装最新或者指定版本的atop
。
安装 atop
命令,都会自动配置 atop
的 systemctl
;接下来我们都简单介绍一下上述两种安装方法。
软件包管理器
atop
工具,已经在各个软件包管理器内发布,你只需要使用系统自带的软件包管理器进行安装即可:
# Debian/Ubuntu
apt install atop
# CentOS/RedHat/OpenCloudOS
yum install atop
源码编译
如果你想用高版本的 atop
,那么就需要手动编译,可以在 atop 官方下载界面 找到下载地址,之后下载到本地编译安装,比如我这里使用腾讯云轻量应用服务器操作:
# 下载源代码
wget https://www.atoptool.nl/download/atop-2.11.0.tar.gz
# 解压并进入
tar -xf atop-2.11.0.tar.gz
cd atop-2.11.0
之后,进行编译:
# 编译
make
# 安装
make install
# 查看版本信息
atop -V
网络扩展插件
默认情况下,atop
没有自带网络监控模块(即可: netaop),需要我们自己安装。同样,首先前往官网,下载最新的 netatop
源码:
# 这里下载 3.2.2 版本的
wget https://www.atoptool.nl/download/netatop-3.2.2.tar.gz
# 解压并进入
tar -xf netatop-3.2.2.tar.gz
cd netatop-3.2.2
之后进行安装:
# 编译
make
# 安装
make install
如果编译过程出现内核头文件找不到,类似于:
./mkversion
make -C /lib/modules/5.10.0-32-amd64/build M=/usr/local/src/netatop-3.2.2 modules
make[1]: *** /lib/modules/5.10.0-32-amd64/build: No such file or directory. Stop.
make: *** [Makefile:13: netatop.ko] Error 2
这个时候,我们可以使用uname -r
查看 Linux 内核版本,并使用软件包管理器安装内核头部文件:
# Debian/Ubuntu
apt install linux-headers-$(uname -r)
# CentOS/RedHat/OpenCloudOS
yum install kernel-devel-$(uname -r)
如果出现
cd /usr/src; dkms add -m netatop -v 3.2.2
Error! Could not find module source directory.
Directory: /usr/src/netatop-3.2.2 does not exist.
make: *** [Makefile:23: install] Error 2
那么是 netatop
的源码需要放在 /usr/src
下的原因。比如:
这个时候 netatop
就已经安装好了:
# 使用 systemctl 查看 netatop 的运行状态
systemctl status netatop
历史监控日志
上文说到,atop
部署和安装后,会自动配置一个由 systemctl
所管理的守护进程,这个守护进程会自动运行 atop
。如果想卸载这个守护进程,可以使用 systemctl stop atop
停止 atop
守护进程,然后使用 systemctl disable atop
禁用 atop
守护进程。
查看这个守护进程的状态,可以使用 systemctl status atop
命令:
根据上面的输出,我们可以看到,atop
守护进程的配置文件是 /lib/systemd/system/atop.service
,我们可以通过 /lib/systemd/system/atop.service
查看这个配置文件的内容:
[Unit]
Description=Atop advanced performance monitor
Documentation=man:atop(1)
[Service]
Type=simple
Environment="LOGOPTS="
Environment="LOGINTERVAL=600"
Environment="LOGGENERATIONS=28"
Environment="LOGPATH=/var/log/atop"
EnvironmentFile=/etc/default/atop
ExecStartPre=/bin/sh -c 'test -d "${LOGPATH}" || mkdir -p "${LOGPATH}"'
ExecStartPre=/bin/sh -c 'test -n "$LOGINTERVAL" -a "$LOGINTERVAL" -eq "$LOGINTERVAL"'
ExecStartPre=/bin/sh -c 'test -n "$LOGGENERATIONS" -a "$LOGGENERATIONS" -eq "$LOGGENERATIONS"'
ExecStart=/bin/sh -c 'exec /usr/bin/atop ${LOGOPTS} -w "${LOGPATH}/atop_$(date +%%Y%%m%%d)" ${LOGINTERVAL}'
ExecStartPost=/usr/bin/find "${LOGPATH}" -name "atop_*" -mtime +${LOGGENERATIONS} -exec rm -v {} \;
KillSignal=SIGUSR2
[Install]
WantedBy=multi-user.target
解释一下各个参数:
- LOGOPT: 控制日志文件记录,允许您自定义日志文件的保存路径、命名规则、滚动周期以及其他与日志记录相关的选项。为
""
表示不使用任何额外选项; - LOGINT: 监控周期,单位是秒;
- LOGGEN: 日志保留时间,单位是天;
- LOGPATH: 指定atop日志文件的路径。
当然,你也不用修改这个配置文件,只需要修改 /etc/default/atop
文件即可覆写 /lib/systemd/system/atop.service
内的相关配置。
覆写配置文件
使用 vim
覆写或新建 /etc/default/atop
文件,比如,我们想修改 atop
的日志间隔时间,那么只需要修改 LOGINTERVAL
即可,比如:
LOGOPTS=""
LOGINTERVAL=30
LOGGENERATIONS=7
LOGPATH=/var/log/atop
上述的配置,表示 atop
的日志间隔时间是 30 秒,日志保留时间是 7 天,日志文件保存在 /var/log/atop
目录下。
之后,我们只需要重启 atop
守护进程即可生效:
systemctl restart atop
那么,atop
守护进程产生的日志文件,如何有效地查看某段时间内的系统负载变化呢?
我们只需要用 atop -r 「日志文件」
命令即可,比如:
# 查看 20241029 日志文件
atop -r /var/log/atop/atop_20241029
这个时候,我们按 t
可以查看下一个时间快照节点,按 shift + t
可以查看上一个时间快照节点。如果你想直接查看某个时间节点,那么可以使用 b
,之后出现的提示框:
# 输入时间戳,其中年月日和秒是可选的
Enter new time (format [YYYYMMDD]hhmm[ss]):
是不是很方便呢?还有更方便的,你可以直接用组合键:
# 查看 20241029 日志文件,时间戳为 23 点
atop -r /var/log/atop/atop_20241029 -b 2300
atop 卸载
其实,我个人认为 atop
是没有必要卸载的,因为 atop
的功能非常强大,而且 atop
的守护进程对系统资源的消耗不大(可能只有 10M 左右的内存占用);
如果关闭 atop
和 netatop
的守护进程 ,那么 atop
甚至没有资源的占用(top
命令的 plus 版本🤔)。
如果还是想卸载 atop
~~
软件包管理器安装的 atop
,那么卸载 atop
就非常简单了,只需要使用 apt
或 yum
卸载即可:
# Debian/Ubuntu
apt purge atop
# CentOS/RHEL
yum remove atop
反编译 atop
如果你是手动编译安装的 atop
,那么卸载 atop
就需要手动删除(其实就是把 make install
自动执行的反过来(因为源码包内没有提供 uninstall
的脚本,只能手动反操作了):
# 停止并禁用 atop 服务
systemctl stop atop
systemctl disable atop
# 停止并禁用 atopacct 服务
systemctl stop atopacct
systemctl disable atopacct
# 删除 systemd 服务文件
rm /lib/systemd/system/atop.service
rm /lib/systemd/system/atopgpu.service
rm /lib/systemd/system/atop-rotate.service
rm /lib/systemd/system/atop-rotate.timer
rm /lib/systemd/system/atopacct.service
# 删除 systemd 系统服务的软链接
rm /etc/systemd/system/multi-user.target.wants/atopacct.service
rm /etc/systemd/system/multi-user.target.wants/atop.service
rm /etc/systemd/system/timers.target.wants/atop-rotate.timer
# 删除二进制文件和配置文件
rm /usr/bin/atop
rm /usr/bin/atopsar
rm /usr/sbin/atopacctd
rm /usr/sbin/atopgpud
rm /usr/bin/atopconvert
rm /usr/bin/atopcat
rm /usr/bin/atophide
rm /etc/default/atop
# 删除 man 页面
rm /usr/share/man/man1/atop.1
rm /usr/share/man/man1/atopsar.1
rm /usr/share/man/man1/atopconvert.1
rm /usr/share/man/man1/atopcat.1
rm /usr/share/man/man1/atophide.1
rm /usr/share/man/man5/atoprc.5
rm /usr/share/man/man8/atopacctd.8
rm /usr/share/man/man8/atopgpud.8
# 删除 atop 日志目录
rm -rf /var/log/atop
卸载 netatop
既然 atop
已经卸载,那么也没必要保留 netatop
了,同样根据编译步骤,逆向操作即可:
# 停止并禁用 netatop 服务
systemctl stop netatop
systemctl disable netatop
# dkms 移除 netatop 模块
dkms remove -m netatop -v 3.2.2 --all
END
哈哈,我们了解了 atop
的优势,特别是其自动周期性记录和历史数据回放功能。本次的 atop
分享就到这里啦~~ 感谢阅读。也给腾讯云的服务团队点个赞,非常专业和耐心,帮用户解决实际的问题。
其实和 atop
类似的工具还有很多(比如: htop
、glances
、nmon
等),主要还是看个人的使用习惯。就好比,查看端口的占用情况,你可以使用 netstat
、ss
、lsof
等命令,也可以使用 nmap
、ncat
等工具;
如果你有更好的工具推荐,欢迎在评论区留言;有机会,我也给大家出一些其他工具的使用教程。
最后,如果你对云服务器、CDN、云数据库和Linux等云计算感兴趣,亦或者喜欢编程、设计、产品、运营等领域,欢迎加入我们的开发者爱好群,一起交流学习: 812198734 (目前可能就我一个人?毕竟才刚刚创建 ~)。