目录
- 前言
- 1. top 监测结果分析
- 1.1 第一部分:系统整体性能分析
- 1.1.1 第一行(top...):系统状态
- 1.1.2 第二行(Tasks...):进程状态信息
- 1.1.3 第三行(Cpus...):CPU 的整体负载
- 1.1.4 第四行(KiB Mem...):Mem内存信息(物理内存)
- 1.1.5 第五行(KiB Swap...):Swap交换内存(虚拟内存)
- 1.1.6 小结
- 1.2 第二部分:进程信息
- 2. top 命令行选项
- 3. top 交互命令
前言
在 Linux 中常用 top 动态监测程序运作的状态,以分析系统的整体性能。比如,监测 CPU 使用率、内存使用、系统负载以及每个进程资源占比等情况。
1. top 监测结果分析
先看下 top 整体输出结果:
从上图我们可以很清楚的看到,top 输出结果以光标所在处分为了上下 2 部分:
1)上半部分5行是整个系统的资源使用状态;
2)下半部分是系统中每个进程资源占用的具体信息;
3)光标所在处是用来输入操作命令的。
1.1 第一部分:系统整体性能分析
1.1.1 第一行(top…):系统状态
top - 16:41:10 up 16:54, 2 users, load average: 0.00, 0.00, 0.00
top - 16:41:10 | 系统当前时间 |
---|---|
up 16:54 | 系统开机到目前为止所经过的时间:16天54分 |
2 users | 当前已经登入系统的用户人数 |
load average: 0.00, 0.00, 0.00 | 系统在 1, 5, 15 分钟的平均工作负载 (平均在 CPU 上运行或者等待运行的进程数量),越小代表系统越闲置。一般只要每个 CPU 的当前活动进程数不大于 3 表示系统的性能是良好的,如果大于 5 就表示系统性能有严重问题了。计算公式:每个 CPU 的当前任务数 = load average / CPU总数 |
1.1.2 第二行(Tasks…):进程状态信息
Tasks: 305 total, 1 running, 223 sleeping, 0 stopped, 0 zombie
305 total | 所有启动的进程数 |
---|---|
1 running | 正在运行的进程数 |
223 sleeping | 挂起的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
注意:如果 zombie 的值不是 0,就要好好看看到底是哪个进程变成僵尸了!!!
1.1.3 第三行(Cpus…):CPU 的整体负载
%Cpu(s): 0.2 us, 0.1 sy, 0.0 ni, 99.4 id, 0.1 wa, 0.0 hi, 0.2 si, 0.0 st
0.2 us | 用户空间占用的 CPU 百分比 |
---|---|
0.1 sy | 内核空间占用的 CPU 百分比 |
0.0 ni | 用户进程空间内改变过优先级的进程占用 CPU 百分比 |
99.4 id | 空闲 CPU 百分比 |
0.1 wa | 等待输入输入的 CPU 百分比(一般 CPU 处理速度很快,而磁盘 IO 操作很慢。wa 表示 CPU 在等待 IO 操作完成所花费的时间。系统不应该花费大量的时间来等待 IO 操作,否则就说明 IO 存在瓶颈) |
0.0 hi | 硬中断占用的 CPU 百分比(硬中断是硬盘、网卡等硬件设备发送给 CPU 的中断消息) |
0.2 si | 软中断 CPU 百分比(软中断是由程序发出的中断) |
0.0 st | 虚拟 CPU 等待实际 CPU 的时间的百分比 |
【提示】一般我们关注比较多的是:us、sy、id、wa、hi、si 这6个数值。如果是多核心的设备,可以【按下数字键 1】来查看不同 CPU 的负载率:
1)%id 表示 CPU 空闲率,当 id 持续过低的时候,表示系统迫切需要解决 CPU 资源问题了;
2)CPU 使用率等于:1 - %id ,或者:us + sy + si;
3)wa:使用率过高的时候,我们需要考虑 IO 的性能是否有瓶颈,可以在使用 iostat、sar 等命令做进一步分析;
4)hi: 使用率过高时,表示当前硬件中断占用很大的百分比。一般硬件中断我们可以分析文件/proc/interrupts、/proc/irq/pid/smp_affinity、irqbalance 服务是否配置,以及 CPU 的频率设置,通过这些可以帮系统打散优化系统的硬件中断;
5)si:Linux kernel 通过用一种软件的方法(可延迟函数)来模拟硬件的中断模式,通常叫做软中断。常见的软件中断一般都是和网络有关。从网卡到 IP 层的数据报文收发都是 si 处理的,长时间写日志也可能产生软件中断;
6)当软中断出现瓶颈的时候,系统有个进行叫 ksoftirqd,每个 CPU 都有自己对应的 ksoftirqd/n(n 为 CPU 的逻辑 ID),每个 ksoftirqd 的内核线程都会去运行对应的 ksoftirqd(函数)来处理自己的中断队列上的软件中断。所以,当网络出现阻塞的时候,软件中断程序 ksoftirqd肯定会出现瓶颈。此时我们可以通过 ps aux|grep ksoftirqd 查看 ksoftirqd 的瓶颈;
7) Ni:优先级(priority)为操作系统用来决定 CPU 分类的参数,Linux使用(round-robin)的算法来做 CPU 排程,优先序越高,有可能获得的 CPU 时间就越多。但是我们可以通过 nice 命令以更改过的优先序来执行程序,如果未制定程序,则会打印出目前的排程优先序,内定的adjustment 为 10,范围为 -20(最高优先序)到 19(最低优先序)。
1.1.4 第四行(KiB Mem…):Mem内存信息(物理内存)
KiB Mem : 3994728 total, 1374080 free, 611452 used, 2009196 buff/cache
3994728 total | 物理内存总量 |
---|---|
1374080 free | 空闲物理内存 |
611452 used | 已经使用的物理内存 |
2009196 buff/cache | 内核缓存内存量 |
1.1.5 第五行(KiB Swap…):Swap交换内存(虚拟内存)
KiB Swap: 2097148 total, 2097148 free, 0 used. 3103764 avail Mem
2097148 total | 交换区总量 |
---|---|
2097148 free | 空闲交换区总量 |
0 used | 已使用的交换区总量 |
3103764 avail Mem | 可用于启动一个新应用的内存(物理内存),和 free 不同,它计算的是可回收的 page cache 和 memory slab |
1.1.6 小结
- 第四行和第五行输出的信息,等同于使用 free -m 命令;
- 在第四行中,已使用的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到 free 中去,因此在 linux 上 free 内存会越来越少,但不用为此担心;
- 剩余可用内存总量 = 第四行的free + 第四行的buff/cache,按这个公式此服务器的可用内存:1374080k + 2009196k = 3.3GB左右;
- 对于内存监控,在 top 里我们要时刻监控第五行 swap 交换分区的 used,如果这个数值在不断的变化,说明内核在不断进行内存和 swap 的数据交换,这是真正的内存不够用了。
1.2 第二部分:进程信息
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID | 进程ID |
---|---|
USER | 进程所有者 |
PR | 进程的优先级,越小优先级越高 |
NI | nice 值,负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量,单位kb,VIRT = SWAP + RES |
RES | 进程使用的、未被换出的物理内存大小,单位kb,RES = CODE + DATA |
SHR | 进程使用的共享内存大小,单位 kb |
S | 进程状态(D=不可中断的睡眠状态(通常出现在IO阻塞) R=正在运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 N=进程优先值为负数 I=空闲状态) |
%CPU | 进程占用的 CPU 使用率 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的 CPU 时间总计,单位 1/100 秒 |
COMMAND | 进程名称(命令名/命令行) |
上述列的是 top 命令的默认显示,还有一些参数选项可以使用 top 的交互命令选择显示,按 f 键,进入列配置页面选择需要展示的参数内容。
2. top 命令行选项
- 命令格式:top [参数]
参数 | 功能描述 |
---|---|
-b | 批处理,一般配合 -n 指定输出几次统计信息,将输出重定向到指定文件,比如:top -b -n 5 > top.txt |
-c | 显示进程的完整命令,默认是进程名 |
-i | 不显示任何闲置 (idle) 或无用 (zombie) 的进程 |
-s | 保密模式 |
-S | 累积模式 |
-d <秒数> | 设置刷新时间,默认是5s |
-n <次数> | 指定刷新次数,比如 top -n 5,刷新输出5次后退出 |
-o <-PID/PID> | 指定要排序的字段,比如 top -o -PID:按照 PID 从小到大排序, top -o PID:按照 PID 从大到小排序 |
-p <进程号> | 指定显示某个进程的信息 |
-u <用户名> | 查找特定用户启动的进程 |
3. top 交互命令
- 在 top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了 s 选项, 其中一些命令可能会被屏蔽。
按键 | 功能描述 |
---|---|
1 | 多核心的设备,可以查看不同 CPU 的负载率 |
k | 终止一个进程 |
i | 忽略闲置和僵死进程,这是一个开关式命令 |
q | 退出程序 |
r | 重新安排一个进程的优先级别 |
S | 切换到累计模式 |
s | 改变两次刷新之间的延迟时间(单位为 s),如果有小数,就换算成 ms。输入 0 值则系统将不断刷新,默认值是 5s |
f | 可以选择是否需要展示的项目 |
o | 改变显示项目的顺序 |
c | 显示产生进程的完整命令,等同于 -c 参数,再次按下 c 键,变为默认显示 |
m | 切换显示内存信息 |
t | 切换显示进程和 CPU 状态信息 |
h | 显示帮助画面 |
H | 查看线程信息 |
l | 切换显示平均负载和启动时间信息 |
M | 根据驻留内存大小进行排序 |
P | 根据 CPU 使用百分比大小进行排序 |
T | 根据时间/累计时间进行排序 |
W | 将当前设置写入 ~/.toprc 文件中 |
温馨提示:这里只列举一些常用的命令,大家如果对 top 更多细节的处理感兴趣,请查阅:man top