Linux 系统的资源使用情况,你可以通过使用命令如free、top和netstat来实时监控内存、CPU 及端口的使用状态。对于需要追踪历史资源消耗动态的场景,atop命令则能有效帮助用户查看过去的系统负载情况。
本篇教程的灵感源自一位小伙伴的真实经历:她曾遇到服务器不定期卡顿的问题,没想到腾讯云的客服指导她使用 atop 进行故障排查,结果发现是 dnf-makecache 周期性执行导致的系统卡顿。腾讯云客服的专业性让人印象深刻。
本来就是用户自己的事情,但是腾讯云的售后客服还是给出专业的解决方案,让人感觉挺有温度的,也有点小惊喜(o′ω`o)ノ;
![]()
鉴于此,本次使用腾讯云的轻量应用服务器详解 atop 的使用,更好地监控服务器性能。
文章教程可能比较长,本文尽可能提炼。完整教程可以访问我的博客:
如果你对云服务器、CDN 、云数据库和 Linux 等云计算感兴趣,亦或者喜欢编程、设计、产品、运营等领域,欢迎加入我们的开发者爱好群,一起交流学习: 812198734 (目前可能就我一个人?毕竟才刚刚创建 ~)。
atop 是一个用于 Linux 和 Unix 类操作系统的时间间隔内系统活动分析工具。看它的名字,很容易联想到 Linux 自带的 top,其实确实挺像的,不过与 top 更像的,应该是 btop 和 htop。atop 主要是允许用户从命令行界面上查看系统过去的 CPU 使用率、磁盘 I/O 、内存与交换分区使用情况。甚至可以记录进程统计以及网络接口活动在内的多种信息。

atop 的 GitHub 项目地址: https://github.com/Atoptool/atop/
主要的原因,还是 atop 的历史数据回放功能。虽然我们自己也可以用 crontab 来定时记录系统活动快照,但是,atop 的 systemctl 服务,可以自动记录系统活动快照,而且,atop 还可以自动删除过期的系统活动快照,非常方便。与其自己造造轮子,不如直接使用 atop 的 systemctl 服务。
![]()
其实,atop 大体可以分为两个模式:
atop 进入 atop 的交互界面,查看实时的数据,并且可以使用命令进行交互。历史数据模式其实就是历史的实时检测模式快照,所以我们使用 atop 命令,只需要知道 atop 交互模式如何使用,以及配置历史数据模式即可。
我们直接使用 atop 进入类似于 top 的交互模式,查看实时数据:
# 进入 atop 交互模式
atop

上方是 CPU 、内存、磁盘、网络、GPU 的利用率以及使用量。下方是进程列表,以及进程的详细信息。介绍一下常用的字段含义:
这些字段提供了关于系统中各个进程的详细信息,帮助用户监控和分析系统性能。
这个时候,你按下 q 即可退出,或者按住 Ctrl + C 退出。如果你保持这个界面,并不退出,可以按 h 或者 ? 查看帮助信息:

比如: 如果你想看那个进程占用了最多的 CPU ,那么我们只需要进入交互模式,然后按 C (按 CPU 消耗资源排序) 排序,然后按 g (显示通用信息) 查看进程信息,这个时候,你可以按 z 冻结刷新,观察好后按 q 退出即可。
在进入交互模式的时候,你可以直接追加参数,就不用进入交互模式后,再按相关指令排序进程列表或者切换展示视图了:
# 进入交互模式并按使用 CPU 占用率排序
atop -C
# 进入交互模式并按使用内存的占用率排序
atop -M
接下来,我们看几个具体使用的场景。
我们使用 atop 的时候,如果想杀掉某个进程,那么使用 atop 也是可以操作的。先使用 z 冻结刷新,之后你可以选择资源排序(比如: 按 C 就是使用 CPU 占用率排序[默认],按 M 就是使用内存的占用率排序):

我们只需要按 k (终止一个进程) ,进入选择进程的输入界面:

比如,我们这里 kill 掉 chromium 进程,输入进程的 PID: 619981

之后,询问发送的信号:
Signal [15]
默认情况,我们直接填 15 就可以了,也就是我们 kill 「 pid 」 的默认信号。如果无法 kill 可以考虑使用 root 权限运行 atop,或者使用 9:
就可以杀掉这个进程了。

首先,网络模块 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 的 systemnctl 服务: 用于定期记录系统活动快照。如果要查看历史数据,atop 的 systemctl 服务是必不可少的。至于安装 atop, 方法很多,主要有:
atop 已经在各个软件包管理器内发布,不过版本可能不是最新的。atop 的源码,可以直接安装最新或者指定版本的 atop。安装 atop 命令,都会自动配置 atop 的 systemctl ;接下来我们都简单介绍一下上述两种安装方法。
![]()
如果你想用高版本的 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
解释一下各个参数:
""表示不使用任何额外选项;当然,你也不用修改这个配置文件,只需要修改 /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 的守护进程对系统资源的消耗不大(可能只有 10M 左右的内存占用);
如果还是想卸载 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
既然 atop 已经卸载,那么也没必要保留 netatop 了,同样根据编译步骤,逆向操作即可:
# 停止并禁用 netatop 服务
systemctl stop netatop
systemctl disable netatop
# dkms 移除 netatop 模块
dkms remove -m netatop -v 3.2.2 --all
哈哈,我们了解了 atop 的优势,特别是其自动周期性记录和历史数据回放功能。本次的 atop 分享就到这里啦~~ 感谢阅读。也给腾讯云的服务团队点个赞,非常专业和耐心,帮用户解决实际的问题。
其实和 atop 类似的工具还有很多(比如: htop、glances、nmon 等),主要还是看个人的使用习惯。就好比,查看端口的占用情况,你可以使用 netstat、ss、lsof 等命令,也可以使用 nmap、ncat 等工具;
如果你有更好的工具推荐,欢迎在评论区留言;有机会,我也给大家出一些其他工具的使用教程。
![]()
1
julyclyde 345 天前
浓缩一点
你只需要提一下这软件的名字就足够了 其他都不需要写 |
2
Magicmadoka 345 天前 via Android
netatop 能监控 docker 容器的流量么,问下
|
3
zuotun 345 天前
省流: sudo apt install atop
通常来说这种软件什么版本都无所谓,只要有就行了 抓负载情况最简单的就是一个定时任务例如每分钟执行一次,通过时间戳区分写入到文件,更简单的就是直接交给云厂商工程师 |
4
julyclyde 345 天前
@zuotun 如果版本旧,那就有所谓
我吃过亏的,collectD 运行插件的时候居然是先设置自己的环境变量然后再 fork 传递给子进程,而不是通常做法给子进程单独准备一个环境变量数组 在运行多个插件的时候,对“自己的环境变量”交错改来改去的就会出错 |
5
YummyCocoa OP @julyclyde 有道理。下次我就写关键的,详细内容再丢博客😂
|
6
wheat0r 345 天前
这东西最有价值的是历史数据功能,然而没有介绍
|
7
YummyCocoa OP @wheat0r 有呀,中间的那一丢丢就是。更多的丢博客里了~
|
8
cooltechbs 345 天前 via Android
现在各种 top 好多啊
前阵子刚了解了 btop ,这又来个 atop 哈哈 |
9
julyclyde 344 天前
@YummyCocoa 还有,编译是一种病,得治
|
10
YummyCocoa OP @julyclyde 😂😂 治不了一点
|