atop可以使用yum或apt包管理器进行安装。atop man page 中详细说明了 atop 中各监控项含义及atop命令用法。
如上图所示, atop 的界面分为上半部分的系统监控项和下半部分的进程列表。
atop 每10s更新一次系统监控项以及在这段时间内状态发生变化的进程,按下A键可以查看全部进程。
系统状态 进程
第一行PRC显示总体进程状况:
sys, user 表示 CPU 在内核态和用户态的运行时间比例
#proc 为当前总进程数,
#trun 表示 running 状态线程数
#tslpi 表示 sleeping interruptible 状态的进线程数
#tslpu 表示 sleeping uninterruptible 状态线程数
#zombie 表示僵尸进程数
clones 表示在监控周期(默认10s)内 clone() 系统调用次数
linux 中进程有两种 sleep 状态:
interruptible sleep: 进程接收系统信号,可以被系统信号中断
uninterruptible sleep: 进程不接收系统信号,不可被系统信号中断,包括kill -9 (SIGKILL 信号)。此状态的进程通常在等待系统资源,如磁盘IO或网络IO。
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。大量僵尸进程可能会占用进程描述符空间导致无法创建进程。
孤儿进程是容易与僵尸进程混淆的一类进程,孤儿进程是父进程终止的进程,它们会被 init 进程接管并不会产生危害。
CPU在 atop 中每个 CPU 逻辑核心拥有一个 cpu 行表示自身状态, 最前面的 CPU 行则展示系统总览。
sys 表示CPU在内核态工作时间比例
user 表示 CPU 在用户态工作时间比例
irq 表示 CPU 处理系统中断所消耗的时间比例
idle 表示 CPU 空闲时间比例
CPL 行表示 CPU 负载(CPU Load):
avg1, avg5, avg15: 过去 1min、5min和 15min 内的平均系统负载
csw 表示监控周期内上下文切换的次数
intr 表示监控周期内中断发生的次数
系统负载
CPU 负载或称为系统负载是一个容易被误解的监控项,它的定义为内核运行队列中 running 或 uninterruptible sleep 状态的进程的平均数与CPU计算能力的比值。
系统负载 1.0 说明CPU恰好满载,当系统负载大于1.0时会有进程因为等待CPU而阻塞。在多核系统中,系统负载等于CPU核心数表示恰好满载,如在上图所示双核系统中,load=2说明恰好满载。
上文已经说明,uninterruptible sleep 进程通常是在等待IO, 当网络异常或磁盘故障时会导致大量进程处于 uninterruptible sleep 状态从而导致 Load 急剧上升。
在常见的服务器程序大多数为IO密集型程序,常见的CPU密集型任务包括:
大规模的排序计算, 如 mysql filesort
大量的正则表达式匹配
大量的 Hash Code 计算
大规模的加解密或压缩解压计算
当我们发现 CPU 使用率上升时,我们可以优先考虑是否在上述CPU密集型任务。
内存MEM 行描述内存使用情况:
tot: 物理内存总量
free: 空闲内存总量
cache: 页缓存用量
buff: 文件系统元数据缓存用量
slab: 系统内核内存用量
dirty: 需要写回磁盘的脏页用量,这部分内存使用已包含在cache中
页缓存是 Linux 处理文件IO的机制,由于磁盘的读写速度远远低于内存和CPU的运行速度,因此内核将文件映射为页缓存在内存中,CPU 读取文件时首先访问页缓存,若目标页未被缓存则会产生一个页缺失中断,中断处理器会从磁盘中读取文件加载到内存中,必要时会将不常用的页从内存中逐出。
与读取过程类似,CPU 不会直接写磁盘而是将更改写入相应的页,修改后的页就会成为脏页(dirty page), 脏页的内容会被异步地写入磁盘。
在一些文档中 buff 被笼统地称为文件系统缓存,在 man page 中 buff 的定义为 the amount of memory used for filesystem meta data 即文件系统元数据缓存。
PAG 行表示页缓存的使用情况:
scan: 当可用内存不足时扫描的页数,这个值过高说明可用内存不足
stall: 内核紧急将页加载到内存中的次数,这个值过高说明可用内存不足
steal: 虚拟机相关指标
swin: 从 Swap 分区将页加载到内存的次数
swout: 将内存页写入 Swap 分区的次数
scan 和 steal 的解释比较难理解,附上 man page 中的原文:
This line contains the number of scanned pages ('scan') due to the fact that free memory drops below a particular threshold and the number times that the kernel tries to reclaim pages due to an urgent need ('stall')
SWP 行表示 Swap 分区使用状态:
tot: Swap 分区总大小
free: Swap 分区空闲空间大小