楔子: 学会灵活使用各种或工具或手段来监测自己的项目运行情况无疑是一种自我能力的提高。Linux top 命令也许会有所帮助。
Linux top 命令
Linux top 命令是服务器工程师和运维最常用的工具之一,它所带出来的信息可以有效的观察和监测当前服务器的各项性能,如系统CPU、内存、运行时间、执行的进程等信息,这可以实时有效的发现服务器运载能力或缺陷出在哪里。如内存不够、CPU处理能力不够、IO读写过高等等。就像 Windows 的任务管理器。
[devuser@ping-test8264 logs]$ top
top - 14:36:45 up 12 days, 3:16, 1 user, load average: 0.66, 0.67, 0.63
Tasks: 91 total, 1 running, 89 sleeping, 1 stopped, 0 zombie
Cpu(s): 40.3%us, 0.3%sy, 0.0%ni, 59.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2045940k total, 2027396k used, 18544k free, 87148k buffers
Swap: 1048572k total, 7472k used, 1041100k free, 110292k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28132 ping 20 0 2927m 1.7g 6728 S 81.1 85.5 780:26.52 java
30846 root 20 0 323m 10m 3216 S 0.3 0.5 27:33.91 ops-agent
1 root 20 0 19236 1252 1112 S 0.0 0.1 0:00.37 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:04.29 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:10.99 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0
6 root RT 0 0 0 0 S 0.0 0.0 0:02.32 watchdog/0
7 root RT 0 0 0 0 S 0.0 0.0 0:04.43 migration/1
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/1
9 root 20 0 0 0 0 S 0.0 0.0 0:09.90 ksoftirqd/1
10 root RT 0 0 0 0 S 0.0 0.0 0:02.24 watchdog/1
11 root 20 0 0 0 0 S 0.0 0.0 1:12.45 events/0
12 root 20 0 0 0 0 S 0.0 0.0 1:20.05 events/1
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events/0
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events/1
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_long/0
16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_long/1
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_power_ef
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_power_ef
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper
21 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns
22 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr
23 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm
24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 xenwatch
25 root 20 0 0 0 0 S 0.0 0.0 0:01.69 xenbus
26 root 20 0 0 0 0 S 0.0 0.0 0:05.78 sync_supers
27 root 20 0 0 0 0 S 0.0 0.0 0:00.11 bdi-default
28 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/0
29 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/1
30 root 20 0 0 0 0 S 0.0 0.0 0:06.56 kblockd/0
31 root 20 0 0 0 0 S 0.0 0.0 0:00.90 kblockd/1
32 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_aux
33 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_sff/0
34 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_sff/1
35 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksuspend_usbd
36 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khubd
信息拆解
命令行:top 命令
[devuser@ping-test8264 logs]$ top
第一行:系统概览
top - 14:36:45 up 12 days, 3:16, 1 user, load average: 0.66, 0.67, 0.63
分别对应显示:系统当前时间 up 系统到目前为止运行的时间,当前登录用户数,以及负载均衡情况:
14:36:45 | 当前时间 |
up 12 days, 3:16 | 系统运行时间,格式为时:分(系统当前已经运行了12天3小时16分钟) |
1 user | 当前登录用户数 |
load average: 0.66, 0.67, 0.63 | 系统负载情况,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟 前到现在的平均值 |
注意:load average 数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行:任务统计
Tasks: 91 total, 1 running, 89 sleeping, 1 stopped, 0 zombie
分别对应显示:当前任务总数,前正在运行的任务数,当前正在休眠的任务数,当前已经停止的任务数,僵尸进程数
91 total | 当前任务(进程)总数 |
1 running | 当前正在运行的任务(进程)数 |
89 sleeping | 当前正在休眠的任务(进程)数 |
1 stopped | 当前已经停止的任务(进程)数 |
0 zombie | 当前僵尸任务(进程)数 |
第三行:CPU状态
Cpu(s): 40.3%us, 0.3%sy, 0.0%ni, 59.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
分别对应显示:
40.3%us | 用户空间占用CPU百分比 |
0.3%sy | 内核空间占用CPU百分比 |
0.0%ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
59.4%id | 空闲CPU百分比 |
0.0%wa | 等待输入输出的CPU时间百分比 |
0.0%hi | Hardware IRQ 硬中断 占用CPU的百分比 |
0.0%si | Software 软中断 占用CPU的百分比 |
0.0%st | 被 hypervisor 偷去的时间(虚拟机占用时间比例) |
第四行:内存状态
Mem: 2045940k total, 2027396k used, 18544k free, 87148k buffers
分别对应显示:物理内存总量 2G,使用中的内存总量 2G,空闲内存总量 18M,缓冲内存量 85M
2045940k total | 物理内存总量 |
2027396k used | 使用的物理内存总量 |
18544k free | 空闲内存总量 |
87148k buffers | 用作内核缓存的内存量 |
注:使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到 free 中去,因此在 linux 上 free 内存会越来越少,但不用为此担心。
第五行:交换分区状态
Swap: 1048572k total, 7472k used, 1041100k free, 110292k cached
分别对应显示:交换区总量 1G,使用的交换区总量 7M,空闲交换区总量 1G,缓冲的交换区总量 0.1G
1048572k total | 交换区总量 |
7472k used | 使用的交换区总量 |
1041100k free | 空闲交换区总量 |
110292k cached | 缓冲的交换区总量。 内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。 |
注:对于内存监控,在 top 里我们要时刻监控第五行 swap 交换分区的 used,如果这个数值在不断的变化,说明内核在不断进行内存和 swap 的数据交换,这是真正的内存不够用了。
第六行:空行
第七行:各进程的监控表头
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
对应表头信息如下:
PID | 进程唯一ID标识 |
USER | 启动此进程的用户 |
PR | 进程优先级 |
NI | 进程nice值(与PR相加为0,NI值越小进程优先级越高) |
VIRT | 进程使用的虚拟内存总量,单位kb |
RES | 进程使用的,未被换出的内存大小,单位kb |
SHR | 共享内存大小,单位kb |
S | 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程) |
%CPU | 进程占用CPU资源比例 |
%MEM | 进程占用内存大小比例 |
TIME+ | 进程占用系统内核时间,单位1/100秒 |
COMMAND | 进程名称(命令名/命令行) |
脱坑技巧
1)在使用 top 命令过程中,有时希望界面停止滚动来捕捉一些特定的进程信息,这时可以使用 ctrl+s 冻结屏幕,在得到我们需要的信息后按 ctrl+q 解除屏幕冻结。
2)监控 Java 线程数(如果不加后面的 wc -l 来只显示当前 Java 线程个数,会很容易被刷屏):
ps -eLf | grep java | wc -l
3)命令 pmap,输出某个进程内存的状况,可以用来分析线程堆栈:
pmap PID