Linux常用命令-top

top命令–动态实时显示Linux系统进程

top命令相当于Windows下的任务管理器,能够实时显示系统进程情况,查看系统负载等信息。

1
2
3
4
5
6
7
8
9
10
11
12
$ top
top - 16:22:05 up 44 days, 6:57, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 65 total, 1 running, 64 sleeping, 0 stopped, 0 zombie
%Cpu(s): 6.2 us, 0.0 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1016168 total, 171624 free, 133264 used, 711280 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 709152 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 125200 3372 2152 S 0.0 0.3 0:40.77 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.09 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:26.30 ksoftirqd/0
...

第一行信息–系统时间及负载(同uptime命令的执行结果)

1
2
3
4
5
6
top - 16:22:05 up 44 days,  6:57,  1 user,  load average: 0.00, 0.01, 0.05

16:22:05 //当前系统时间
up 44 days, 6:57 //系统运行时间,格式为日,时,分。这里表示已经运行了44天又6小时57分钟。
1 user //当前登录的用户数
load average: 0.00, 0.01, 0.05 //系统负载,分别表示最近1分钟,5分钟,15分钟的平均负载值。

系统负载:负载均值是基于内核的数量决定的,以100%负载计算
单核CPU,负载在0—1.00之间是正常的,超过1.00就是超负荷,理想值是0.7
多核CPU,负载值不应超过总核心数,CPU核心数 * 理想值0.7 = 理想负荷
例如一个双核CPU值为2.00则表示100%负载;4核CPU负载不超过2.8则表示没有出现高负荷(4*0.7=2.8)

在实际应用中,重点关注5分钟,15分钟的负载均值,当达到0.7时,就需要调查原因了。

第二行信息–系统进程数

1
2
3
Tasks:  65 total,   1 running,  64 sleeping,   0 stopped,   0 zombie

分别表示进程总数,正在运行的进程数,睡眠的进程数,已经停止的进程数,僵尸进程数

僵尸进程:表示已经终止,但仍然保留一些信息的进程
僵尸进程无法使用kill清理,如果要手动清理僵尸进程,需要找到其父进程,kill掉父进程后,init进程将接管该僵尸进程(linux中所有的子进程都需要有父进程,当父进程被kill后,其所有子进程将过继给init进程),init进程隔一段时间去调用wait(),来清除僵尸进程

第三行信息–CPU信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
%Cpu(s):  6.2 us,  0.0 sy,  0.0 ni, 93.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

# 按`1`键展开或合并,可查看多个(或多核)CPU信息
6.2 us //用户空间占用CPU的百分比
0.0 sy //内核空间占用CPU的百分比
0.0 ni //用户进程空间内改变过优先级的进程占用CPU的百分比
93.8 id //空闲CPU百分比
0.0 wa //IO等待占用CPU的百分比
0.0 hi //硬中断占用CPU的百分比
0.0 si //软中断占用CPU的百分比
0.0 st //虚拟服务hypervisor占用百分比

# man帮助中的解释
us, user : time running un-niced user processes
sy, system : time running kernel processes
ni, nice : time running niced user processes
id, idle : time spent in the kernel idle handler
wa, IO-wait : time waiting for I/O completion
hi : time spent servicing hardware interrupts
si : time spent servicing software interrupts
st : time stolen from this vm by the hypervisor

第四行信息–内存和swap交换分区

1
2
3
4
5
KiB Mem :  1016168 total,   171624 free,   133264 used,   711280 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 709152 avail Mem

Mem内存:分别表示物理内存总量,空闲内存,已使用的内存,缓冲区和缓存区占用的内存
Swap交换分区:分别表示交换分区大小,空闲交换分区,已使用的交换分区,可用的内存

buff/cache
buffers和cache都是内存中存放的数据,不同的是,buffers存放的是准备写入磁盘的数据,而cache存放的是从磁盘中读取的数据。在Linux系统中,守护进程(daemon)会定期把buffers中的数据写入的磁盘,也可以使用sync命令手动把buffers中的数据写入磁盘。使用buffers可以把分散的I/O操作集中起来,减少了磁盘寻道的时间和磁盘碎片。cache是Linux把读取频率高的数据,放到内存中以减少I/O,Linux中cache没有固定大小,根据使用情况自动增加或删除。

手动把buffers写入硬盘并清空cache

1
$ sync && echo 3 > /proc/sys/vm/drop_caches

Swap(内存交换区)
是硬盘上的一块空间。在内存不足的情况下,操作系统把内存中不用的数据存到硬盘的交换区,腾出内存来让别的程序运行。因此,开启swap会一定程度的引起 I/O 性能下降(阿里服务器默认不开)。

进程信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
PID USER  PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
1 root 20 0 125200 3372 2152 S 0.0 0.3 0:40.77 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.09 kthreadd

列名 含义
PID 进程id
PPID 父进程id
RUSER Real user name
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名。不是从终端启动的进程则显示为?
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级
P 最后使用的CPU,仅在多CPU环境下有意义
%CPU 上次更新到现在的CPU时间占用百分比
TIME 进程使用的CPU时间总计,单位秒
TIME+ 进程使用的CPU时间总计,单位1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
nFLT 页面错误次数
nDRT 最后一次写入到现在,被修改过的页面数。
S 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
COMMAND 进程名称(命令名/命令行)
WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
Flags 任务标志,参考sched.h

关于 VIRT/RES/SHR 的详解区别
VIRT:virtual memory usage
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

RES:resident memory usage 常驻内存
1、进程当前使用的内存大小,但不包括swap out
2、包含其他进程的共享
3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小

SHR:shared memory
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
3、计算某个进程所占的物理内存大小公式:RES – SHR
4、swap out后,它将会降下来

DATA
1、数据占用的内存。如果top没有显示,按f键可以显示出来
2、真正的该程序要求的数据空间,是真正在运行中要使用的

自定义显示列

在top命令中按f键可以查看显示的列信息,默认按%CPU排序。可以通过上下方向键选择,向右方向键选择移动列,移动到合适位置后通过向左方向键回车确定移动。
space空格键标记或取消选择列,按s键设置当前项为默认排序列,qEsc退出。

进程字段排序

b键高亮显示运行状态的进程,默认会显示top进程,y键关闭或打开高亮功能。
x键高亮显示排序列,默认%CPU,通过shift + >shift + <可以向右或向左改变排序列

灵活使用top

命令行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
常用参数:
-b:以批处理模式操作,可以把top输出的内容以可读的形式写入文件,如top -n 3 -b >> top.txt
-c:显示完整的命令行(COMMAND),想查看进程执行的具体位置时非常有用
-d:屏幕刷新间隔时间
-s:使用安全模式,即取消交互式命令
-S:指定累积模式
-i:不显示任何闲置或者僵死进程
-u<用户名>:指定用户名
-p<进程号>:指定进程
-n<次数>:指定循环显示的次数,到了次数自己退出

top -d 2 //每2秒刷新一次屏幕
top -c //显示进程的完整命令行参数(默认只有进程名)
top -p 12345 -p 6789 //每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显示该进程启动的命令行参数

交互式
执行top命令,显示系统状态界面(同时也是交互界面),输入交互命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1:切换显示多核CPU信息
h:帮助信息
k:终止一个进程
i:忽略闲置和僵死进程,只显示正在运行的进程
q:退出程序
r:重新安排一个进程的优先级别
S:切换到累计模式
s:设置刷新时间间隔(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s
l:切换显示平均负载和启动时间信息
m:切换显示内存信息
t:切换显示进程和CPU状态信息
c:切换显示命令名称和完整命令行
M:根据驻留内存大小进行排序
P:根据CPU使用百分比大小进行排序
T:根据时间/累计时间进行排序
W:将当前设置写入~/.toprc文件中,下次启动将自动调用toprc文件的设置

其他实用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 如何通过 shell 脚本监控 top 命令并抓取某几个进程的信息?
$ top -b -n 3 | grep -E "mysql | apache2" >> top.log

# 如何用top只监视某个进程的状态?用pstree -p取得进程PID, 然后再监控
$ pstree -p | grep apache2
$ top -p 2038,13734,13735

# 监控java线程数
$ ps -eLf | grep java | wc -l

# 监控网络客户连接数
$ netstat -n | grep tcp | grep 侦听端口 | wc -l

# 获取某进程中运行中的线程数量(PID指的是进程ID)
$ ls /proc/PID/task | wc -l

在linux中还有一个命令pmap,来输出进程内存的状况,可以用来分析线程堆栈pmap PID

htop–增强版的top

htop 命令以直观的格式来显示信息
官网地址:http://hisham.hm/htop/
htop界面

安装htop工具

Ubuntu:
$ apt-get install -y htop
Fedora:
$ dnf install htop
CentOS:
$ yum install -y htop

源码包安装

1
2
3
4
$ tar zxvf htop-xxx.tar.gz
$ cd htop-xxx
$ ./configure
$ make && make install

若出现错误:
configure: error: You may want to use --disable-unicode or install libncursesw.
则需安装ncurses-devel组件和dev开发包组

1
$ yum install ncurses-devel

RHEL/CentOS安装
需要安装epel源

1
2
3
$ rpm -ivh http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm 
$ rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL //导入key
$ yum install -y htop

htop快捷键

F1键显示帮助信息
F2S键编辑配置,可以自定义配置选项
F3/键搜索进程,搜索框在页面底部,如果匹配则会高亮显示该进程
F4键进程过滤器,搜索关键字,不区分大小写
F5t键切换树状视图,查看进程树
F6<,>键打开排序菜单,选择按哪一列排序,默认按CPU使用率排序
F7键或[减少nice值,以提高对应进程的优先级
F8键或]增加nice值,以降低对应进程的优先级
F9k键发送信号,选择进程,选择信号,回车键确定发送信号到指定进程
F10q键退出htop

Space空格键标注或取消标记进程,高亮显示,快速定位指定进程。可以标记多个进程然后kill掉
U键取消标记所有进程
F键跟踪进程,即选定进程始终在屏幕上显示
l键显示选中进程所打开的文件列表
I键倒序排列
u键显示所有用户列表,选择显示指定用户进程
P按CPU%排序。M按MEM%排序。T按TIME排序

htop命令行选项

1
2
3
4
5
-C 使用单色显示
-d 设置刷新时间,单位秒。例如`htop -d 10`每10秒刷新一次
-u 显示指定用户的进程。例如`htop -u mysql`只显示用户名为mysql的相关进程
-p 显示指定的PID进程
-s 按指定列排序。例如`htop -s PID`按PID列的大小排序显示