机器经常oom 与夯死,但没有进程监控,找不到哪个用的资源比较多,觉得试试 atop,没想到完美解决问题

atop是一款用于监控Linux系统资源与进程的工具,能够报告所有进程的活动。其以一定的频率记录系统和进程活动,采集的数据包含CPU、内存、磁盘、网络的资源使用情况和进程运行情况,并能以日志文件的方式保存在磁盘中。对于每个进程,会显示CPU使用率、内存增长、磁盘使用率、优先级、用户名、状态和退出码等。当机器出现问题后,您可以获取相应的atop日志文件进行分析。本文介绍如何在Linux实例中安装、配置并使用atop监控工具。

1 安装atop

1.1 执行如下命令,安装atop。

yum 安装的 atop 版本是2.7的,日志分割失效,建议从官网下载 rpm 包安装
可以点击这里下载对应的 rpm 包,注意系统版本,我这里用的 rocky 8
还有个日志保存天数问题,默认加 2,注意下

1
sudo yum install https://www.atoptool.nl/download/atop-2.10.0-1.el8.x86_64.rpm

2 配置并启动atop

  • LOGOPTS:用于控制日志文件记录选项,可以自定义日志文件的保存路径、命名规则、滚动周期以及其他与日志记录相关的选项。为空""表示不使用任何额外选项。
  • LOGINTERVAL:监控周期,建议将默认的监控周期600s修改为30s。
  • LOGGENERATIONS:日志保留时间,为避免atop长时间运行占用太多磁盘空间,建议将默认的日志保留时间28天修改为 5天。 这里用的find . -mtim +5来进行删除, 表示查找 5 天前修改的日志,不包括第五天,然后生成的日志最新时间是第二天 0 点,所以 写 5 是删除一周以前的日志
  • LOGPATH:指定atop日志文件的路径。默认值为/var/log/atop。
1
2
3
4
5
vim /etc/sysconfig/atop
LOGOPTS="-w /var/log/atop/atop_$(date +\%Y\%m\%d)"
LOGINTERVAL=90
LOGGENERATIONS=4
LOGPATH=/var/log/atop

2.1 启动atop服务。

1
2
sudo systemctl restart atop
sudo systemctl enable atop

3 分析atop日志

atop启动后,会将采集记录存放在/var/log/atop目录下的日志文件中。执行如下命令,查看日志文件。

1
atop -r /var/log/atop/atop_20240716 -l -b 13:00 -e 17:00

3.1 atop常用命令

打开日志文件后,您可以使用以下命令筛选数据。

  • g:切换回默认的综合输出视图。
  • c:显示进程列完整命令行。
  • l: 简化显示
  • m:按照进程内存使用率进行降序筛选。
  • d:按照进程磁盘使用率进行降序筛选。
  • a:按照进程资源综合使用率进行降序筛选。
  • n:按照进程网络使用率进行降序筛选。
  • j: 每个容器的总资源消耗
  • t:跳转到下一个监控采集点。
  • T:跳转到上一个监控采集点。
  • b:指定时间点,格式为YYYYMMDDhhmm。
  • e: 指定时间区间,与-b 配合

3.2 系统资源监控字段含义

下图为部分监控字段以及数值,具体数值根据采样周期有所不同。下图仅供参考,具体数据以您实际数据为准。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ATOP - 10-1-1-1      2024/07/16  14:02:27      -----------------    80d22h2m18s elapsed
PRC | sys 5d15h | user 4d21h | #proc 1737 | #zombie 0 | #exit 0 |
CPU | sys 10% | user 9% | irq 2% | idle 774% | wait 4% |
CPL | avg1 0.21 | avg5 0.38 | avg15 0.41 | csw 548314e5 | intr 34394e6 |
MEM | tot 31.3G | free 5.7G | buff 5.2M | slab 2.8G | numnode 1 |
SWP | tot 0.0M | free 0.0M | swcac 0.0M | vmcom 8.2G | vmlim 15.6G |
LVM | tavg-lv_data | busy 5% | read 9272 | write 1353e5 | avio 2.68 ms |
LVM | rl-root | busy 0% | read 24578 | write 1474e4 | avio 1.98 ms |
LVM | rl-swap | busy 0% | read 145 | write 0 | avio 1.48 ms |
DSK | sdb | busy 5% | read 10214 | write 1336e5 | avio 2.72 ms |
DSK | sda | busy 0% | read 25972 | write 1311e4 | avio 2.23 ms |
NFM | 1934a878d544 | srv 10.122.1 | read 10.4M | write 3.2M | nread 52.4M |
NFM | 226453875267 | srv 10.122.1 | read 10.4M | write 3.2M | nread 52.4M |
NET | transport | tcpi 13619e5 | tcpo 14296e5 | udpi 22191e4 | udpo 16771e3 |
NET | network | ipi 159264e4 | ipo 160147e4 | ipfrw 2840e3 | deliv 1589e6 |
NET | lo ---- | pcki 11036e5 | pcko 11036e5 | si 315 Kbps | so 315 Kbps |
NET | eth0 ---- | pcki 47821e4 | pcko 46149e4 | si 256 Kbps | so 216 Kbps |
PID CID SYSCPU USRCPU VGROW RGROW RDDSK WRDSK CPU CMD 1/87
318634 host-------- 51h57m 15h40m 2.0G 136.3M 28.0K 214.0M 3% kubelet
283409 host-------- 10h45m 37h15m 1.8G 846.4M 0B 119.9M 2% kube-apiserver
274396 host-------- 6h23m 10h44m 9.9G 134.9M 0B 408.7G 1% etcd
304980 780e3ae15b3f 3h13m 5h27m 860.4M 159.9M 56.0K 20.0K 0% cilium-agent
288977 babbbf621f60 60m21s 7h14m 1.0G 252.3M 0B 19.8M 0% argocd-applica

主要参数说明如下:

参数 说明
Atop行 主机名、信息采样日期和时间点。
PRC行 进程整体运行情况。
Sys、user:分别代表进程在内核态和用户态的运行时间。
#proc:进程总数。
#trun:处于running状态进程数。
#tslpi:处于sleeping Interruptible状态的进程数。
#tslpu:处于sleeping Uninterruptible状态的进程数。
#zombie:僵死进程的数量。
#exit:atop采样周期内退出的进程数。
CPU行 Cpu整体的使用情况,即多核cpu作为一个整体cpu资源的使用情况。cpu行各个字段数字相加结果为n*100%,其中n为cpu的核数。
Sys、user:cpu在用于处理进程时,进程在内核态及用户态所占cpu的时间比例。
Irq:cpu用于处理中断的时间比例。
Idle:cpu处在完全空闲状态的时间比例。
Wait:cpu处在进程等待磁盘io导致cpu空闲状态的时间比例。
CPL行 Cpu负载情况。
Avg1、avg5和avg15:分别代表过去1分钟、5分钟和15分钟内运行队列中的平均进程数量。
Csw:上下文切换次数。
Intr:中断发生次数。
MEM行 内存的使用情况。
Tot:物理内存总量。
Free:空闲内存的大小。
Cache:用于页缓存的内存大小。
Buff:用于文件缓存的内存大小。
Slab:系统内核占用的内存大小。
SWP行 交换空间的使用情况。
Tot:交换区总量。
Free:空闲交换空间大小。
LVM行 LVM情况。
rl-root,vg+lv对应名称,剩下信息与DSK行一样。
DSK行 磁盘使用情况,每一个磁盘设备对应一列,如果有vdb设备,那么将会增加一行dsk信息。
sdb:磁盘设备标识。
Busy:磁盘处于busy状态的时间比例。
Read、write:分别代表读、写请求数量。
NFM行 nfs 挂载信息
NET行 多列net展示了网络状况,包括传输层tcp和udp、ip层以及各活动的网口信息。
si:各层或活动网口接收包大小。
so: 各层或活动网口发送包大小。