V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
YummyCocoa
V2EX  ›  Linux

Linux 上编译安装 atop 和 netatop , atop 进行性能监控的详解

  •  
  •   YummyCocoa · 1 天前 · 761 次点击

    Linux 系统的资源使用情况,你可以通过使用命令如freetopnetstat来实时监控内存、CPU 及端口的使用状态。对于需要追踪历史资源消耗动态的场景,atop命令则能有效帮助用户查看过去的系统负载情况。

    本篇教程的灵感源自一位小伙伴的真实经历:她曾遇到服务器不定期卡顿的问题,没想到腾讯云的客服指导她使用 atop 进行故障排查,结果发现是 dnf-makecache 周期性执行导致的系统卡顿。腾讯云客服的专业性让人印象深刻。

    本来就是用户自己的事情,但是腾讯云的售后客服还是给出专业的解决方案,让人感觉挺有温度的,也有点小惊喜(o′ω`o)ノ;

    很 Nice 的客服

    鉴于此,本次使用腾讯云的轻量应用服务器详解 atop 的使用,更好地监控服务器性能。

    文章教程可能比较长,本文尽可能提炼。完整教程可以访问我的博客:

    如果你对云服务器、CDN 、云数据库和 Linux 等云计算感兴趣,亦或者喜欢编程、设计、产品、运营等领域,欢迎加入我们的开发者爱好群,一起交流学习: 812198734 (目前可能就我一个人?毕竟才刚刚创建 ~)。

    什么是 atop

    atop 是一个用于 Linux 和 Unix 类操作系统的时间间隔内系统活动分析工具。看它的名字,很容易联想到 Linux 自带的 top,其实确实挺像的,不过与 top 更像的,应该是 btophtopatop 主要是允许用户从命令行界面上查看系统过去的 CPU 使用率、磁盘 I/O 、内存与交换分区使用情况。甚至可以记录进程统计以及网络接口活动在内的多种信息。

    atop

    atop 的 GitHub 项目地址: https://github.com/Atoptool/atop/

    选择 atop?

    主要的原因,还是 atop 的历史数据回放功能。虽然我们自己也可以用 crontab 来定时记录系统活动快照,但是,atopsystemctl 服务,可以自动记录系统活动快照,而且,atop 还可以自动删除过期的系统活动快照,非常方便。与其自己造造轮子,不如直接使用 atopsystemctl 服务。

    很 Nice 的客服

    atop 基础使用

    其实,atop 大体可以分为两个模式:

    • 实时检测模式: 直接使用 atop 进入 atop 的交互界面,查看实时的数据,并且可以使用命令进行交互。
    • 历史数据模式: 通过预先设定的监控定时器配置,查看历史数据快照。

    历史数据模式其实就是历史的实时检测模式快照,所以我们使用 atop 命令,只需要知道 atop 交互模式如何使用,以及配置历史数据模式即可。

    交互模式

    我们直接使用 atop 进入类似于 top 的交互模式,查看实时数据:

    # 进入 atop 交互模式
    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 或者 ? 查看帮助信息:

    atop 帮助信息

    比如: 如果你想看那个进程占用了最多的 CPU ,那么我们只需要进入交互模式,然后按 C (按 CPU 消耗资源排序) 排序,然后按 g (显示通用信息) 查看进程信息,这个时候,你可以按 z 冻结刷新,观察好后按 q 退出即可。

    在进入交互模式的时候,你可以直接追加参数,就不用进入交互模式后,再按相关指令排序进程列表或者切换展示视图了:

    # 进入交互模式并按使用 CPU 占用率排序
    atop -C
    # 进入交互模式并按使用内存的占用率排序
    atop -M
    

    接下来,我们看几个具体使用的场景。

    kill 进程

    我们使用 atop 的时候,如果想杀掉某个进程,那么使用 atop 也是可以操作的。先使用 z 冻结刷新,之后你可以选择资源排序(比如: C 就是使用 CPU 占用率排序[默认],按 M 就是使用内存的占用率排序):

    atop 冻结刷新

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

    atop 输入杀死的进程

    比如,我们这里 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 查看网络流量错误

    这个时候,有两种可能:

    • 权限不足: atop 没有权限查看网络流量,这个时候,我们只需要使用 root 权限运行 atop 即可
    • netatop 进程没有启动: atop 会自动关联 netatop 进程,如果 netatop 进程没有启动,那么就会报错。可以使用 systemctl status netatop 查看 netatop 进程是否启动,如果没启动,那么可以使用 systemctl start netatop 启动 netatop 进程

    安装 atop

    安装好后的 atop 主要包括两个部分:

    • atop 命令: 用于实时查看系统负载状态。
    • atopsystemnctl 服务: 用于定期记录系统活动快照。如果要查看历史数据,atopsystemctl 服务是必不可少的。

    至于安装 atop, 方法很多,主要有:

    • 软件包管理器安装: atop 已经在各个软件包管理器内发布,不过版本可能不是最新的。
    • 源码编译安装: 下载 atop 的源码,可以直接安装最新或者指定版本的 atop

    安装 atop 命令,都会自动配置 atopsystemctl ;接下来我们都简单介绍一下上述两种安装方法。

    好奇

    源码编译

    如果你想用高版本的 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
    

    下载 2.11 版本的源码

    之后,进行编译:

    # 编译
    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
    

    netatop 运行状态

    历史监控日志

    上文说到,atop 部署和安装后,会自动配置一个由 systemctl 所管理的守护进程,这个守护进程会自动运行 atop。如果想卸载这个守护进程,可以使用 systemctl stop atop 停止 atop 守护进程,然后使用 systemctl disable atop 禁用 atop 守护进程。

    查看这个守护进程的状态,可以使用 systemctl status atop 命令:

    查看 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 守护进程产生的日志文件,如何有效地查看某段时间内的系统负载变化呢?

    我们只需要用 atop -r 「日志文件」 命令即可,比如:

    # 查看 20241029 日志文件
    atop -r /var/log/atop/atop_20241029
    

    查看 atop 守护进程历史日志

    这个时候,我们按 t 可以查看下一个时间快照节点,按 shift + t 可以查看上一个时间快照节点。如果你想直接查看某个时间节点,那么可以使用 b,之后出现的提示框:

    # 输入时间戳,其中年月日和秒是可选的
    Enter new time (format [YYYYMMDD]hhmm[ss]):
    

    查看 atop 守护进程历史日志

    是不是很方便呢?还有更方便的,你可以直接用组合键:

    # 查看 20241029 日志文件,时间戳为 23 点
    atop -r /var/log/atop/atop_20241029 -b 2300
    

    atop 卸载

    其实,我个人认为 atop 是没有必要卸载的,因为 atop 的功能非常强大,而且 atop 的守护进程对系统资源的消耗不大(可能只有 10M 左右的内存占用);

    如果还是想卸载 atop ~~

    Keep Going

    反编译 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 类似的工具还有很多(比如: htopglancesnmon 等),主要还是看个人的使用习惯。就好比,查看端口的占用情况,你可以使用 netstatsslsof 等命令,也可以使用 nmapncat 等工具;

    如果你有更好的工具推荐,欢迎在评论区留言;有机会,我也给大家出一些其他工具的使用教程。

    稳了

    10 条回复    2024-11-14 09:36:00 +08:00
    julyclyde
        1
    julyclyde  
       1 天前
    浓缩一点
    你只需要提一下这软件的名字就足够了
    其他都不需要写
    Magicmadoka
        2
    Magicmadoka  
       1 天前 via Android
    netatop 能监控 docker 容器的流量么,问下
    zuotun
        3
    zuotun  
       1 天前
    省流: sudo apt install atop
    通常来说这种软件什么版本都无所谓,只要有就行了
    抓负载情况最简单的就是一个定时任务例如每分钟执行一次,通过时间戳区分写入到文件,更简单的就是直接交给云厂商工程师
    julyclyde
        4
    julyclyde  
       1 天前
    @zuotun 如果版本旧,那就有所谓

    我吃过亏的,collectD 运行插件的时候居然是先设置自己的环境变量然后再 fork 传递给子进程,而不是通常做法给子进程单独准备一个环境变量数组
    在运行多个插件的时候,对“自己的环境变量”交错改来改去的就会出错
    YummyCocoa
        5
    YummyCocoa  
    OP
       1 天前
    @julyclyde 有道理。下次我就写关键的,详细内容再丢博客😂
    wheat0r
        6
    wheat0r  
       1 天前
    这东西最有价值的是历史数据功能,然而没有介绍
    YummyCocoa
        7
    YummyCocoa  
    OP
       1 天前
    @wheat0r 有呀,中间的那一丢丢就是。更多的丢博客里了~
    cooltechbs
        8
    cooltechbs  
       17 小时 40 分钟前 via Android
    现在各种 top 好多啊
    前阵子刚了解了 btop ,这又来个 atop 哈哈
    julyclyde
        9
    julyclyde  
       12 小时 15 分钟前
    @YummyCocoa 还有,编译是一种病,得治
    YummyCocoa
        10
    YummyCocoa  
    OP
       11 小时 59 分钟前
    @julyclyde 😂😂 治不了一点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3163 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:35 · PVG 21:35 · LAX 05:35 · JFK 08:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.